Spring Boot测试中的Maven故障(Junit 5)

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)

Ada*_*dam 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依赖项?

要找出发生了什么以及哪个 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以查看是否会为您提供更好的异常消息。

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