He creado un corredor personalizada mediante la extensión Suite
:
public class MyRunner extends Suite {
public MyRunner(Class<?> klass, RunnerBuilder builder) throws InitializationError {
super(klass, builder);
}
@Override
public void run(RunNotifier notifier) {
notifier.addListener(new MyRunListener());
notifier.fireTestRunStarted(getDescription());
super.run(notifier);
}
}
Como se ve en run
esta registeres una MyRunListener
que se parece a esto:
class MyRunListener extends RunListener {
@Override
public void testRunStarted(Description description) {
System.err.println("1: run started");
}
@Override
public void testStarted(Description description) {
System.err.println("2: test started");
}
@Override
public void testFinished(Description description) {
System.err.println("3: test finished");
}
@Override
public void testRunFinished(Result result) {
System.err.println("4: run finished");
}
}
He añadido 1:
, 2:
, 3:
y 4:
de acuerdo con el orden en el que espero que estos métodos a ser llamados.
a continuación, he creado un conjunto de pruebas que tiene la siguiente apariencia:
@RunWith(MyRunner.class)
@Suite.SuiteClasses({ MyTest.class })
public class MyTestSuite {
}
Y la siguiente prueba:
public class MyTest {
@BeforeClass
public static void beforeClass() {
System.err.println("A: beforeClass");
}
@Before
public void before() {
System.err.println("B: before");
}
@Test
public void test() {
System.err.println("C: Running actual test...");
}
@After
public void after() {
System.err.println("D: after");
}
@AfterClass
public static void afterClass() {
System.err.println("E: afterClass");
}
}
Una vez más, la salida de etiquetado de conformidad con el orden que espero.
Aquí está la salida consigo cuando corro MyTestSuite
a través de IntelliJ (como una configuración de ejecución JUnit):
2: test started
B: before
C: Running actual test...
D: after
3: test finished
E: afterClass
4: run finished
1: run started
A: beforeClass
¿Por qué demonios estoy recibiendo ese orden de salida? Debo estar haciendo algo muy mal en mi corredor, pero yo sólo he implementado de acuerdo con tutoriales en la web. (Usando JUnit 4.12)
Como @DmitryB sugiere en los comentarios, parece ser algún tipo de búfer de salida. Las diversas partes de la salida luego se sutura juntos de una manera extraña después de la prueba ha terminado.
Añadí Thread.sleep(1000)
después de cada impresión y así es como se ve cuando lo ejecuto en IntelliJ:
La solución por ahora es utilizar la configuración de ejecución de la tarea Gradle en lugar de la JUnit uno.
Archivado este billete en JetBrains.