1

I have the below test case with imports as

import org.springframework.http.MediaType;
import org.springframework.test.context.junit.jupiter.SpringExtension;
import org.springframework.test.web.servlet.MockMvc;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
import static org.assertj.core.internal.bytebuddy.matcher.ElementMatchers.is;
import static org.mockito.Mockito.doReturn;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
      @Test
            @DisplayName("Should return product based on the specified Id")
            void shouldReturnProductBasedOnTheSpecifiedId() throws Exception {
                String Id = java.util.UUID.randomUUID().toString();
                ProductViewModel productViewModel = new ProductViewModel(Id, "Product 1", 100, "Product 1 description", 0);
                doReturn(productViewModel).when(productService).findById(Id);
                mockMvc.perform(get(String.format("/api/v1/product/%s", Id)))
    
                        //Validate the response code and content type
                        .andExpect(status().isOk())
                        .andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE))
    
                        //validate the headers
                        .andExpect(header().string(HttpHeaders.ETAG, String.format("\"%s\"", Id)))
                        .andExpect(header().string(HttpHeaders.LOCATION, String.format("/%s", Id)))
    
                        //Validate the return fields
                        .andExpect(jsonPath("$.id", is(Id)));
                        //.andExpect((ResultMatcher) jsonPath("$.name", is("Product 1")))
                        //.andExpect((ResultMatcher) jsonPath("$.price", is(100)))
                        //.andExpect((ResultMatcher) jsonPath("$.description", is("Product 1 description")))
                        //.andExpect((ResultMatcher) jsonPath("$.version", is(0)));
    
            }

Getting an error as

enter image description here

If I cast the object I get an cast error message.

enter image description here

0

1 Answer 1

2

There are several ways to solve it:

Include individual Json properties comparison

import org.springframework.test.web.servlet.MockMvc;
import static org.springframework.http.MediaType.APPLICATION_JSON;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
import static org.hamcrest.core.Is.is;

mockMvc.perform(get(String.format("/api/v1/product/%s", Id))
       .andExpect(content().contentType(APPLICATION_JSON_VALUE))
       .andExpect(jsonPath("$.id", is(Id)));

The difference with your example is on "is import".


Deserialize Json response into a class and compare objects

This is a more generic and reusable approach.

  1. Use a Json deserialize method to convert that one into an object of a well-known class instance.
  2. Compare expected object with the received one in the test.

You can see a complete example of it in the following link, more specifically in the test:

static Stream<Arguments> findByIdWithOrderLines_validIdTestCases() {
  PizzaDto pizzaDto = new PizzaDto((short)1, "Carbonara", 7.50);
  OrderLineDto orderLineDto = new OrderLineDto(10, 1, pizzaDto, (short)2, 15D);
  OrderDto dto = new OrderDto(1, "Order 1", new Date(), asList(orderLineDto));
  return Stream.of(
      //@formatter:off
      //            serviceResult,   expectedResultHttpCode,   expectedBodyResult
      Arguments.of( empty(),         NOT_FOUND,                null ),
      Arguments.of( of(dto),         OK,                       dto )
  ); //@formatter:on
}

@ParameterizedTest
@SneakyThrows
@WithMockUser(authorities = {Constants.ROLE_ADMIN})
@MethodSource("findByIdWithOrderLines_validIdTestCases")
@DisplayName("findByIdWithOrderLines: when given Id verifies the validations then the suitable Http code is returned")
public void findByIdWithOrderLines_whenGivenIdVerifiesValidations_thenSuitableHttpCodeIsReturned(Optional<OrderDto> serviceResult,
                                      HttpStatus expectedResultHttpCode, OrderDto expectedBodyResult) {
    // Given
    Integer validOrderId = 1;

    // When
    when(mockOrderService.findByIdWithOrderLines(validOrderId)).thenReturn(serviceResult);

    ResultActions result = mockMvc.perform(get(RestRoutes.ORDER.ROOT + "/" + validOrderId + RestRoutes.ORDER.WITH_ORDERLINES));

    // Then
    result.andExpect(status().is(expectedResultHttpCode.value()));
    assertEquals(expectedBodyResult, fromJson(result.andReturn().getResponse().getContentAsString(), OrderDto.class));
    verify(mockOrderService, times(1)).findByIdWithOrderLines(validOrderId);
}
Sign up to request clarification or add additional context in comments.

1 Comment

Thank you it was a IS import issue

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.