Woj*_*moń 5 java testing maven spring-boot junit5
是否可以使用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";
}
}
Run Code Online (Sandbox Code Playgroud)
并测试:
@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>")));
}
}
Run Code Online (Sandbox Code Playgroud)
当我使用intellij运行它时,一切正常,但是maven构建以失败告终:
[警告]分叉的JVM 1中的stdin流损坏。请参见转储文件somePath / target / surefire-reports / 2017-07-28T13-50-15_071-jvmRun1.dumpstream
--debug标志显示:
java.lang.OutOfMemoryError:Java堆空间
在内部,2017-07-28T13-50-15_071-jvmRun1.dumpstream
我可以找到约100个相同的异常(每个spring log一个)
分叉的JVM 1中损坏的stdin流。Stream'13:50:15.914 [main]调试org.springframework.test.context.BootstrapUtils-从类[org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate]实例化CacheAwareContextLoaderDelegate。java.lang.IllegalArgumentException:流标准输入已损坏。命令'第三个字符后的预期逗号'13:50:15.914 [main]调试org.springframework.test.context.BootstrapUtils-从类[org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate]实例化CacheAwareContextLoaderDelegate。在org.apache.maven.plugin的org.apache.maven.plugin.surefire.booterclient.output.ForkClient $ OperationalData。(ForkClient.java:469)处。
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>
Run Code Online (Sandbox Code Playgroud)
IntelliJ 捆绑了 JUnit5,因此 IntelliJ 和 Maven 可能使用不同的版本。
根据您运行的 IntelliJ 版本,它可能正在执行JUnit5
比 Maven 使用的版本更早的里程碑版本。
如果您处于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]:关于你的评论,我使用的是spring boot 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>
Run Code Online (Sandbox Code Playgroud)
请注意,我还没有使用该版本2.20
(而且我仍在使用5.0.0-M5
) - 抱歉,但这周我也没有时间尝试。
您还可以查看是否设置maven-surefire-plugin
配置forkCount=0
以查看是否会为您提供更好的异常消息。
您可以将项目精简到最低限度,并使用Maven和Spring 测试打开 Jira 问题。我更改了你的问题的标签,spring-boot
以便他们的一个人可能会注意到。或者可能不会,这取决于你的运气 - 我发现如果你将你的 stackoverflow url 推到@springboot,他们更有可能做出反应。