Esto se puede hacer, pero necesita un poco de trabajo. También debe definir su propio corredor de Suite y su propio Corredor de Prueba, y luego anular runChild() en el corredor de prueba. El uso de las siguientes clases Suite y de prueba:
@RunWith(MySuite.class)
@SuiteClasses({Class1Test.class})
public class AllTests {
}
public class Class1Test {
@Deprecated @Test public void test1() {
System.out.println("" + this.getClass().getName() + " test1");
}
@Test public void test2() {
System.out.println("" + this.getClass().getName() + " test2");
}
}
Tenga en cuenta que he anotada test1()
con @Deprecated
. ¿Quieres hacer algo diferente cuando se tiene la anotación @Deprecated
en la prueba, por lo que necesita extender Suite para utilizar una costumbre Runner
:
public class MySuite extends Suite {
// copied from Suite
private static Class<?>[] getAnnotatedClasses(Class<?> klass) throws InitializationError {
Suite.SuiteClasses annotation = klass.getAnnotation(Suite.SuiteClasses.class);
if (annotation == null) {
throw new InitializationError(String.format("class '%s' must have a SuiteClasses annotation", klass.getName()));
}
return annotation.value();
}
// copied from Suite
public MySuite(Class<?> klass, RunnerBuilder builder) throws InitializationError {
super(null, getRunners(getAnnotatedClasses(klass)));
}
public static List<Runner> getRunners(Class<?>[] classes) throws InitializationError {
List<Runner> runners = new LinkedList<Runner>();
for (Class<?> klazz : classes) {
runners.add(new MyRunner(klazz));
}
return runners;
}
}
JUnit crea una Runner
para cada prueba se ejecutará. Normalmente, Suite simplemente crearía el predeterminado BlockJUnit4ClassRunner
, todo lo que estamos haciendo aquí es anular el constructor para el conjunto que lee las clases de la anotación SuiteClass
y estamos creando nuestros propios corredores con ellos, MyRunner
. Esta es nuestra clase MyRunner:
public class MyRunner extends BlockJUnit4ClassRunner {
public MyRunner(Class<?> klass) throws InitializationError {
super(klass);
}
@Override
protected void runChild(final FrameworkMethod method, RunNotifier notifier) {
Description description= describeChild(method);
if (method.getAnnotation(Ignore.class) != null) {
notifier.fireTestIgnored(description);
} else {
if (description.getAnnotation(Deprecated.class) != null) {
System.out.println("name=" + description.getMethodName() + " annotations=" + description.getAnnotations());
}
runLeaf(methodBlock(method), description, notifier);
}
}
}
mayor parte de esta se copia de BlockJUnit4ClassRunner
.El bit He añadido es:
if (description.getAnnotation(Deprecated.class) != null) {
System.out.println("name=" + description.getMethodName() + " annotations=" + description.getAnnotations());
}
donde probamos la existencia de la @Deprecated
anotación en el método, y hacer algo si está allí. El resto queda como ejercicio para el lector. Cuando ejecuto la suite superior, consigo como salida:
name=test1 annotations=[@java.lang.Deprecated(), @org.junit.Test(expected=class org.junit.Test$None, timeout=0)]
uk.co.farwell.junit.run.Class1Test test1
uk.co.farwell.junit.run.Class1Test test2
Tenga en cuenta que Suite tiene varios constructores dependiendo de la forma en que se invoca. Lo anterior funciona con Eclipse, pero no he probado otras formas de ejecutar la Suite. Vea los comentarios junto con los diversos constructores para Suite para más información.
No creo que sea eso lo que estoy buscando. Quiero algo que se ejecutará entre cada prueba. – ArtB
Pero si tiene un grupo de pruebas, debería ser posible utilizar BeforeMethod y AfterMethod. (Supongo) – ollins
Tal vez, independientemente, necesito usar JUnit y TestNG no es una opción. – ArtB