update

ID existente:

Atente-se ao código, criamos um ProductDto e alocamos ele no JSON (usando ObjectMapper), pegamos o nome esperado + uma descrição esperada para testar no final (assertion).

@Test
public void updateShouldReturnProductDtoWhenIdExists() throws Exception {
    ProductDTO dto = Factory.createProductDTO();
    String jsonBody = objectMapper.writeValueAsString(dto);

    //salvamos o nome e descrição do DTO acima antes de salvá-lo no banco
    //e testamos no Expect ali embaixo para ver se após o PUT, o nome vai ficar igual
    String expectedName = dto.getName();
    String expectedDescription = dto.getDescription();

    ResultActions result =
            mockMvc.perform(put("/products/{id}", existingId)
                    .content(jsonBody)
                    .contentType(MediaType.APPLICATION_JSON)
                    .accept(MediaType.APPLICATION_JSON));

    result.andExpect(status().isOk());
    result.andExpect(jsonPath("$.id").value(existingId));
    result.andExpect(jsonPath("$.name").value(expectedName));
    result.andExpect(jsonPath("$.description").value(expectedDescription));
}

ID não existente:

@Test
public void updateShouldReturnNotFoundWhenIdDoesNotExists() throws Exception {
    ProductDTO dto = Factory.createProductDTO();
    String jsonBody = objectMapper.writeValueAsString(dto);

    ResultActions result =
            mockMvc.perform(put("/products/{id}", nonExistingId)
                    .content(jsonBody)
                    .contentType(MediaType.APPLICATION_JSON)
                    .accept(MediaType.APPLICATION_JSON));

    result.andExpect(status().isNotFound());
}

Atualizado