java – 春季启动测试中的Maven失败(junit 5)

是否可以使用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以查看是否为您提供了更好的异常消息.

您可以将项目删除到最低限度,并在MavenSpring testing中打开Jira问题.我将问题上的标记更改为包括spring-boot,这样他们的一个人可能会注意到.或者可能不会,取决于你的运气 – 如果你将你的*网址发送到@springboot,我发现他们更有可能做出反应.

上一篇:java – 使用Surefire生成树输出,如JUnit 5控制台启动器


下一篇:安排工作以达到最大收益