Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java.lang.Exception:运行JUnits时没有可运行方法异常_Java_Junit_Ubuntu 12.04_Junit4 - Fatal编程技术网

java.lang.Exception:运行JUnits时没有可运行方法异常

java.lang.Exception:运行JUnits时没有可运行方法异常,java,junit,ubuntu-12.04,junit4,Java,Junit,Ubuntu 12.04,Junit4,我试图在Linux命令提示符/opt/JUnit/上运行JUnit,其中包含必要的jar(hamcrest-core-1.3.jar和JUnit.jar)和类文件,我使用以下命令运行JUnit: java -cp hamcrest-core-1.3.jar:junit.jar:. org.junit.runner.JUnitCore TestRunner TestJunit类: import org.junit.Test; import static org.junit.Assert.ass

我试图在Linux命令提示符
/opt/JUnit/
上运行JUnit,其中包含必要的jar(hamcrest-core-1.3.jar和JUnit.jar)和类文件,我使用以下命令运行JUnit:

java -cp hamcrest-core-1.3.jar:junit.jar:. org.junit.runner.JUnitCore  TestRunner
TestJunit类:

import org.junit.Test;
import static org.junit.Assert.assertEquals;
public class TestJunit {
   @Test
   public void testAdd() {
      String str= "Junit is working fine";
      assertEquals("Junit is working fine",str);
   }
}
TestRunner:

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

public class TestRunner {
   public static void main(String[] args) {
      Result result = JUnitCore.runClasses(TestJunit.class);
      for (Failure failure : result.getFailures()) {
         System.out.println("fail ho gaya"+failure.toString());
      }
      System.out.println("passed:"+result.wasSuccessful());
   }
}  
运行此命令时,我遇到以下异常

JUnit version 4.11
.E
Time: 0.003
There was 1 failure:
1) initializationError(TestRunner)
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.runner.Computer.getRunner(Computer.java:40)
    at org.junit.runner.Computer$1.runnerForClass(Computer.java:31)
    at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59)
    at org.junit.runners.model.RunnerBuilder.runners(RunnerBuilder.java:101)
    at org.junit.runners.model.RunnerBuilder.runners(RunnerBuilder.java:87)
    at org.junit.runners.Suite.<init>(Suite.java:80)
    at org.junit.runner.Computer.getSuite(Computer.java:28)
    at org.junit.runner.Request.classes(Request.java:75)
    at org.junit.runner.JUnitCore.run(JUnitCore.java:117)
    at org.junit.runner.JUnitCore.runMain(JUnitCore.java:96)
    at org.junit.runner.JUnitCore.runMainAndExit(JUnitCore.java:47)
    at org.junit.runner.JUnitCore.main(JUnitCore.java:40)

FAILURES!!!
Tests run: 1,  Failures: 1
JUnit版本4.11 E 时间:0.003 有1次失败: 1) 初始化错误(TestRunner) 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.runner.Computer.getRunner(Computer.java:40) 位于org.junit.runner.Computer$1.runnerForClass(Computer.java:31) 位于org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59) 位于org.junit.runners.model.RunnerBuilder.runners(RunnerBuilder.java:101) 位于org.junit.runners.model.RunnerBuilder.runners(RunnerBuilder.java:87) 位于org.junit.runners.Suite.(Suite.java:80) 位于org.junit.runner.Computer.getSuite(Computer.java:28) 位于org.junit.runner.Request.classes(Request.java:75) 位于org.junit.runner.JUnitCore.run(JUnitCore.java:117) 位于org.junit.runner.JUnitCore.runMain(JUnitCore.java:96) 位于org.junit.runner.JUnitCore.runMainAndExit(JUnitCore.java:47) 位于org.junit.runner.JUnitCore.main(JUnitCore.java:40) 失败!!! 测试运行:1,失败:1
如果使用JUnit 4.4核心运行程序执行一个没有
“@Test”方法的类,则会出现此异常。


礼节vipin8169

我出现此错误是因为我没有正确创建自己的测试套件:

以下是我如何正确地做到这一点:

将其放入
Foobar.java

public class Foobar{
    public int getfifteen(){
        return 15;
    }
}
import static org.junit.Assert.*;
import junit.framework.JUnit4TestAdapter;
import org.junit.Test;
public class FoobarTest {
    @Test
    public void mytest() {
        Foobar f = new Foobar();

        assert(15==f.getfifteen());
    }
    public static junit.framework.Test suite(){
       return new JUnit4TestAdapter(FoobarTest.class);
    }
}
将其放入
foobertest.java

public class Foobar{
    public int getfifteen(){
        return 15;
    }
}
import static org.junit.Assert.*;
import junit.framework.JUnit4TestAdapter;
import org.junit.Test;
public class FoobarTest {
    @Test
    public void mytest() {
        Foobar f = new Foobar();

        assert(15==f.getfifteen());
    }
    public static junit.framework.Test suite(){
       return new JUnit4TestAdapter(FoobarTest.class);
    }
}
下载junit4-4.8.2.jar

http://www.java2s.com/Code/Jar/j/Downloadjunit4jar.htm
编译它:

javac -cp .:./libs/junit4-4.8.2.jar Foobar.java FoobarTest.java
运行它:

el@failbox /home/el $ java -cp .:./libs/* org.junit.runner.JUnitCore FoobarTest
JUnit version 4.8.2
.
Time: 0.009    
OK (1 test)
一个测试通过。

此解决方案将适用于一小部分人,通常是实现自己的JUnit测试运行程序并使用单独的类加载器的人

当您从不同的类加载器加载一个类,然后尝试从从系统类加载器加载的JUnitCore实例运行该测试时,可能会发生这种情况。例如:

// Load class
URLClassLoader cl = new URLClassLoader(myTestUrls, null);
Class<?>[] testCls = cl.loadClass("com.gubby.MyTest");

// Run test
JUnitCore junit = new JUnitCore();
junit.run(testCls); // Throws java.lang.Exception: No runnable methods
在这种情况下,
Test.class
将使用系统类加载器(即加载JUnitCore的类加载器)加载,因此从技术上讲,您的任何测试方法都不会使用该注释进行注释

解决方案是在与测试本身相同的类加载器中加载JUnitCore


编辑:在回答用户3486675的问题时,您需要创建一个不委托给系统类加载器的类加载器,例如:

private static final class IsolatedURLClassLoader extends URLClassLoader {
    private IsolatedURLClassLoader(URL[] urls) {
        // Prevent delegation to the system class loader.
        super(urls, null);
    }
}
向此传递一组URL,其中包含您需要的所有内容。您可以通过过滤系统类路径来创建它。请注意,您不能简单地委托给父类加载器,因为这些类将由父类加载器而不是测试类的类加载器加载

然后,您需要从这个类加载器加载的类开始整个JUnit作业。这里很乱。下面有一些像这样肮脏的东西:

public static final class ClassLoaderIsolatedTestRunner {

    public ClassLoaderIsolatedTestRunner() {
        // Disallow construction at all from wrong ClassLoader
        ensureLoadedInIsolatedClassLoader(this);
    }

    // Do not rename.
    public void run_invokedReflectively(List<String> testClasses) throws BuildException {
        // Make sure we are not accidentally working in the system CL
        ensureLoadedInIsolatedClassLoader(this);

        // Load classes
        Class<?>[] classes = new Class<?>[testClasses.size()];
        for (int i=0; i<testClasses.size(); i++) {
            String test = testClasses.get(i);
            try {
                classes[i] = Class.forName(test);
            } catch (ClassNotFoundException e) {
                String msg = "Unable to find class file for test ["+test+"]. Make sure all " +
                        "tests sources are either included in this test target via a 'src' " +
                        "declaration.";
                throw new BuildException(msg, e);
            }
        }

        // Run
        JUnitCore junit = new JUnitCore();
        ensureLoadedInIsolatedClassLoader(junit);
        junit.addListener(...);
        junit.run(classes);
    }

    private static void ensureLoadedInIsolatedClassLoader(Object o) {
        String objectClassLoader = o.getClass().getClassLoader().getClass().getName();

        // NB: Can't do instanceof here because they are not instances of each other.
        if (!objectClassLoader.equals(IsolatedURLClassLoader.class.getName())) {
            throw new IllegalStateException(String.format(
                    "Instance of %s not loaded by a IsolatedURLClassLoader (loaded by %s)",
                    cls, objectClassLoader));
        }
    }
}
公共静态最终类ClassLoaderIsolatedTestRunner{
公共类LoaderIsolatedTestRunner(){
//根本不允许从错误的类加载器进行构造
确保重新加载IsolatedClassLoader(此);
}
//不要重命名。
public void run_invokedreflective(列出测试类)引发BuildException{
//确保我们没有意外地在系统中工作
确保重新加载IsolatedClassLoader(此);
//荷载等级
Class[]classes=新类[testClasses.size()];

对于(int i=0;i在我的情况下,我导入了错误的包:

import org.testng.annotations.Test;
而不是

import org.junit.Test;

小心你的ide自动完成。

在Eclipse中,我不得不使用
New>Other>JUnit>JUnit Test
。一个使用完全相同文本创建的Java类给了我错误,可能是因为它使用的是JUnit 3.x。

最简单的解决方案是在出现初始化异常的类中添加@Test注释的方法


在我们的项目中,我们有带有初始设置的主类。我添加了@Test method,异常消失了。

我的控制器测试在大快捷方式中:

@RunWith(SpringRunner.class)
@SpringBootTest
public class TaskControllerTest {
   //...
   //tests
   //
}

我刚删除了“公共”它神奇地工作了。

我可以通过手动将junit jar添加到我的项目类路径来修复。我发现最简单的方法是在项目根目录中添加一个/lib目录。然后我将junit.jar放在/lib中,junit测试开始为我工作。

我现在在测试代码时遇到了同样的问题。这是由由于
@RunWith
注释,spring启动。我使用了:

@RunWith(SpringRunner.class)

有了这个注释,JUnit Vintage正在运行,它找不到任何测试并给出错误。我已经删除了它,只有JUnit Jupiter正在运行,一切正常。

如果你无意中混合了org.JUnit和org.JUnit.Jupiter注释,你也可以得到这个结果。

我的父测试设置类也遇到了同样的问题,它有注释@RunWith(SpringRunner.class),并被其他TestClass扩展。 因为setUpclass中没有测试,Junit试图找到一个,因为注释@RunWith(SpringRunner)。
@RunWith(SpringRunner.class)
import org.junit.Test;
@RunWith(SpringRunner.class)
@SpringBootTest
@ActiveProfiles(profiles = {"test"})
public class TestSuiteName {
@RunWith(SpringRunner.class)
@SpringBootTest
@ActiveProfiles(profiles = {"test"})
class TestSuiteName {