Testando update

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)

  @Test
    public void updateShouldReturnInvalidDataExceptionWhenIdExistsAndProductPriceIsNullOrLessThanZero() {
        productDTO.setPrice(-5.0);
        ProductService serviceSpy = Mockito.spy(productService);
        Mockito.doThrow(InvalidDataException.class)
                .when(serviceSpy).validateData(productDTO);

        Assertions.assertThrows(InvalidDataException.class, () -> serviceSpy.update(existingId, productDTO));
    }

Update com id inexistente e data valida

@Test
    public void updateShouldReturnResourceNotFoundExceptionWhenIdDoesNotExistAndValidData() {

        ProductService serviceSpy = Mockito.spy(productService);
        Mockito.doNothing().when(serviceSpy).validateData(productDTO);

        Assertions.assertThrows(ResourceNotFoundException.class, () -> serviceSpy.update(nonExistingId, productDTO));
    }

Update com id inexistente e data invalida (nome em branco)

 @Test
    public void updateShouldReturnInvalidDataExceptionWhenIdDoesNotExistAndProductNameIsBlank() {
        productDTO.setName("");
        ProductService serviceSpy = Mockito.spy(productService);

        Mockito.doThrow(InvalidDataException.class)
                .when(serviceSpy).validateData(productDTO);

        Assertions.assertThrows(InvalidDataException.class, () -> serviceSpy.update(nonExistingId, productDTO));
    }

Update com id inexistente e data invalida (preço menor que zero)

  @Test
    public void updateShouldReturnInvalidDataExceptionWhenIdDoesNotExistAndProductPriceIsNullOrLessThanZero() {
        productDTO.setPrice(-5.0);
        ProductService serviceSpy = Mockito.spy(productService);

        Mockito.doThrow(InvalidDataException.class)
                .when(serviceSpy).validateData(productDTO);

        Assertions.assertThrows(InvalidDataException.class, () -> serviceSpy.update(nonExistingId, productDTO));
    }

Atualizado