我有一个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 进行测试时如何获得期望的日期格式。谢谢。
答案 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();
这解决了问题。