我得到运行此代码的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 {
- }
我收到:
- 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.
解决方法
如果您使用的是IntelliJ IDEA 2016.2,则目前无法在IDE中执行使用@RunWith(JUnitPlatform.class)注释的测试类.
答案很长
根据你报告的行为,经过一些艰苦的调查工作,我相信我有你的问题的答案……
如果您使用的是内置支持JUnit 5的IntelliJ IDEA 2016.2,那么以下是正在发生的事情.
> IDEA通过Launcher API启动JUnit平台,选择使用@RunWith(JUnitPlatform.class)注释的测试类(让我们称之为TestSuite).
> Launcher检测到junit-jupiter和junit-vintage TestEngine实现.
> JUnit Jupiter引擎忽略了TestSuite,因为它在技术上不是JUnit Jupiter测试类.
> JUnit Vintage引擎也忽略了TestSuite,因为它是用@RunWith(JUnitPlatform.class)注释的.
>最终结果是,既没有注册的测试引擎声称它可以运行TestSuite类.
非直观的部分是JUnit Vintage引擎忽略了TestSuite,它实际上看起来像一个基于JUnit 4的测试类,因为它是用@RunWith()注释的.忽略它的原因是避免无限递归,这在DefensiveAllDefaultPossibilitiesBuilder的源代码中有解释:
- if ("org.junit.platform.runner.JUnitPlatform".equals(runnerClass.getName())) {
- return null;
- }
上述代码在这种情况下返回null的事实导致空套件.
当然,如果用户被告知这种情况肯定会更好 – 例如,通过日志声明.因此,我已经为JUnit 5和IntelliJ提出了问题,以提高这种情况下的可用性.
从好的方面来说,由于您使用的是IntelliJ IDEA 2016.2,因此您无需使用测试套件支持.相反,您只需在IDEA的项目视图中右键单击src / test / java,然后选择Run’All Tests’,这将运行所有测试.
问候,
Sam(JUnit 5核心提交者)