我尝试测试一个在loadData中定义的名为MainController的方法,它以字符串的形式返回结果。尽管当web应用程序在servlet容器上运行时(或者在调试代码时),此方法实际上返回数据,但当我从基于JUnit 5的带有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");
}
}由于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编辑:这里是MainController的loadData方法
@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();
}发布于 2018-02-11 18:10:23
您可以直接调用控制器方法,就像我们对服务方法所做的那样,但这是不建议的。使用MockMvc,您可以检查头和请求param映射是正确的。此外,您还检查端点映射是正确的。加上请求方法也是正确的。如果通过直接调用控制器方法来测试代码,则无法测试所有这些。
您可以尝试的一件事是,不要在独立的上下文中创建新对象,而是使用Mock。i.e
mockMvc = MockMvcBuilders.standaloneSetup(this. mainController).build();一边打电话,一边做这个
MvcResult mvcResult = mockMvc
.perform(MockMvcRequestBuilders.get("/loadData.ajax"))
.andExpect(MockMvcResultMatchers.status().isOk()).andReturn();断言,你想要的
Assert.assertEquals("response does not match", mvcResult.getResponse().getContentAsString(),
"some expected response");您是否获得null或400或404 http状态?
如果你得到400,那么请检查标题和req。如果有的话是合适的。如果您得到404,那么请检查URL路径。/loadData.ajax,假设这是控制器方法中的请求映射路径。
https://stackoverflow.com/questions/48727758
复制相似问题