9

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

我得到运行此代码的空测试套件:

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 {
}

我收到:

INFORMAZIONI: Discovered TestEngines with IDs: [junit-jupiter, junit-vintage]
Empty test suite.
Empty test suite.

[root]
JUnit Jupiter
JUnit Vintage

或者

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 {
}

我收到:

INFORMAZIONI: Discovered TestEngines with IDs: [junit-jupiter, junit-vintage]
Empty test suite.

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

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

4

3 回答 3

14

简答

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

长答案

根据您报告的行为,经过一些艰苦的调查工作,我相信我已经回答了您的问题......

如果您使用的是内置对 JUnit 5 的支持的 IntelliJ IDEA 2016.2,那么会发生以下情况。

  1. IDEA 通过 API 启动 JUnit Platform Launcher,选择带有注释的测试类@RunWith(JUnitPlatform.class)(我们称之为TestSuite)。
  2. Launcher检测和junit-jupiter实现junit-vintage TestEngine
  3. JUnit Jupiter 引擎会忽略TestSuite,因为它在技术上不是 JUnit Jupiter 测试类。
  4. JUnit Vintage 引擎也会忽略TestSuite,因为它是用@RunWith(JUnitPlatform.class).
  5. 最终结果是两个注册的测试引擎都没有声称它可以运行TestSuite该类。

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

if ("org.junit.platform.runner.JUnitPlatform".equals(runnerClass.getName())) {
    return null;
}

上述代码null在这种情况下返回的事实导致了一个空套件

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

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

问候,

Sam (JUnit 5 核心提交者)

于 2016-08-24T16:43:30.337 回答
2

除了Sam Brannen 的回答。在运行包中的所有测试类之前,我需要一个 TestSuit 来设置后端。这可能无法通过Run 'All Tests'.

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

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 为这种情况找到另一种解决方案。

于 2017-02-23T21:09:53.183 回答
0

根据junit官网

只需确保 junit-vintage-engine 工件在您的测试运行时路径中。在这种情况下,JUnit 平台启动器将自动选择 JUnit 3 和 JUnit 4 测试
于 2016-08-22T19:38:20.077 回答