Soy nuevo en pruebas unitarias y uso JUnit en mi aplicación Java (Spring Boot). A veces necesito probar métodos de actualización, pero cuando busco en la web, no hay un ejemplo o sugerencia adecuada. Entonces, ¿podría aclararme cómo probar el siguiente método de actualización? Creo que esto puede requerir un enfoque diferente al de la prueba de vacío. También pensé que mientras probaba primero se burlaba del registro y luego actualizaba su campo y luego actualizaba. Finalmente recupere el registro nuevamente y compare las propiedades actualizadas. Pero creo que puede haber un enfoque más adecuado que este sin experiencia.
public PriceDTO update(UUID priceUuid, PriceRequest request) { Price price = priceRepository .findByUuid(priceUuid) .orElseThrow(() -> new EntityNotFoundException(PRICE)); mapRequestToEntity(request, price); Price updated = priceRepository.saveAndFlush(price); return new PriceDTO(updated); } private void mapRequestToEntity(PriceRequest request, Price entity) { entity.setPriceAmount(request.getPriceAmount()); // set other props }Debe simular el comportamiento del objeto de clase priceRepository . Así que tendrás que escribir algo como lo siguiente para comenzar:
// priceRepository should be mocked in the test class Mockito.when(priceRepository.findByUuid(any(UUID.class))).thenReturn(new Price());Tendrías que hacer algo como lo siguiente:
public class ServiceTest { @Mock private PriceRepository priceRepository; (...) @Test public void shouldUpdatePrice() throws Exception { // Arrange UUID priceUuid = // build the Price UUID PriceRequest priceUpdateRequest = // build the Price update request Price originalPrice = // build the original Price doReturn(originalPrice).when(this.priceRepository).findByUuid(isA(UUID.class)); doAnswer(AdditionalAnswers.returnsFirstArg()).when(this.priceRepository).saveAndFlush(isA(Price.class)); // Act PriceDTO updatedPrice = this.service.update(priceUuid, priceUpdateRequest); // Assert // here you need to assert that updatedPrice is as you expect according to originalPrice and priceUpdateRequest } }Entonces, si su única intención es verificar si llamó a guardar, entonces algo como esto es probablemente lo que está buscando:
@ExtendWith(MockitoExtension.class) public class ServiceTest { @Mock private PriceRepository priceRepository; @InjectMocks private Service service; @Test public void update() throws Exception { // Given Price price = new Price(); price.setUid(UUID.randomUUID()); price.setPriceAmount(100); when(priceRepository.findByUid(price.getUid())) .thenReturn(price); ArgumentCaptor<Price> priceArgument = ArgumentCaptor.forClass(Price.class); when(incidentRepository.saveAndFlush(priceArgument.capture())) .thenAnswer(iom -> iom.getArgument(0)); // When PriceRequest priceRequest = new PriceRequest(); priceRequest.setPriceAmount(123); PriceDTO updatedPrice = this.service.update(price.getUid(), priceUpdateRequest); // Then assertThat(priceArgument.getValue().getPriceAmount()) .isEqualTo(123); } }