是否可以使用maven运行junit 5的spring boot测试?
我使用的是spring boot 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 build以失败结束:
[WARNING] Corrupted stdin stream in forked JVM 1. See the dump file
somePath/target/surefire-reports/2017-07-28T13-50-15_071-jvmRun1.dumpstream
–debug flag显示:
java.lang.OutOfMemoryError: Java heap space
2017-07-28T13-50-15_071-jvmRun1.dumpstream里面我可以找到~100个相同的例外(每个春天日志一个):
Corrupted stdin stream in forked JVM 1. Stream ‘
13:50:15.914 [main] DEBUG org.springframework.test.context.BootstrapUtils –
Instantiating CacheAwareContextLoaderDelegate from class
[org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate]’.
java.lang.IllegalArgumentException: Stream stdin corrupted.
Expected comma after third character in command ‘
13:50:15.914 [main] DEBUG org.springframework.test.context.BootstrapUtils –
Instantiating CacheAwareContextLoaderDelegate from class
[org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate]’.
at 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 surefire插件:
<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>
解决方法:
IntelliJ捆绑了JUnit5,因此IntelliJ和Maven可能使用不同的版本.
See the JUnit5 docs about IntelliJ
根据您运行的IntelliJ版本,它可能正在执行比maven正在使用的更早的JUnit5里程碑版本.
如果您使用的是2017.2,则可以尝试将pom.xml中的JUnit5依赖项切换回M4,看看是否能解决不兼容问题.
还可以尝试在pom.xml中的插件依赖项中指定junit-jupiter-engine:5.0.0-M4以及junit-platform-surefire-plugin.
我这样成功使用5.0.0-M5.
[更新2017-08-10]:关于你的评论,我使用的是春季启动1.5.4.RELEASE所以我不能做类似的比较.
您没有说明您正在使用的IntelliJ版本 – 假设测试仍然在IntelliJ下运行,那么版本配置可能是您的目标.查看maven项目视图或调试测试输出以获取类路径并查看正在使用的版本.
Spring可能会为您管理很多版本.您使用的是spring-boot父pom,还是依赖于spring-boot-starter依赖项?
要了解正在发生的事情以及哪个Spring依赖关系正在拉动哪个JUnit5依赖关系正在运行
mvn依赖:树
并浏览依赖项和版本列表,以确切了解maven下的内容.
您可能会发现您认为已指定的版本被覆盖,并且您必须在pom中放置排除项以阻止它.
[更新2]:快速更改 – 尝试将junit-jupiter-engine依赖项放在junit-platform-surefire-provider旁边的maven-surefire-plugin依赖块中:
<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和Spring testing中打开Jira问题.我将问题上的标记更改为包括spring-boot,这样他们的一个人可能会注意到.或者可能不会,取决于你的运气 – 如果你将你的*网址发送到@springboot,我发现他们更有可能做出反应.