首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用JUnit 5+方法的Spring 5返回null

使用JUnit 5+方法的Spring 5返回null
EN

Stack Overflow用户
提问于 2018-02-11 02:41:06
回答 1查看 5.6K关注 0票数 3

我尝试测试一个在loadData中定义的名为MainController的方法,它以字符串的形式返回结果。尽管当web应用程序在servlet容器上运行时(或者在调试代码时),此方法实际上返回数据,但当我从基于JUnit 5的带有Mockito的测试类调用数据时,没有数据返回。

这里是我的配置:

代码语言:javascript
复制
@ContextConfiguration(classes = {WebAppInitializer.class, AppConfig.class, WebConfig.class})
@Transactional
@WebAppConfiguration
public class TestMainController {

    @InjectMocks
    private MainController mainController;

    private MockMvc mockMvc;

    @BeforeEach
    public void init() {
        mockMvc = MockMvcBuilders.standaloneSetup(this.mainController).build();
    }

    @Test
    public void testLoadData() throws Exception {
        MvcResult mvcResult = mockMvc
                .perform(MockMvcRequestBuilders.get("/loadData.ajax"))
                .andExpect(MockMvcResultMatchers.status().isOk()).andReturn();

        Assertions.assertNotNull(mvcResult.getResponse().getContentAsString(), "response should not be null");
    }

}

由于java.lang.NullPointerException,测试失败,因为this.mainControllernull

环境详细信息:

代码语言:javascript
复制
Spring version: 5.0.3
JUnit version: 5.0.3
mockito version: 1.9.5
hamcrest version: 1.3
json-path-assert version: 2.2.0

编辑:这里是MainControllerloadData方法

代码语言:javascript
复制
@RequestMapping(value = "/loadData.ajax", method = RequestMethod.GET)
public String loadData(HttpServletRequest request, HttpServletResponse response) {
    List list = mainService.loadData(); // starts a transaction and invokes the loadData method of mainDAO repository which basically loads data from the database
    return JSONArray.fromObject(list).toString();
}
EN

回答 1

Stack Overflow用户

发布于 2018-02-11 18:10:23

您可以直接调用控制器方法,就像我们对服务方法所做的那样,但这是不建议的。使用MockMvc,您可以检查请求param映射是正确的。此外,您还检查端点映射是正确的。加上请求方法也是正确的。如果通过直接调用控制器方法来测试代码,则无法测试所有这些。

您可以尝试的一件事是,不要在独立的上下文中创建新对象,而是使用Mock。i.e

代码语言:javascript
复制
mockMvc = MockMvcBuilders.standaloneSetup(this. mainController).build();

一边打电话,一边做这个

代码语言:javascript
复制
MvcResult mvcResult = mockMvc
    .perform(MockMvcRequestBuilders.get("/loadData.ajax"))
    .andExpect(MockMvcResultMatchers.status().isOk()).andReturn();

断言,你想要的

代码语言:javascript
复制
Assert.assertEquals("response does not match", mvcResult.getResponse().getContentAsString(),
    "some expected response");

您是否获得null或400或404 http状态?

如果你得到400,那么请检查标题和req。如果有的话是合适的。如果您得到404,那么请检查URL路径。/loadData.ajax,假设这是控制器方法中的请求映射路径。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48727758

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档