我有一个 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运行测试时,有人可以建议我可以做些什么来获得预期的日期格式。谢谢。
好的,我从 stackoverflow 上的另一个线程得到了答案https://stackoverflow.com/a/35323312/5519519
所以基本上我需要创建一个实例MappingJackson2HttpMessageConverter
并将我的对象映射器设置到这个实例中。
然后在设置mockMvc的时候传递这个消息转换器。
MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter = new
MappingJackson2HttpMessageConverter();
mappingJackson2HttpMessageConverter.setObjectMapper(objectMapper);
mockMvc = MockMvcBuilders.standaloneSetup(tourApiController)
.setControllerAdvice(new GlobalExceptionHandler())
.setMessageConverters(mappingJackson2HttpMessageConverter)
.build();
这解决了问题。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句