Ao contrário da afirmação em @BeforeClass
annotation javadoc:
/** The <strong i="7">@BeforeClass</strong> methods of superclasses will be run before those the current class. */
O método anotado @BeforeClass
da superclasse não é chamado se houver outra @BeforeClass
subclasse.
public abstract class SuperTest {
<strong i="13">@BeforeClass</strong>
public static void beforeClass() throws Exception {
fail("why don't you call me ?"); // never fails
}
}
public class MyTestA extends SuperTest {
<strong i="14">@BeforeClass</strong>
public static void beforeClass() {
fail("Thanks for calling"); // fails here
}
<strong i="15">@Test</strong>
public void test() {
fail("Failure expected from MyTestA.beforeClass()");
}
}
public class MyTestB extends SuperTest {
<strong i="16">@BeforeClass</strong>
public static void beforeClass() {
}
<strong i="17">@Test</strong>
public void test() {
fail("Failure expected from SuperTest.beforeClass()"); // fails here
}
}
O método na superclasse é obscurecido pelo método com o mesmo nome na subclasse. Se você der nomes diferentes aos métodos @BeforeClass , eles serão executados na ordem correta.
obrigado taral, o problema está resolvido então. Uma pequena menção no javadoc de @BeforeClass pode ser útil.
Aprendi a mesma coisa da maneira mais difícil. Como @gonzen disse, uma pequena menção em javadoc pode nos ajudar a evitar a situação por completo. Se fizer sentido, posso adicioná-lo ao javadoc e enviar um patch.
@amalakar , um patch javadoc seria definitivamente apreciado!
Aqui está a solicitação de pull: https://github.com/KentBeck/junit/pull/504
Eu também.
Eu com havia uma observação importante sobre: http://junit.sourceforge.net/javadoc/org/junit/Before.html dizendo que você deveria ver http://junit.org/javadoc/latest/ em vez disso, + um link para os novos documentos do readme.
Comentários muito úteis
O método na superclasse é obscurecido pelo método com o mesmo nome na subclasse. Se você der nomes diferentes aos métodos @BeforeClass , eles serão executados na ordem correta.