简体   繁体   English

使用 Maven 运行 JUnit 测试时,Spring MockMvc WebApplicationContext 为 null

[英]Spring MockMvc WebApplicationContext is null when running JUnit Tests with Maven

I have a Spring mock-mvc JUnit test class that contains two tests.我有一个包含两个测试的 Spring mock-mvc JUnit 测试类。 When I run the tests within Eclipse IDE both tests pass (I use Eclipse Maven plugin).当我在 Eclipse IDE 中运行测试时,两个测试都通过了(我使用 Eclipse Maven 插件)。

When running the tests from the command line using从命令行运行测试时使用

mvn test

one of the tests fails because the WebApplicationContext that is @Autowired is sometimes null.其中一项测试失败,因为 @Autowired 的 WebApplicationContext有时为空。

Here is my test class这是我的测试课

@WebAppConfiguration
@ActiveProfiles({ "dev", "test" })
public class AddLinkEndpointMvcTest extends BaseMvc {

    @Autowired
    private WebApplicationContext wac;

    private MockMvc mockMvc;

    @Before
    public void before() {
        System.out.println("WAC = " + wac);
        mockMvc = MockMvcBuilders.webAppContextSetup(wac).build();
    }

    @Test
    public void addLinkDoesNotSupportGet() throws Exception {
        mockMvc.perform(get("/myurl")).andExpect(status().is(HttpStatus.SC_METHOD_NOT_ALLOWED));
    }

    @Test
    public void addLinkBadRequestNoLinkAddress() throws Exception {
        mockMvc.perform(post("/myurl")).andExpect(status().is(HttpStatus.SC_BAD_REQUEST));
    }
}

Here is the BaseMvc class这是 BaseMvc 类

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
public class BaseMvc {

    @Configuration
    @ComponentScan(basePackages = { "com.example.a", "com.example.b" })
    @Profile("test")
    public static class TestConfig {

        static {
            System.out.println("TEST CONFIG");
        }

        // ...some beans defined here

        @Bean
        public static PropertySourcesPlaceholderConfigurer properties() {
            PropertySourcesPlaceholderConfigurer configurer = new PropertySourcesPlaceholderConfigurer();
            configurer.setIgnoreUnresolvablePlaceholders(false);
            configurer.setLocations(new Resource[] { new ClassPathResource("sample-webapp.properties"),
                new ClassPathResource("sample-domain.properties") });
            return configurer;
        }

    }

}

I have added the println calls to aide debugging.我已经添加了 println 调用来帮助调试。 When running mvn test here is the relevant console output:在这里运行 mvn test 是相关的控制台输出:

WAC = null
WAC = org.springframework.web.context.support.GenericWebApplicationContext@38795184: startup date [Thu Sep 19 16:24:22 BST 2013]; root of context hierarchy

and the error和错误

java.lang.IllegalArgumentException: WebApplicationContext is required
        at org.springframework.util.Assert.notNull(Assert.java:112)
        at org.springframework.test.web.servlet.setup.DefaultMockMvcBuilder.<init>(DefaultMockMvcBuilder.java:66)
        at org.springframework.test.web.servlet.setup.MockMvcBuilders.webAppContextSetup(MockMvcBuilders.java:46)
        at com.mypackage.AddLinkEndpointMvcTest.before(AddLinkEndpointMvcTest.java:31)

So this is the problem line in the test所以这是测试中的问题行

@Autowired
private WebApplicationContext wac;  

Sometimes wac is null or has not completed initialisation before the JUnit @Before kicks in.有时 wac 为空或在 JUnit @Before 启动之前尚未完成初始化。

What I don't understand is the WebApplicationContext is sometimes null and why it passes in Eclipse IDE!我不明白的是 WebApplicationContext 有时为 null 以及为什么它会在 Eclipse IDE 中传递!

you should add @SpringBootTest as an annotation before your test class.您应该在测试类之前添加@SpringBootTest作为注释。 Like this:像这样:

@RunWith(SpringRunner.class)
@SpringBootTest

Please use @WebAppConfiguration annotation.请使用@WebAppConfiguration 注解。 Your question is already answered here : WebApplicationContext doesn't autowire您的问题已在此处得到解答: WebApplicationContext 不会自动装配

Try using getBean instead of auto wiring.尝试使用 getBean 而不是自动连接。 This should assure that WebApplicationContext is initialized when you access it.这应该确保WebApplicationContext在您访问它时被初始化。

Example:例子:

MyClass myClass = applicationContext.getBean("myClass");

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM