Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring5与JUnit5+;Mockito-Controller方法返回null_Spring_Spring Mvc_Junit_Mockito_Junit5 - Fatal编程技术网

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.Deinum
AppConfig
用于创建
会话工厂
事务管理器
bean
WebConfig
实现
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吗?