首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JUnit 5-使用JUnit木星引擎时IntelliJ IDEA中的空测试套件

JUnit 5-使用JUnit木星引擎时IntelliJ IDEA中的空测试套件
EN

Stack Overflow用户
提问于 2016-08-22 18:00:05
回答 3查看 15K关注 0票数 9

如何使用JUnit 5在IntelliJ IDEA v2016.2.2中执行所有套件测试?

我得到了运行以下代码的空测试套件:

代码语言:javascript
复制
import org.junit.platform.runner.IncludeEngines;
import org.junit.platform.runner.JUnitPlatform;
import org.junit.platform.runner.SelectPackages;
import org.junit.runner.RunWith;

@RunWith(JUnitPlatform.class)
@IncludeEngines("junit-jupiter")
@SelectPackages("<eu...package>") //I confirm that <eu...package> is ok.
public class AllTests {
}

我收到:

代码语言:javascript
复制
INFORMAZIONI: Discovered TestEngines with IDs: [junit-jupiter, junit-vintage]
Empty test suite.
Empty test suite.

[root]
JUnit Jupiter
JUnit Vintage

代码语言:javascript
复制
import eu.....services.ServiceTest;
import eu.....repository.DAOTest;
import org.junit.runner.RunWith;
import org.junit.runners.Suite;

@RunWith(Suite.class)
@Suite.SuiteClasses({
        ServiceTest.class,
        DAOTest.class
})
public class AllTests {
}

我收到:

代码语言:javascript
复制
INFORMAZIONI: Discovered TestEngines with IDs: [junit-jupiter, junit-vintage]
Empty test suite.

[root]
|+--JUnit Vintage
|   +--eu.....AllTests
|+--JUnit Jupiter

我能够使用JUnit 4运行套件,但它不适用于JUnit 5。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-08-24 16:43:30

短答案

如果您使用的是IntelliJ IDEA 2016.2,则目前无法在IDE中执行带有@RunWith(JUnitPlatform.class)注释的测试类。

长答案

根据你报告的行为,经过一番艰苦的调查工作,我相信我能回答你的问题.

如果您正在使用IntelliJ IDEA 2016.2,它已经内置了对JUnit 5的支持,那么下面是正在发生的事情。

  1. IDEA通过JUnit API启动Launcher平台,选择带有@RunWith(JUnitPlatform.class)注释的测试类(让我们称之为TestSuite)。
  2. Launcher同时检测junit-jupiterjunit-vintage TestEngine实现。
  3. JUnit木星引擎忽略了TestSuite,因为它在技术上不是一个JUnit木星测试类。
  4. JUnit Vintage引擎也会忽略TestSuite,因为它使用@RunWith(JUnitPlatform.class)进行注释。
  5. 最终的结果是,没有一个注册的测试引擎声称它可以运行TestSuite类。

不直观的部分是,JUnit Vintage引擎忽略了TestSuite,而实际上它看起来像一个基于JUnit 4的测试类,因为它是用@RunWith()注释的。它被忽略的原因是为了避免无限递归,这在DefensiveAllDefaultPossibilitiesBuilder的源代码中得到了解释。

代码语言:javascript
复制
if ("org.junit.platform.runner.JUnitPlatform".equals(runnerClass.getName())) {
    return null;
}

在这样的场景中,上面的代码返回null的事实导致了一个空套件。

当然,如果用户被告知了这样的场景--例如,通过日志语句--当然会更好。因此,我为JUnit 5IntelliJ提供了一些问题,以提高在这种情况下的可用性。

好的一面是,由于您使用的是IntelliJ IDEA 2016.2,所以不需要使用测试套件支持。相反,您可以在IDEA中的项目视图中右键单击src/test/java并选择Run 'All Tests',这将运行您的所有测试。

致以敬意,

Sam (JUnit 5核心委员会)

票数 14
EN

Stack Overflow用户

发布于 2017-02-23 21:09:53

除了萨姆·布兰宁的回答之外。在运行包中的所有测试类之前,我需要一个TestSuit来设置后端。这可能不可能通过Run 'All Tests'实现。

但我想我找到了一个很好的解决办法。我想出了这个:

代码语言:javascript
复制
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Nested;
import your.other.package.test.classes.*;

public class TestSuit {
    @BeforeAll
    public static void setup(){}

    @Nested
    public class TestExtender extends MyTestClass {}
}

您可以从另一个包扩展每个测试类,并将@Nested注释添加到其中。这不是最好的解决方案,但在IDEA或JUnit 5为这种情况找到另一个解决方案之前,这是一个解决办法。

票数 2
EN

Stack Overflow用户

发布于 2016-08-22 19:38:20

根据junit官方网站

只需确保junit-vintage引擎工件在测试运行时路径中。在这种情况下,JUnit 3和JUnit 4测试将由JUnit平台启动程序自动获取。

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

https://stackoverflow.com/questions/39085905

复制
相关文章

相似问题

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