usage framework examples java junit ubuntu-12.04 junit4

framework - java.lang.Exception: ninguna excepción de métodos ejecutables al ejecutar JUnits



junit testcase (5)

Estoy intentando ejecutar el JUnit en mi símbolo del sistema de Linux /opt/junit/ contiene los /opt/junit/ necesarios (hamcrest-core-1.3.jar y junit.jar) y los archivos de clase, y estoy usando el siguiente comando para ejecutar el JUnit:

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

Clase 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()); } }

Recibo la siguiente excepción al ejecutar esto

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


En Eclipse, tuve que usar New > Other > JUnit > Junit Test . Una clase Java creada con el mismo texto me dio el error, tal vez porque estaba usando JUnit 3.x.


En mi caso, tuve un paquete incorrecto importado:

import org.testng.annotations.Test;

en lugar de

import org.junit.Test;

Ten cuidado con tu auto autocompletado.


Obtendrá esta excepción si usa el corrector principal JUnit 4.4 para ejecutar una clase que no tiene el "@Test" method . sqa.fyicenter.com/FAQ/JUnit/…

cortesía de vipin8169


Esta solución se aplicará a un porcentaje muy pequeño de personas, generalmente personas que implementan sus propios corredores de prueba JUnit y usan un ClassLoader por separado.

Esto puede suceder cuando carga una clase desde un ClassLoader diferente, luego intenta ejecutar esa prueba desde una instancia de JUnitCore cargada desde el cargador de clases del sistema . Ejemplo:

// 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

Mirando el rastro de la pila:

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 org.junit.runner.JUnitCore.run(JUnitCore.java:138)

El problema realmente ocurre en BlockJUnit4ClassRunner: 169 (asumiendo JUnit 4.11):

https://github.com/junit-team/junit/blob/r4.11/src/main/java/org/junit/runners/BlockJUnit4ClassRunner.java#L95

Donde se verifica qué métodos se anotan con @Test :

protected List<FrameworkMethod> computeTestMethods() { return getTestClass().getAnnotatedMethods(Test.class); }

En este caso, Test.class se habrá cargado con el ClassLoader del sistema (es decir, el que cargó JUnitCore), por lo tanto, técnicamente ninguno de sus métodos de prueba habrá sido anotado con esa anotación.

La solución es cargar JUnitCore en el mismo ClassLoader que las pruebas mismas.

Editar : en respuesta a la pregunta del usuario3486675, debe crear un ClassLoader que no delegue en el cargador de clases del sistema, por ejemplo:

private static final class IsolatedURLClassLoader extends URLClassLoader { private IsolatedURLClassLoader(URL[] urls) { // Prevent delegation to the system class loader. super(urls, null); } }

Pase este conjunto de URL que incluye todo lo que necesita. Puede crear esto filtrando el classpath del sistema. Tenga en cuenta que no puede simplemente delegar en el ClassLoader padre, porque esas clases luego se cargarían por eso en lugar del ClassLoader de sus clases de prueba.

Luego, debe iniciar todo el trabajo JUnit de una clase cargada por este ClassLoader. Se pone complicado aquí. Algo como esta absoluta inmundicia a continuación:

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)); } } }

ENTONCES, necesitas invocar al corredor a través de la reflexión:

Class<?> runnerClass = isolatedClassLoader.loadClass(ClassLoaderIsolatedTestRunner.class.getName()); // Invoke via reflection (List.class is OK because it just uses the string form of it) Object runner = runnerClass.newInstance(); Method method = runner.getClass().getMethod("run_invokedReflectively", List.class); method.invoke(...);


Obtuve este error porque no creé mi propio conjunto de pruebas correctamente:

Así es como lo hice correctamente:

Pon esto en Foobar.java :

public class Foobar{ public int getfifteen(){ return 15; } }

Pon esto en FoobarTest.java :

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); } }

Descargar junit4-4.8.2.jar Utilicé el de aquí:

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

Compilarlo:

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

Ejecutarlo:

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

Una prueba aprobada.