Junit 4 - @BeforeClass e @AfterClass fora da ordem ao executar suite de testes

Olá pessoal!
Aí vai outra dúvida com o JUnit, mas, esta é um pouco diferente da que eu havia postado antes: http://www.guj.com.br/posts/list/226751.java.
É o seguinte: usando o JUnit 4, quando crio um TestCase isolado e indico os métodos “static” que serão @BeforeClass e @AfterClass… ao executar o testecase, os métodos executam de forma correta, ou seja: @BeforeClass --> @Test --> @AfterClass.

Porém, quando crio uma suite de testes o método @AfterClass é executado logo depois de @BeforeClass, e antes dos meus métodos de teste “@test” (@BeforeClass --> @AfterClass --> @Test ). Alguém sabe por que isso acontece?

Ps. Minha suite de testes é a do junit 4 também:

@RunWith(value=Suite.class)
@SuiteClasses(value={
	AutenticacaoTest.class	
})
public class AllTests4 extends SGPTest {
}

Mais uma vez, obrigado!
Kallás.

Em uma versão mais antiga do JUnit tive um problema similar e encontrei em algum lugar a resposta de que a ordem de execução dos métodos de teste em Suites era indefinida. Assim, não tinha como implementar testes que deveriam ser rodados em uma seqüência definida…

Na época, até comecei a estudar o TestNG (parece que com ele você consegue definir essa ordem), mas acabei refatorando tais testes para se tornarem menos dependentes (com menos dependência temporal, nesse caso).

A[]´s

Rapaziada…

“mczeferino”, quanto à sua resposta sobre o outro tópico, também acabei de fazer isso: refatorei os métodos para ficarem independentes e e não necessitarem que um seja sequência de outro…

Quanto ao problema deste novo tópico, consegui identificar porque os métodos @BeforeClass e @AfterClass não executavam na ordem correta: todos os testcase que temos herdam de uma superclasse comum, para reutilização de recursos comuns. Dessa forma, executando-se o testcase de maneira isolada, ele executa os métodos indicados com @BeforeClass e @AfterClass de forma correta (antes e depois da classe).

A questão que descobri é que a classe que será a suite de testes, a partir da qual os outros testcase serão chamados, não pode herdar da superclasse comum que usamos para conter as implementações comuns.

Removendo a herança, os métodos @BeforeClass e @AfterClass de todos os testcase, chamados a partir da classe suite, passaram a executar na ordem correta… (só não sei o motivo pelo qual isso ocorre…). A classe suite ficou assim:

@RunWith(value=Suite.class)  
@SuiteClasses(value={AutenticacaoTest.class})  
public class AllTests4 {  
}

Espero ter conseguido esclarecer a situação. Qualquer coisa, podem perguntar que tento explicar melhor como fiz.
Valeu!

Kallás.