首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >春季启动测试中的Maven故障(junit 5)

春季启动测试中的Maven故障(junit 5)
EN

Stack Overflow用户
提问于 2017-07-28 11:57:25
回答 2查看 8.2K关注 0票数 5

是否可以使用maven使用junit 5运行spring引导测试?我使用spring 2.0.0.M3,junit 5.0.0-M6,maven 3.5.0。其他junit5测试(没有spring上下文)可以工作。

有一个简单的控制器:

代码语言:javascript
复制
@Controller
public class HomeController {
    @GetMapping("/")
    String home() {
        return "home";
    }
}

和测试:

代码语言:javascript
复制
@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中损坏的stdin流。参见转储文件somePath/target/surefire-reports/2017-07-28T13-50-15_071-jvmRun1.dumpstream。

-调试标志显示:

java.lang.OutOfMemoryError: Java堆空间

2017-07-28T13-50-15_071-jvmRun1.dumpstream内部,我可以找到~100个相同的异常(每个春季日志一个):

在分叉JVM 1中损坏的stdin流‘13:50:15.914主要调试org.springframework.test.context.BootstrapUtils -从类org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate'.实例化CacheAwareContextLoaderDelegatejava.lang.IllegalArgumentException:流已损坏。命令‘13:50:15.914主调试org.springframework.test.context.BootstrapUtils中第三个字符后的预期逗号-从org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate'.类实例化CacheAwareContextLoaderDelegate在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尽是火插件:

代码语言:javascript
复制
<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>
EN

回答 2

Stack Overflow用户

发布于 2017-08-08 17:27:39

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

请参阅关于JUnit5 IntelliJ的文档

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

如果您在2017.2上,您可以尝试将pom.xml中的JUnit5依赖项切换回M4,看看这是否解决了不兼容性问题。

还可以尝试在junit-jupiter-engine:5.0.0-M4junit-platform-surefire-plugin中指定插件依赖项中的junit-platform-surefire-plugin

我正以这种方式成功地使用5.0.0-M5

更新2017-08-10关于您的评论,我正在使用spring引导1.5.4.RELEASE,所以我不能做类似的比较。

您没有说明您使用的是哪个版本的IntelliJ --假设测试仍然在IntelliJ下工作,那么版本配置大概就是您的目标。查看maven项目视图或调试测试输出,以获得类路径,并查看正在使用的版本。

Spring可能正在为您管理许多版本。您是使用spring引导父pom,还是依赖于spring-boot-starter依赖项?

若要了解发生了什么以及哪个春季依赖项正在拉哪个JUnit5依赖项正在崩溃,请运行

mvn dependency:tree

并查看依赖项和版本列表,以确切地查看maven下的内容。

您可能会发现,您认为您指定的版本正在被覆盖,您必须在pom中添加排除以阻止这种情况。

更新2只是一个快速的更改-尝试将junit-jupiter-engine依赖项放在maven-surefire-plugin依赖项块的junit-platform-surefire-provider旁边

代码语言:javascript
复制
        <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设置为查看是否为您提供了更好的异常消息。

您可以将项目缩减到最低限度,并使用Maven弹簧试验打开Jira问题。我把你问题上的标签换成了spring-boot,这样他们的人就会注意到了。或者可能不会,这取决于你的运气--我发现如果你在推特上发推文将你的堆栈溢出网址发到@springboot,他们更有可能做出反应。

票数 2
EN

Stack Overflow用户

发布于 2019-11-05 11:08:49

这个问题是由maven-surefire-plugin和JUnit5 5的junit-vintage-engine之间的交互引起的,后者会在万无一失能够处理这个问题之前写到System.out。

它是在maven-surefire-plugin版本2.22.2:https://blogs.apache.org/maven/entry/apache-maven-surefire-plugin-version2中修正的

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45372927

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档