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

Dav*_*eas 8 java spring intellij-idea spring-test junit5

如何在IntelliJ IDEA v2016.2.2中使用JUnit 5执行All Suite测试?

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

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 {
}
Run Code Online (Sandbox Code Playgroud)

我收到:

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

[root]
JUnit Jupiter
JUnit Vintage
Run Code Online (Sandbox Code Playgroud)

要么

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 {
}
Run Code Online (Sandbox Code Playgroud)

我收到:

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

[root]
|+--JUnit Vintage
|   +--eu.....AllTests
|+--JUnit Jupiter
Run Code Online (Sandbox Code Playgroud)

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

Sam*_*nen 12

简答

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

答案很长

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

如果您使用的是内置支持JUnit 5的IntelliJ IDEA 2016.2,那么以下是正在发生的事情.

  1. IDEA通过LauncherAPI 启动JUnit平台,选择注释的测试类@RunWith(JUnitPlatform.class)(让我们称之为TestSuite).
  2. Launcher检测这两个junit-jupiterjunit-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;
}
Run Code Online (Sandbox Code Playgroud)

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

当然,如果用户被告知这种情况肯定会更好 - 例如,通过日志声明.因此,我为JUnit 5IntelliJ打开了问题,以提高这种情况下的可用性.

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

问候,

Sam (JUnit 5核心提交者)