【问题标题】:No runnable methods when running JUnit suite test运行 JUnit 套件测试时没有可运行的方法
【发布时间】:2014-07-17 11:35:41
【问题描述】:

我对使用 Intellij JUnit 插件的 java 测试非常陌生。我想用一些JUnit Suite,所以我复制了一些代码

import org.junit.runner.RunWith;
import org.junit.runners.Suite;

@RunWith(Suite.class)
@Suite.SuiteClasses(value={KruskalTest.class})
class KruskalTestSuite {}

在其他文件中

import org.junit.runner.JUnitCore;
import org.junit.runner.Result;
import org.junit.runner.notification.Failure;

public class JunitTestSuiteRunner {
    public static void main(String[] args) {

        Result result = JUnitCore.runClasses(KruskalTestSuite.class);
        for (Failure fail : result.getFailures()) {
            System.out.println(fail.toString());
        }
        if (result.wasSuccessful()) {
            System.out.println("All tests finished successfully...");
        }
    }

}

然后 导入 junit.framework.TestCase;

public class KruskalTest extends TestCase {

    @org.junit.Test
    public void testMain() throws Exception {
        assertEquals("hello", "hello");

    }
}

问题是当我运行这段代码时,我得到了这个异常

java.lang.Exception: No runnable methods
    at org.junit.runners.BlockJUnit4ClassRunner.validateInstanceMethods(BlockJUnit4ClassRunner.java:169)
    at org.junit.runners.BlockJUnit4ClassRunner.collectInitializationErrors(BlockJUnit4ClassRunner.java:104)
    at org.junit.runners.ParentRunner.validate(ParentRunner.java:355)
    at org.junit.runners.ParentRunner.<init>(ParentRunner.java:76)
    at org.junit.runners.BlockJUnit4ClassRunner.<init>(BlockJUnit4ClassRunner.java:57)
    at org.junit.internal.builders.JUnit4Builder.runnerForClass(JUnit4Builder.java:10)
    at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59)
    at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:26)
    at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59)
    at org.junit.internal.requests.ClassRequest.getRunner(ClassRequest.java:26)
    at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:41)
    at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:211)
    at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:67)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134)

【问题讨论】:

  • 您使用的是哪个版本的 JUnit
  • JunitTestSuiteRunner 已过时且未使用。您的测试由 IntelliJ 的 JUnit4IdeaTestRunner 启动。如何开始测试?

标签: java testing junit intellij-idea


【解决方案1】:

org.junit.runners.BlockJUnit4ClassRunner

protected void validateInstanceMethods(List<Throwable> errors) {
        validatePublicVoidNoArgMethods(After.class, false, errors);
        validatePublicVoidNoArgMethods(Before.class, false, errors);
        validateTestMethods(errors);

        if (computeTestMethods().size() == 0)
            errors.add(new Exception("No runnable methods"));
    }

您的代码通过了所有验证检查。它执行得很好。

请注意,使用 Annotation 时不需要扩展 TestCase。

【讨论】:

  • 执行不好。 JUnit 找不到任何要执行的测试。
  • @JamesB 它在我这边运行良好。很可能它会与版本相关。
【解决方案2】:

您需要通过测试类,而不是将测试套件传递给 JUnitCore。

所以改变:

Result result = JUnitCore.runClasses(KruskalTestSuite.class);

到:

Result result = JUnitCore.runClasses(KruskalTest.class);

【讨论】:

  • 通过将 TestSuite 传递给 JUnitCore,他的代码对我来说实际上工作得很好
  • @Arno_Geismar 感谢 -1。我仍然认为我建议的更改会解决这个问题。
  • 好吧,他只想在 KruskalTestSuite.class 中定义一次类,然后就能够运行该套件,而不必在 JUnitCore.runClasses() 中单独指定类。通过说只是单独指定所有类,您实际上是在说不要使用 Suite 类。从而绕过他的问题,但没有解决它
  • @Arno_Geismar 不同意。 runClasses 方法需要一个测试类数组,而不是一个测试套件。我建议的更改应该可以解决 OP 的问题,对他现有的代码进行最低限度的更改。争论如何运行测试是一个单独的问题——我同意你的观点,运行一个套件更好。
  • 看看这个教程。这是他完全相同的代码。 runClasses 方法可以并且将在带有 @runwith 和 @Suite.SuiteClasses({// your test classes}) 注释的类上正常运行。 tutorialspoint.com/junit/junit_suite_test.htm
猜你喜欢
  • 2022-01-16
  • 1970-01-01
  • 2014-08-10
  • 2018-08-05
  • 2012-02-17
  • 2021-12-16
  • 1970-01-01
  • 1970-01-01
  • 2011-04-29
相关资源
最近更新 更多