Come è stato detto in altre risposte, l'ordine in cui JUnit trova i metodi non è garantito, quindi l'ordine di esecuzione dei metodi @Before
non può essere garantito. Lo stesso vale per @Rule
, soffre della stessa mancanza di garanzia. Se questo sarà sempre lo stesso codice, non vi è alcun motivo di dividere in due metodi.
Se si dispone di due metodi, e, soprattutto, se si desidera utilizzarli da più luoghi, allora è possibile combinare regole utilizzando un RuleChain, che è stato introdotto a 4.10. In questo modo l'ordine specifico di regole, come ad esempio:
public static class UseRuleChain {
@Rule
public TestRule chain= RuleChain
.outerRule(new LoggingRule("outer rule"))
.around(new LoggingRule("middle rule"))
.around(new LoggingRule("inner rule"));
@Test
public void example() {
assertTrue(true);
}
}
Questo produce:
starting outer rule
starting middle rule
starting inner rule
finished inner rule
finished middle rule
finished outer rule
Così è possibile effettuare l'aggiornamento a 4.10 o semplicemente rubare la classe.
Nel tuo caso, puoi definire due regole, una per l'installazione del client e una per l'oggetto, e combinarle in un RuleChain
. Utilizzando ExternalResource.
public static class UsesExternalResource {
private TestRule clientRule = new ExternalResource() {
@Override
protected void before() throws Throwable {
setupClientCode();
};
@Override
protected void after() {
tearDownClientCode()
};
};
@Rule public TestRule chain = RuleChain
.outerRule(clientRule)
.around(objectRule);
}
così avrete il seguente ordine di esecuzione:
clientRule.before()
objectRule.before()
the test
objectRule.after()
clientRule.after()
fonte
2012-02-03 16:10:33
che dire di un baseclass? altrimenti non vedo alcun punto contro i metodi ... – wuppi