使用maven可以使用junit 5运行spring boot test吗? 我使用的是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构建以失败结束:
[警告]分叉JVM中的stdin流损坏1.请参阅转储文件 somePath /目标/万无一失-报告/ 2017-07-28T13-50-15_071-jvmRun1.dumpstream
- 调试标志显示:
java.lang.OutOfMemoryError:Java堆空间
在2017-07-28T13-50-15_071-jvmRun1.dumpstream
内我可以找到~100个相同的例外(每个春天日志一个):
分叉JVM中的stdin流损坏1.流&#39; 13:50:15.914 [main] DEBUG org.springframework.test.context.BootstrapUtils - 从类实例化CacheAwareContextLoaderDelegate [org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate]&#39 ;. java.lang.IllegalArgumentException:流stdin已损坏。 命令第三个字符后的预期逗号&#39; 13:50:15.914 [main] DEBUG org.springframework.test.context.BootstrapUtils - 从类实例化CacheAwareContextLoaderDelegate [org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate]&#39 ;. 在org.apache.maven.plugin.surefire.booterclient.output.ForkClient $ OperationalData。(ForkClient.java:469) 在org.apache.maven.plugin.surefire.booterclient.output.ForkClient.processLine(ForkClient.java:191) 在org.apache.maven.plugin.surefire.booterclient.output.ForkClient.consumeLine(ForkClient.java:158) 在org.apache.maven.plugin.surefire.booterclient.output.ThreadedStreamConsumer $ Pumper.run(ThreadedStreamConsumer.java:87) 在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>
答案 0 :(得分:2)
IntelliJ捆绑JUnit5,因此IntelliJ和Maven可能使用不同的版本。
See the JUnit5 docs about IntelliJ
根据您运行的IntelliJ版本,它可能正在执行比maven正在使用的早期JUnit5
里程碑版本。
如果您使用2017.2
,则可以尝试将JUnit5
中的pom.xml
依赖关系切换回M4
,看看是否能解决不兼容问题。
另请尝试在junit-jupiter-engine:5.0.0-M4
以及pom.xml
中指定插件依赖项中的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 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
config forkCount=0
以查看是否为您提供了更好的异常消息。
您可以将项目删除到最低限度,并使用Maven和Spring testing打开Jira问题。我将您问题上的标记更改为spring-boot
,以便他们的某个人可能会注意到。或者可能不会,取决于你的运气 - 如果你将你的stackoverflow网址发送到@springboot,我发现他们更有可能做出反应。
答案 1 :(得分:0)
此问题是由JUnit5的maven-surefire-plugin
与junit-vintage-engine
之间的交互作用引起的,该交互作用在Surefire能够处理此问题之前写入System.out。
它已在maven-surefire-plugin
2.22.2版中修复:https://blogs.apache.org/maven/entry/apache-maven-surefire-plugin-version2