Spring5与JUnit5+;Mockito-Controller方法返回null
我尝试测试在Spring5与JUnit5+;Mockito-Controller方法返回null,spring,spring-mvc,junit,mockito,junit5,Spring,Spring Mvc,Junit,Mockito,Junit5,我尝试测试在MainController中定义的名为loadData的方法,该方法将结果作为字符串返回。尽管此方法实际上在web应用程序在servlet容器上运行时(或在调试代码时)返回数据,但当我使用Mockito从基于JUnit 5的测试类调用它时,不会返回任何数据 这是我的配置: @ContextConfiguration(classes = {WebAppInitializer.class, AppConfig.class, WebConfig.class}) @Transactiona
MainController
中定义的名为loadData
的方法,该方法将结果作为字符串返回。尽管此方法实际上在web应用程序在servlet容器上运行时(或在调试代码时)返回数据,但当我使用Mockito
从基于JUnit 5
的测试类调用它时,不会返回任何数据
这是我的配置:
@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");
}
}
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
由于java.lang.NullPointerException
而导致测试失败,因为this.mainController
为null
环境详细信息:
@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");
}
}
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();
}
您可以直接调用控制器方法,就像我们对服务方法所做的一样,但不建议这样做。使用MockMvc,检查头和请求参数映射是否正确。此外,还可以检查端点映射是否正确。另外,请求方法也正确。如果通过直接调用控制器方法来测试代码,则无法测试所有这些 您可以尝试的一件事是,不要在独立上下文中创建新对象,而是使用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,那么请检查标题和请求。参数(如果有)是正确的。如果您得到404,请检查URL路径/loadData.ajax,假设这是控制器方法中的请求映射路径。您不直接使用MockHttp调用控制器的方法。您模拟了URL的使用:假设我要测试的URL是
loadData.ajax
。你能指导我设置测试环境吗?通过您共享的指南尝试了以下内容,但没有成功:mockMvc.perform(get(“/loadData.ajax”)代码>添加您的main控制器
。测试中奇怪的是,您既有web配置又有常规配置,难道不应该只有一个吗?@M.DeinumAppConfig
用于创建会话工厂
和事务管理器
beanWebConfig
实现WebMVCConfiguer
并定义所有其他必需的bean,包括查看转轮枪
、拦截器
、任务
等。在同一测试类上不能声明@SpringJUnitConfig
。Spring将只尊重其中一个,即它找到的第一个。获取NullPointerException
作为此。初始化mockMvc
时,在行中发现mainController
为null。请在类级别添加@RunWith(MockitoJUnitRunner.class)。像这样的@RunWith(MockitoJUnitRunner.class)公共类TestMainController{那么变量mainController将被初始化,找不到RunWith
类,它是JUnit4
.import org.JUnit.runner.RunWith的一部分;我在JUnit:4.12版本和build.gradle testCompile(“JUnit:JUnit:4.12”)中看到了这一点类路径上的JUnit 4和JUnit 5听起来都不太好,因为注释是在不同的包上定义的。获取异常在TestMainController中找不到测试难道你没有忘记@Test annotation吗?