Java WebApplicationContext没有';自动线

Java WebApplicationContext没有';自动线,java,spring,testing,spring-mvc,Java,Spring,Testing,Spring Mvc,我编写了这个测试类: @ContextConfiguration(locations = { "classpath:/test/BeanConfig.xml" }) public class CandidateControllerTest { @Mock(name = "candidateService") private CandidateService candidateService; @InjectMocks priva

我编写了这个测试类:

@ContextConfiguration(locations = { "classpath:/test/BeanConfig.xml" })
public class CandidateControllerTest {

        @Mock(name = "candidateService")
        private CandidateService candidateService;

        @InjectMocks
        private CandidateMenuController candidateMenuController = new CandidateMenuController();


        @Autowired
        WebApplicationContext wac;

        MockMvc mockMvc;


        @Before
        public void before() {



            mockMvc = MockMvcBuilders.webApplicationContextSetup(wac).build();
         }
    }
但是:

代码执行后,我看到下一个跟踪:

java.lang.IllegalArgumentException: WebApplicationContext is required
    at org.springframework.util.Assert.notNull(Assert.java:112)
    at org.springframework.test.web.server.setup.InitializedContextMockMvcBuilder.<init>(InitializedContextMockMvcBuilder.java:39)
    at org.springframework.test.web.server.setup.MockMvcBuilders.webApplicationContextSetup(MockMvcBuilders.java:73)
    at controllers.CandidateControllerTest.before(CandidateControllerTest.java:52)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:27)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:76)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:236)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
跟踪:

java.lang.IllegalArgumentException: WebApplicationContext is required
    at org.springframework.util.Assert.notNull(Assert.java:112)
    at org.springframework.test.web.server.setup.InitializedContextMockMvcBuilder.<init>(InitializedContextMockMvcBuilder.java:39)
    at org.springframework.test.web.server.setup.MockMvcBuilders.webApplicationContextSetup(MockMvcBuilders.java:73)
    at controllers.CandidateControllerTest.before(CandidateControllerTest.java:61)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:27)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:76)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:236)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
java.lang.IllegalArgumentException:需要WebApplicationContext
位于org.springframework.util.Assert.notNull(Assert.java:112)
位于org.springframework.test.web.server.setup.InitializedContextMockMvcBuilder。(InitializedContextMockMvcBuilder.java:39)
位于org.springframework.test.web.server.setup.MockMvcBuilders.webApplicationContextSetup(MockMvcBuilders.java:73)
CandidateControllerTest.before(CandidateControllerTest.java:61)
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
位于sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)中
位于java.lang.reflect.Method.invoke(Method.java:597)
位于org.junit.runners.model.FrameworkMethod$1.runReflectVeCall(FrameworkMethod.java:44)
位于org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
位于org.junit.runners.model.FrameworkMethod.invokeeexplosive(FrameworkMethod.java:41)
位于org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:27)
位于org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:76)
位于org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
位于org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)
位于org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)
位于org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)
访问org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)
位于org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)
位于org.junit.runners.ParentRunner.run(ParentRunner.java:236)
位于org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
位于org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
位于org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
位于org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
位于org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
位于org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)

没有
WebApplicationContext
只有
ApplicationContext
,除非您将
@WebAppConfiguration
添加到测试类中

@ContextConfiguration(locations = { "classpath:/test/BeanConfig.xml" })
@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
public class CandidateControllerTest { ... }
除了
@RunWith
注释之外,您还可以扩展其中一个类

@ContextConfiguration(locations = { "classpath:/test/BeanConfig.xml" })
@WebAppConfiguration
public class CandidateControllerTest extends AbstractJUnit4SpringContextTests { ... }
链接

  • WebAppConfiguration

  • 我在使用TestNG和Mockito时遇到了同样的问题

    事实证明wac不是自动连接的,在
    @BeforeTest
    方法中可用,但在
    @Test
    方法中可用

    我移动了这个

    mockMvc = MockMvcBuilders.webApplicationContextSetup(wac).build();
    
    对于
    @Test
    方法和presto,它是有效的

    以下是我找到的解决方案链接:
    为您的设置添加以下注释

    @BeforeClass(dependsOnMethods={"springTestContextPrepareTestInstance"})
    

    Romera认为,WebApplicationContext是必需的,
    NullPointerException
    是我作为TestNG和Spring测试框架的初学者面临的最容易混淆的错误。这些都是由于一些简单的错误造成的,比如忘记`扩展AbstractTestNGSpringContextTests1等等。为了避免这些错误,我将提供我使用的代码模板

    @Test
    @WebAppConfiguration
    @ContextConfiguration(classes = WebConfig.class) //You can use your xml too
    public class YourControllerTest extends AbstractTestNGSpringContextTests {
        @Autowired
        private WebApplicationContext wac;
    
        private MockMvc mockMvc;
    
    
        @Test
        public void getEmailVerificationTest() throws Exception {
            this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).build();
    
            this.mockMvc.perform(get("/home")
                    .accept(MediaType.ALL))
                    .andExpect(status().isOk())
                    .andExpect(view().name("home/index"));
        }
    }
    
    这是测试主页的示例代码。如果您是初学者,会出现如上所述的错误,请首先检查
    是否扩展AbstractTestNGSpringContextTests
    this.mockMvc=MockMvcBuilders.webAppContextSetup(this.wac).build()位于正确的位置

    另一件事是,您可以使用@BeforeMethod注释停止重复
    this.mockMvc=MockMvcBuilders.webAppContextSetup(this.wac.build()在每个模块中。您应该像下面这样添加
    @beforethod

        @BeforeMethod
        public void setWac(){
            this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).build();
        }
    
    试着这样做

    import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
    import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
    import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
    import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
    
    import org.junit.Before;
    import org.junit.Test;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.test.web.servlet.MockMvc;
    import org.springframework.test.web.servlet.setup.MockMvcBuilders;
    import org.springframework.web.context.WebApplicationContext;
    
    import com.javainuse.test.SpringBootHelloWorldTests;
    
    public class TestControllerTest extends SpringBootHelloWorldTests {
    
        @Autowired
        private WebApplicationContext webApplicationContext;
    
        private MockMvc mockMvc;
    
        @Before
        public void setup() {
            mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();
        }
    
        @Test
        public void testEmployee() throws Exception {
            mockMvc.perform(get("/employee")).andExpect(status().isOk())
                    .andExpect(content().contentType("application/json;charset=UTF-8"))
                    .andExpect(jsonPath("$.name").value("emp1")).andExpect(jsonPath("$.designation").value("manager"))
                    .andExpect(jsonPath("$.empId").value("1")).andExpect(jsonPath("$.salary").value(3000));
    
        }
    
    }
    
    SpringBootHelloWorldTests如下所示

    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.boot.test.context.SpringBootTest;
    import org.springframework.test.context.junit4.SpringRunner;
    
    import com.javainuse.SpringBootHelloWorldApplication;
    
    
    @RunWith(SpringRunner.class)
    @SpringBootTest(classes=SpringBootHelloWorldApplication.class)
    public class SpringBootHelloWorldTests {
    
        @Test
        public void contextLoads() {
        }
    
    }
    
    这是SpringBootHelloWorld应用程序

    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    @SpringBootApplication
    public class SpringBootHelloWorldApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(SpringBootHelloWorldApplication.class, args);
        }
    }
    

    对我来说,问题在于没有以下maven依赖项:

        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>javax.inject</groupId>
            <artifactId>javax.inject</artifactId>
            <version>1</version>
            <scope>test</scope>
        </dependency>
    

    对我来说,当我添加RunWith注释时,这个问题得到了解决。请参阅下文:

    @RunWith(SpringRunner.class)
    @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.MOCK,classes = {SampleConfig.class})
    public class SampleTest {
    

    更多信息您似乎缺乏对Spring和测试的基本理解。添加@RunWith注释或扩展一个spring基类。(见修改后的答案)。参考指南(我已经在答案中添加了链接)中也解释了这一点。问题不是关于Spring Boot,而是没有Spring Boot的Spring。用Spring Boot的测试方式回答这个问题是没有帮助的。
    @Inject
    protected WebApplicationContext webApplicationContext;
    protected MockMvc mockMvc;
    
    @Before
    public void before() {
        this.mockMvc = webAppContextSetup(this.wac).build();
    }
    
    @RunWith(SpringRunner.class)
    @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.MOCK,classes = {SampleConfig.class})
    public class SampleTest {