O método update recebe dois parâmetros, um Long id e um ProductDTO, ele faz um try-catch e um validateData também.
Temos então, os seguintes cenários:
Update com id existente e data válida
@Test
public void updateShouldUpdateWhenIdExistsAndValidData() {
//fazendo o Spy do service novamente parar que possamos acessar a função
//validateData
ProductService serviceSpy = Mockito.spy(productService);
Mockito.doNothing().when(serviceSpy).validateData(productDTO);
//criando um DTO resultado, usando o Spy e o update
ProductDTO result = serviceSpy.update(existingId, productDTO);
//assertions
Assertions.assertNotNull(result);
Assertions.assertEquals(result.getId(), existingId);
}
Update com id existente e data invalida (nome em branco)
@Test
public void updateShouldReturnInvalidDataExceptionWhenIdExistsAndProductNameIsBlank() {
//settando inicialmente nome para nulo
productDTO.setName("");
//fazendo spy novamente
ProductService serviceSpy = Mockito.spy(productService);
//dessa vez doThrow, pois esperamos uma exception
Mockito.doThrow(InvalidDataException.class)
.when(serviceSpy).validateData(productDTO);
//assertion
Assertions.assertThrows(InvalidDataException.class, () -> serviceSpy.update(existingId, productDTO));
}
Update com id existente e data invalida (preço menor que zero)