gpt4 book ai didi

java - 使用 Maven 运行 JUnit 测试时,Spring MockMvc WebApplicationContext 为空

转载 作者:搜寻专家 更新时间:2023-10-31 08:04:42 24 4
gpt4 key购买 nike

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

使用命令行运行测试时

mvn test

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

这是我的测试类

@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 为 null 或在 JUnit @Before 启动之前尚未完成初始化。

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

最佳答案

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

@RunWith(SpringRunner.class)
@SpringBootTest

关于java - 使用 Maven 运行 JUnit 测试时,Spring MockMvc WebApplicationContext 为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18899152/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com