Spring 5 与 JUnit 5 + Mockito - 控制器方法返回 null

tal*_*a06 3 junit spring spring-mvc mockito junit5

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

这是我的配置:

@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");
    }

}
Run Code Online (Sandbox Code Playgroud)

java.lang.NullPointerException由于原样,this.mainController测试失败null

环境详情:

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
Run Code Online (Sandbox Code Playgroud)

编辑:这是loadData方法MainController

@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();
}
Run Code Online (Sandbox Code Playgroud)

lra*_*hod 5

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

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

mockMvc = MockMvcBuilders.standaloneSetup(this. mainController).build();
Run Code Online (Sandbox Code Playgroud)

打电话时,执行以下操作

MvcResult mvcResult = mockMvc
    .perform(MockMvcRequestBuilders.get("/loadData.ajax"))
    .andExpect(MockMvcResultMatchers.status().isOk()).andReturn();
Run Code Online (Sandbox Code Playgroud)

断言,你想要什么

Assert.assertEquals("response does not match", mvcResult.getResponse().getContentAsString(),
    "some expected response");
Run Code Online (Sandbox Code Playgroud)

您收到 null 或 400 或 404 http 状态?

如果您收到 400,请检查标头和请求。参数(如果有)正确。如果您收到 404,请检查 URL 路径。/loadData.ajax ,假设这是控制器方法中的请求映射路径。