Java 运行JUnit套件测试时没有可运行的方法

Java 运行JUnit套件测试时没有可运行的方法,java,testing,junit,intellij-idea,Java,Testing,Junit,Intellij Idea,我对使用IntellijJUnit插件进行java测试非常陌生。我想使用一些JUnit套件,所以我复制了一些代码 import org.junit.runner.RunWith; import org.junit.runners.Suite; @RunWith(Suite.class) @Suite.SuiteClasses(value={KruskalTest.class}) class KruskalTestSuite {} 在其他文件中 import org.junit.runner.

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

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)
java.lang.Exception:没有可运行的方法
位于org.junit.runners.BlockJUnit4ClassRunner.validateInstanceMethods(BlockJUnit4ClassRunner.java:169)
位于org.junit.runners.BlockJUnit4ClassRunner.collectionInitializationErrors(BlockJUnit4ClassRunner.java:104)
位于org.junit.runners.ParentRunner.validate(ParentRunner.java:355)
在org.junit.runners.ParentRunner上(ParentRunner.java:76)
位于org.junit.runners.BlockJUnit4ClassRunner。(BlockJUnit4ClassRunner.java:57)
位于org.junit.internal.builders.JUnit4Builder.runnerForClass(JUnit4Builder.java:10)
位于org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59)
位于org.junit.internal.builders.AllDefaultPossibilityBuilder.runnerForClass(AllDefaultPossibilityBuilder.java:26)
位于org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59)
位于org.junit.internal.requests.ClassRequest.getRunner(ClassRequest.java:26)
位于com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:41)
位于com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:211)
位于com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:67)
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
在sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)中
位于com.intellij.rt.execution.application.AppMain.main(AppMain.java:134)

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

因此,改变:

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


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"));
    }
受保护的void validateInstanceMethods(列出错误){
validatePublicVoidNoArgMethods(After.class、false、errors);
validatePublicVoidNoArgMethods(Before.class,false,errors);
validateTestMethods(错误);
if(computeTestMethods().size()==0)
添加(新异常(“无可运行方法”);
}
您的代码通过了所有验证检查。它执行得很好


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

他的代码实际上在我这方面工作得非常好,将TestSuite传递给JUnitCore@Arno_Geismar谢谢你的-1。我仍然认为我建议的更改可以解决这个问题。问题是,他只想在KruskalTestSuite.class中定义一次类,然后就可以运行该套件,而不必在JUnitCore.runClasses()中单独指定类。通过单独指定所有类,本质上就是说不要使用Suite类。因此,他回避了问题,但没有解决问题it@Arno_Geismar不同意。runClasses方法需要一个测试类数组,而不是一个测试套件。我建议的更改应该解决OP的问题,对其现有代码进行最低限度的更改。关于如何运行测试的争论是另一个问题——在这一点上,我同意你的看法,运行一个套件更好。请看本教程。这和他的密码一模一样。runClasses方法可以并且将可以在带有@runwith和@Suite.SuiteClasses({//your test classes})注释的类上正常运行。您使用的JUnit的哪个版本JUnitTestRunner已过时且未使用。您的测试由IntelliJ的JUnit4IdeaTestRunner启动。你如何开始你的测试?它执行得不好。JUnit找不到任何要执行的测试。@JamesB它在我这边运行良好。很可能它的版本相关。
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"));
    }