是否可以使用maven使用junit 5运行spring引导测试?我使用spring 2.0.0.M3,junit 5.0.0-M6,maven 3.5.0。其他junit5测试(没有spring上下文)可以工作。
有一个简单的控制器:
@Controller
public class HomeController {
@GetMapping("/")
String home() {
return "home";
}
}和测试:
@ExtendWith(SpringExtension.class)
@WebMvcTest(HomeController.class)
@Import(SecurityConfig.class)
class HomeControllerTest {
@Autowired
private MockMvc mvc;
@Test
void shouldReturnHomeTemplate() throws Exception {
this.mvc.perform(get("/").accept(MediaType.TEXT_HTML))
.andExpect(status().isOk())
.andExpect(content().string(startsWith("<!DOCTYPE html>")));
}
}当我使用intellij运行它时,一切都正常,但是maven构建以失败结束:
警告分叉JVM 1中损坏的stdin流。参见转储文件somePath/target/surefire-reports/2017-07-28T13-50-15_071-jvmRun1.dumpstream。
-调试标志显示:
java.lang.OutOfMemoryError: Java堆空间
在2017-07-28T13-50-15_071-jvmRun1.dumpstream内部,我可以找到~100个相同的异常(每个春季日志一个):
在分叉JVM 1中损坏的stdin流‘13:50:15.914主要调试org.springframework.test.context.BootstrapUtils -从类org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate'.实例化CacheAwareContextLoaderDelegatejava.lang.IllegalArgumentException:流已损坏。命令‘13:50:15.914主调试org.springframework.test.context.BootstrapUtils中第三个字符后的预期逗号-从org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate'.类实例化CacheAwareContextLoaderDelegate在org.apache.maven.plugin.surefire.booterclient.output.ForkClient$OperationalData.(ForkClient.java:469) at org.apache.maven.plugin.surefire.booterclient.output.ForkClient.processLine(ForkClient.java:191) at org.apache.maven.plugin.surefire.booterclient.output.ForkClient.consumeLine(ForkClient.java:158) at org.apache.maven.plugin.surefire.booterclient.output.ThreadedStreamConsumer$Pumper.run(ThreadedStreamConsumer.java:87) at java.lang.Thread.run(Thread.java:745)
Maven尽是火插件:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.20</version>
<dependencies>
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-surefire-provider</artifactId>
<version>1.0.0-M6</version>
</dependency>
</dependencies>
</plugin>发布于 2017-08-08 17:27:39
IntelliJ捆绑JUnit5,因此IntelliJ和Maven可能使用不同的版本。
请参阅关于JUnit5 IntelliJ的文档
根据您正在运行的IntelliJ版本,它可能正在执行比maven使用的更早的JUnit5里程碑版本。
如果您在2017.2上,您可以尝试将pom.xml中的JUnit5依赖项切换回M4,看看这是否解决了不兼容性问题。
还可以尝试在junit-jupiter-engine:5.0.0-M4和junit-platform-surefire-plugin中指定插件依赖项中的junit-platform-surefire-plugin。
我正以这种方式成功地使用5.0.0-M5。
更新2017-08-10关于您的评论,我正在使用spring引导1.5.4.RELEASE,所以我不能做类似的比较。
您没有说明您使用的是哪个版本的IntelliJ --假设测试仍然在IntelliJ下工作,那么版本配置大概就是您的目标。查看maven项目视图或调试测试输出,以获得类路径,并查看正在使用的版本。
Spring可能正在为您管理许多版本。您是使用spring引导父pom,还是依赖于spring-boot-starter依赖项?
若要了解发生了什么以及哪个春季依赖项正在拉哪个JUnit5依赖项正在崩溃,请运行
mvn dependency:tree
并查看依赖项和版本列表,以确切地查看maven下的内容。
您可能会发现,您认为您指定的版本正在被覆盖,您必须在pom中添加排除以阻止这种情况。
更新2只是一个快速的更改-尝试将junit-jupiter-engine依赖项放在maven-surefire-plugin依赖项块的junit-platform-surefire-provider旁边
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.19.1</version>
<dependencies>
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-surefire-provider
</artifactId>
<version>1.0.0-M5</version>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>5.0.0-M5</version>
</dependency>
</dependencies>
</plugin>注意,我还没有上2.20版(我还在5.0.0-M5上)--抱歉,我这个星期也没有时间试一试。
您还可以看到是否将maven-surefire-plugin配置forkCount=0设置为查看是否为您提供了更好的异常消息。
您可以将项目缩减到最低限度,并使用Maven和弹簧试验打开Jira问题。我把你问题上的标签换成了spring-boot,这样他们的人就会注意到了。或者可能不会,这取决于你的运气--我发现如果你在推特上发推文将你的堆栈溢出网址发到@springboot,他们更有可能做出反应。
发布于 2019-11-05 11:08:49
这个问题是由maven-surefire-plugin和JUnit5 5的junit-vintage-engine之间的交互引起的,后者会在万无一失能够处理这个问题之前写到System.out。
它是在maven-surefire-plugin版本2.22.2:https://blogs.apache.org/maven/entry/apache-maven-surefire-plugin-version2中修正的
https://stackoverflow.com/questions/45372927
复制相似问题