使用MockitoJUnitRunner

时间:2018-07-26 11:30:19

标签: json unit-testing

我有一个Spring Boot应用程序,它使用Swagger 2.0从Swagger API定义生成API和模型对象。

我正在使用 MockitoJUnitRunner 运行一些单元测试。

API之一返回包含日期字段的对象。

    @JsonProperty("departureDate")
    private LocalDate departureDate = null;

我在尝试在单元测试中获取JSON响应中的预期日期格式时遇到一些问题。
我的测试看起来像这样。

    @RunWith(MockitoJUnitRunner.class)
    public class TourApiControllerStandaloneTest {
        //mock declarations
        ...
        private JacksonTester<TourHeader> jsonTourHeader;
        // controller under test
        private TourApiController tourApiController;
        private TourleaderMockData tourleaderMockData;
        ...
        @Before
        public void setup() {

            ObjectMapper objectMapper = new ObjectMapper();
            objectMapper.registerModule(new LocalDateModule()); //LocalDateModule formats the date in yyyy-mm-dd format

            tourApiController = new TourApiController(objectMapper, 
                            httpServletRequestMock, tourServiceMock);

            JacksonTester.initFields(this, objectMapper);

            mockMvc = MockMvcBuilders.standaloneSetup(tourApiController)
                        .setControllerAdvice(new GlobalExceptionHandler())
                        .build();

            tourleaderMockData = new TourleaderMockData();
        }

        @Test
        public void getTourHeaderWhenExists() throws Exception {
            ...
            // given 
            given(tourServiceMock.getTourHeader(tourNumber))
                .willReturn(tourleaderMockData.getMockTourHeaderRecord(tourNumber));

            // when
            MockHttpServletResponse response = mockMvc.perform(
                    get("/tour/" + tourNumber + "/header").accept(MediaType.ALL))
                    .andReturn().getResponse();

            // then
            assertThat(response.getStatus()).isEqualTo(HttpStatus.OK.value()); 
            //  *************** THIS ASSERTION IS FAILING ****************
            assertThat(response.getContentAsString()).isEqualTo(
jsonTourHeader.write(tourleaderMockData.getMockTourHeaderRecord(tourNumber)).getJson()
            );
        }
    }

API调用的JSON响应中返回的日期格式与模拟标头对象的序列化JSON不匹配。这就是日期在实际和预期响应中的显示方式。

 **实际**
{...,“ departureDate”: [2018,12,1] ,...}
 **预期的**
{...,“ departureDate”:“ 2018-12-01” ,...}

相同的断言有效,即当我按如下方式使用 SpringRunner 时,日期格式将按预期方式出现。

@RunWith(SpringRunner.class)
@WebMvcTest(TourApiController.class)

有人可以建议我使用 MockitoJUnitRunner 进行测试时如何获得期望的日期格式。谢谢。

1 个答案:

答案 0 :(得分:0)

好吧,我从stackoverflow上的另一个线程得到了答案 https://stackoverflow.com/a/35323312/5519519

所以基本上我需要创建一个MappingJackson2HttpMessageConverter的实例,并将我的对象映射器设置为该实例。

然后在设置嘲笑Mvc时传递此消息转换器。

MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter = new
                                MappingJackson2HttpMessageConverter();
        mappingJackson2HttpMessageConverter.setObjectMapper(objectMapper);

        mockMvc = MockMvcBuilders.standaloneSetup(tourApiController)
                    .setControllerAdvice(new GlobalExceptionHandler())
                    .setMessageConverters(mappingJackson2HttpMessageConverter)
                    .build(); 

这解决了问题。