当前位置: 首页 > 知识库问答 >
问题:

使用MockitoJUnitRunner运行单元测试时如何在JSON响应中指定日期格式

习海
2023-03-14

我有一个spring引导应用程序,它使用Swagger2.0生成API并从Swagger 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响应中的日期格式与从模拟头对象返回的serlized JSON不匹配。这就是日期在实际和预期响应中的显示方式。

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

当我使用SpringRunner时,相同的断言也起作用,即日期格式按照预期的方式出现,如下所示。

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

请您告诉我,当我使用MockitoJunitRunner运行测试时,可以做些什么来获得预期的日期格式。多谢了。

共有1个答案

弘浩博
2023-03-14

好的,我从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(); 

这就解决了问题。

 类似资料:
  • 问题内容: 默认输出格式为: 我无法弄清楚如何仅输出具有特定格式的日期部分: 或csv文件中两列中的日期和时间: 该文档太简短,无法给我任何有关如何执行这些操作的线索。有人可以帮忙吗? 问题答案: 您可以将它们保存为单独的列: 然后具体说明要导出到csv的列:

  • 问题内容: 我正在使用一个简单的基于单元测试的测试运行程序来测试我的Django应用程序。 我的应用程序本身配置为在settings.py中使用基本记录器,方法是: 在我的应用程序代码中使用: 但是,在运行单元测试时,我想禁用日志记录,以免混乱我的测试结果输出。有没有一种简单的方法可以以全局方式关闭日志记录,以便在运行测试时,特定于应用程序的记录器不会将内容写到控制台上? 问题答案: 将禁用所有级

  • 有没有办法在类上不使用@RunWith(MockitoJUnitRunner)注释来模拟存储库? 我有一个测试通过了,没有注释,但是失败了。没有它,我的回购测试就不起作用。这是第二十二条军规。 当我使用这个注释时,我的测试中的当()方法不再是存根行为,模拟什么也不做,尽管设置了断点,那些断点被击中(表明行/方法正在运行),验证(...,次(x))语句说模拟对象从未与该方法相互作用。我一直在想为什么

  • 我有以下测试: 这是好的,它可以运行,但是我想知道有没有一种方法可以将它作为单元测试而不是集成测试运行,并且仍然使用@mockbean@autowired。还是我错过了什么? 我试着只保留@ExtendWith(SpringExtension.class),但我得到一个关于找不到BookServiceImpl bean的异常。 我知道如何使用MockitoExtension和@mock、@inje

  • 问题内容: 我的程序包测试用例分散在多个文件中,如果运行,它将运行程序包中的所有测试用例。 虽然没有必要全部运行。有没有一种方法指定要运行的文件,使其仅运行文件中定义的测试用例? 问题答案: 有两种方法。一种简单的方法是使用该标志并提供与您要运行的测试名称匹配的模式。 例: 有关更多信息,请参阅文档。 另一种方法是命名包含您要运行的测试的特定文件: 但是有一个陷阱。如果满足以下条件,则效果很好:

  • 对于我系统中的一个单例类,我很难在类测试期间将析构函数报告为“覆盖”(代码覆盖分析部分)。我认为这是因为测试框架在我的静态单例实例之前就被破坏了,因此我试图通过稍后创建单例实例来改变破坏顺序——而不是在程序启动时。 我的公共getInstance方法现在看起来像这样: 构造函数像往常一样是私有的,但我没有经典的单例静态实例指针作为类成员。相反,我将实例存储为静态函数内部数据(如上所示),该数据是在