繁体   English   中英

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

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

我有一个包含两个测试的 Spring mock-mvc JUnit 测试类。 当我在 Eclipse IDE 中运行测试时,两个测试都通过了(我使用 Eclipse Maven 插件)。

从命令行运行测试时使用

mvn test

其中一项测试失败,因为 @Autowired 的 WebApplicationContext有时为空。

这是我的测试课

@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));
    }
}

这是 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;
        }

    }

}

我已经添加了 println 调用来帮助调试。 在这里运行 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

和错误

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)

所以这是测试中的问题行

@Autowired
private WebApplicationContext wac;  

有时 wac 为空或在 JUnit @Before 启动之前尚未完成初始化。

我不明白的是 WebApplicationContext 有时为 null 以及为什么它会在 Eclipse IDE 中传递!

您应该在测试类之前添加@SpringBootTest作为注释。 像这样:

@RunWith(SpringRunner.class)
@SpringBootTest

请使用@WebAppConfiguration 注解。 您的问题已在此处得到解答: WebApplicationContext 不会自动装配

尝试使用 getBean 而不是自动连接。 这应该确保WebApplicationContext在您访问它时被初始化。

例子:

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

暂无
暂无

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

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