5

是否可以使用 maven 使用 junit 5 运行 spring boot 测试?我正在使用 spring boot 2.0.0.M3、junit 5.0.0-M6、maven 3.5.0。其他 junit5 测试(没有弹簧上下文)有效。

有一个简单的控制器:

@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 1 中的标准输入流损坏。请参阅转储文件 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 日志一个):

分叉 JVM 1 中的标准输入流损坏。流“13:50:15.914 [main] DEBUG org.springframework.test.context.BootstrapUtils - 从类 [org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate] 实例化 CacheAwareContextLoaderDelegate”。java.lang.IllegalArgumentException:流标准输入已损坏。命令“13:50:15.914 [main] DEBUG org.springframework.test.context.BootstrapUtils - 从类 [org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate] 实例化 CacheAwareContextLoaderDelegate”中的第三个字符后的预期逗号。在 org.apache.maven.plugin.surefire.booterclient.output.ForkClient$OperationalData.(ForkClient.java:469) 在 org.apache.maven.plugin。

Maven 万能插件:

<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>
4

2 回答 2

2

IntelliJ 捆绑了 JUnit5,因此 IntelliJ 和 Maven 可能使用不同的版本。

请参阅有关 IntelliJ 的 JUnit5 文档

根据您正在运行的 IntelliJ 版本,它可能正在执行JUnit5比 maven 使用的更早的里程碑版本。

如果您在2017.2,您可以尝试将您的JUnit5依赖项切换pom.xmlM4,看看是否可以解决不兼容问题。

还可以尝试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依赖项?

要找出正在发生的事情以及哪个弹簧依赖项正在拉动哪个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配置forkCount=0以查看是否会为您提供更好的异常消息。

您可以将您的项目精简到最低限度,并使用MavenSpring 测试打开 Jira 问题。我将您问题上的标签更改为包含spring-boot,以便他们的一个人可能会注意到。或者可能不会,这取决于你的运气——我发现如果你将你的 stackoverflow url 推特到@springboot,他们更有可能做出反应。

于 2017-08-08T17:27:39.583 回答
0

这个问题是由maven-surefire-plugin一个 JUnit5 之间的交互引起的junit-vintage-engine,它在 Surefire 能够处理这个之前写入 System.out。

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

于 2019-11-05T11:08:49.597 回答