java - tutorial - Ejecución de las pruebas de Eclipse Junit Plugin con Junit 4.4 o posterior: ¿por qué no se detectan las pruebas?
pruebas junit en java (9)
Necesito usar JUnit 4.4 (o más reciente) en un conjunto de pruebas de plugins de eclipse, pero me he encontrado con el siguiente problema:
Las pruebas no se detectan cuando se ejecutan con los paquetes junit 4.4 o 4.5 de springsource ( junit44 y junit45 ). El paquete org.junit4 que se puede obtener con eclipse suministra el punto 4.3 (a partir de Ganymead / Eclipse 3.4). El paquete org.junit4 funciona porque identifica y ejecuta las pruebas, pero no es compatible con las últimas versiones de JMock, y necesito usar una biblioteca de burla.
Aquí hay una prueba de muestra:
package testingplugin;
import static org.junit.Assert.*;
import org.junit.Test;
public class ActivatorTest {
@Test
public final void testDoaddTest() {
fail("Not yet implemented");
}
}
Al ejecutar esta prueba, recibo la siguiente excepción:
java.lang.Exception: No runnable methods
at org.junit.internal.runners.TestClassMethodsRunner.run(TestClassMethodsRunner.java:33)
at org.junit.internal.runners.TestClassRunner$1.runUnprotected(TestClassRunner.java:42)
at org.junit.internal.runners.BeforeAndAfterRunner.runProtected(BeforeAndAfterRunner.java:34)
at org.junit.internal.runners.TestClassRunner.run(TestClassRunner.java:52)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:45)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386)
at org.eclipse.pde.internal.junit.runtime.RemotePluginTestRunner.main(RemotePluginTestRunner.java:62)
at org.eclipse.pde.internal.junit.runtime.CoreTestApplication.run(CoreTestApplication.java:23)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.eclipse.equinox.internal.app.EclipseAppContainer.callMethodWithException(EclipseAppContainer.java:574)
at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:195)
at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:110)
at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:79)
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:382)
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:179)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:549)
at org.eclipse.equinox.launcher.Main.basicRun(Main.java:504)
at org.eclipse.equinox.launcher.Main.run(Main.java:1236)
at org.eclipse.equinox.launcher.Main.main(Main.java:1212)
Sin embargo, si cambio las dependencias del proyecto de com.springsource.org.junit a org.junit4, entonces la prueba se ejecuta y falla (como se esperaba).
Estoy ejecutando la prueba como un JUnit Plug-in Test en Eclipse, con los siguientes argumentos del programa:
-os $ {target.os} -ws $ {target.ws} -arch $ {target.arch} -nl $ {target.nl}
Los siguientes complementos seleccionados durante el lanzamiento (seleccionados por mí, luego usé "agregar complementos necesarios" para obtener el resto de las dependencias):
Workspace:
testingPlugin
Target Platform:
com.springsource.org.hamcrest.core (1.1.0)
com.springsource.org.junit (4.5.0)
....and a bunch of others... (nothing related to testing was auto-selected)
Aquí está mi MANIFEST.MF:
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: TestingPlugin Plug-in
Bundle-SymbolicName: testingPlugin
Bundle-Version: 1.0.0
Bundle-Activator: testingplugin.Activator
Import-Package: org.osgi.framework;version="1.3.0"
Bundle-RequiredExecutionEnvironment: JavaSE-1.6
Require-Bundle: com.springsource.org.junit;bundle-version="4.5.0"
Cambiar la última línea a:
Require-Bundle: org.junit4;bundle-version="4.3.1"
Y actualizando los complementos seleccionados en el lanzamiento para:
Workspace:
testingPlugin
Target Platform:
org.junit4 (4.3.1)
...bunches of auto-selected bundles... (again, nothing else test related)
Hace que la prueba se ejecute correctamente (pero con la versión incorrecta de junit).
No sé qué versión de JUnit era, pero para encontrar con éxito la prueba, el nombre de los métodos de prueba debe comenzar con la palabra " prueba ".
En la versión más nueva, simplemente puede marcar la prueba con @Test, para mí funciona en esta combinación:
import static junit.framework.Assert.*;
...
@Test
public void testDummy() throws Exception
ActivatorTest necesita extender TestCase
Tal vez su paquete JUnit falta una entrada en el MANIFEST.MF:
Paquete de importación dinámica: *
Esto es obligatorio para cargar clases de otros paquetes.
Bebbo
No puedo probar esto ahora, ya que no tengo a mano una instalación de Eclipse 3.4, pero hace un tiempo me encontré con un problema similar en (creo) IntelliJ IDEA 7.0.x, y una solución fue especificar explícitamente una prueba corredor.
Con JUnit 4.5:
import org.junit.runners.JUnit4;
@RunWith(JUnit4.class)
public class ActivatorTest {
//...
}
Si esto no funciona, puede tener más éxito con org.junit.runners.BlockJUnit4ClassRunner
Para JUnit 4.4 probaría org.junit.internal.runners.JUnit4ClassRunner
EDITAR: no estoy seguro del com.springsource.
parte porque no uso Springsource. De su pregunta parece que springsource reempaqueta JUnit bajo com.springsource.org.junit
pero usted usa simplemente org.junit
en su código así que me quedaré con eso.
Me pregunto si es posible que deba importar la etiqueta @Test de com.springsource.org.junit y no de org.junit.
Volker
Recientemente tuve algunos problemas de sonido similares con jMock, JUnit y Eclipse, aunque no con las pruebas de complementos .
No estoy seguro de si es relevante, pero lo tengo todo funcionando con las siguientes versiones:
- jmock-2.5.1.jar
- hamcrest-core-1.1.jar
- hamcrest-library-1.1.jar
- jmock-junit4-2.5.1.jar
También encontré que tenía que usar el corredor de prueba JMock así:
import org.junit.Test;
import org.junit.runner.RunWith;
import org.jmock.Mockery;
import org.jmock.Expectations;
import org.jmock.integration.junit4.JUnit4Mockery;
import org.jmock.integration.junit4.JMock;
@RunWith(JMock.class)
public class PublisherTest {
Mockery context = new JUnit4Mockery();
@Test
public void oneSubscriberReceivesAMessage() {
@RunWith (Suite.class) @SuiteClasses ({UserServiceTest.class, ABCServiceTest.class})
clase pública AllTestSuite {
suite de pruebas estática pública () {
return new JUnit4TestAdapter(AllTestSuite .class);
}
}
Creo que el marco de prueba de primavera no es compatible con junio 4.4+
Según mi experiencia, esto sucede si el complemento que contiene las pruebas de complemento no depende de junit. Después de agregar la dependencia junit 4.4 a mi archivo MANIFEST.MF, el error desapareció y todas las pruebas se ejecutaron. La dependencia de junit debe ser opcional porque el complemento generalmente solo lo necesita para el código de prueba.