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

时间:2017-07-28 11:57:25

标签: java maven testing spring-boot junit5

使用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>

2 个答案:

答案 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以查看是否为您提供了更好的异常消息。

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

答案 1 :(得分:0)

此问题是由JUnit5的maven-surefire-pluginjunit-vintage-engine之间的交互作用引起的,该交互作用在Surefire能够处理此问题之前写入System.out。

它已在maven-surefire-plugin 2.22.2版中修复:https://blogs.apache.org/maven/entry/apache-maven-surefire-plugin-version2