No método insert do ProductService, na primeira linha ele já tem o método validateData, passando o DTO. Portanto, já temos um teste de insert com dois cenários, com data válida e inválida.
Data inválida seria: nome vazio, preço nulo ou menor que zero.
Masss, temos um problema. O método validateData está dentro do ProductService, e como ele é protected só pode ser usado por quem está dentro do pacote. Como fazer para simular o seu comportamento? Nós usaremos o Spy, veja abaixo:
InsertWithValidData
@Test
public void InsertShouldReturnProductDTOWhenValidData() {
//criando uma variável do tipo ProductService com o Spy,
// espionando o service lá de cima com @InjectMocks
ProductService serviceSpy = Mockito.spy(productService);
//é um doNothing porque nesse caso, é um caso de sucesso
Mockito.doNothing().when(serviceSpy).validateData(productDTO);
//instanciando o resultando, fazendo a ação
ProductDTO result = serviceSpy.insert(productDTO);
//verificações
Assertions.assertNotNull(result);
Assertions.assertEquals(result.getName(), "Playstation");
}
InsertWithInvalidData (name e price)
Name
@Test
public void inserShouldReturnInvalidDataExceptionWhenNameIsEmpty() {
//settando nome nulo
productDTO.setName("");
//fazendo o Spy novamente
ProductService serviceSpy = Mockito.spy(productService);
//dessa vez com doThrow, pois esperamos uma exception
Mockito.doThrow(InvalidDataException.class)
.when(serviceSpy).validateData(productDTO);
//verificando
Assertions.assertThrows(InvalidDataException.class, () -> serviceSpy.insert(productDTO));
}