Prueba Unitaria: No se puede obtener el valor del Servicio en Java.
Estoy tratando de probar el siguiente método que obtiene datos del servicio Price
.
CountryServiceImpl:
public PriceDTO findBCountryUuid(UUID countryUuid) {
// código omitido
// !!! el valor de currency es nulo
Currency currency = currencyService.getCurrencyByCountry(countryUuid);
return new PriceDTO(currency);
}
Aquí está el servicio PriceService
.
PriceServiceImpl:
@Override
public Currency getCurrencyByCountry(UUID countryUuid) {
return countryRepository.findByUuid(countryUuid)
.orElseThrow(() -> new EntityNotFoundException("Country"))
.getCurrency();
}
Utilizo el siguiente enfoque para probar:
@Mock
private CountryRepository countryRepository;
@Mock
private CurrencyServiceImpl currencyService;
@InjectMocks
private CountryServiceImpl priceService;
@Test
public void test_findBCountryUuid() {
// código omitido
final Country country = new Country();
country.setName("Country");
country.setCurrency(currency);
when(countryRepository.findByUuid(countryUuid))
.thenReturn(Optional.of(country));
PriceDTO result = priceService.findBCountryUuid(countryUuid);
//... aserciones
}
El problema es que en el método findBCountryUuid
, el valor de currency
es nulo, y por esta razón obtengo un valor de precio nulo en el parámetro result
de mi método de prueba. El problema está completamente relacionado con el uso incorrecto de burlar o annotar el PriceService
. Creo que debería burlar el repositorio que utiliza el PriceService
en lugar de burlar el PriceService
. ¿Qué hay de malo en esta implementación?
davy.ai
El problema con esta implementación es que estás simulando
CurrencyServiceImpl
en lugar dePriceServiceImpl
. El métodofindBCountryUuid
utilizacurrencyService.getCurrencyByCountry
, que es un método dePriceServiceImpl
. Por lo tanto, en tu prueba debes simularPriceServiceImpl
en lugar deCurrencyServiceImpl
y asegurarte de que el métodogetCurrencyByCountry
devuelva un objeto Currency con un valor no nulo.