Ho trovato l'uso corretto (o almeno la documentazione) di JUnit molto confuso. Questa domanda serve sia come riferimento futuro che come domanda reale.JUnit confusione: utilizzare 'estende TestCase' o '@Test'?
Se ho capito bene, ci sono due approcci principali per creare ed eseguire un test JUnit:
Approccio A (JUnit 3-style): creare una classe che estende TestCase, e iniziare a metodi di prova con la parola test
. Quando si esegue la classe come test JUnit (in Eclipse), tutti i metodi che iniziano con la parola test
vengono eseguiti automaticamente.
import junit.framework.TestCase;
public class DummyTestA extends TestCase {
public void testSum() {
int a = 5;
int b = 10;
int result = a + b;
assertEquals(15, result);
}
}
Approach B (JUnit 4-style): creare una classe 'normale' e anteporre un @Test
un'annotazione al metodo. Si noti che NON è necessario avviare il metodo con la parola test
.
import org.junit.*;
import static org.junit.Assert.*;
public class DummyTestB {
@Test
public void Sum() {
int a = 5;
int b = 10;
int result = a + b;
assertEquals(15, result);
}
}
La miscelazione dei due sembra non essere una buona idea, si veda ad es. this stackoverflow question:
Ora, le mie domande (e) chiave:
- Qual è l'approccio preferito, o quando si usa uno invece dell'altro?
- L'approccio B consente di verificare le eccezioni estendendo l'annotazione @Test come in
@Test(expected = ArithmeticException.class)
. Ma come si verificano le eccezioni quando si utilizza l'approccio A? Quando si utilizza metodo A, è possibile raggruppare un certo numero di classi di test in una suite di test in questo modo:
TestSuite suite = new TestSuite("All tests");
suite.addTestSuite(DummyTestA.class);
suite.addTestSuite(DummyTestAbis.class);
Ma questo non può essere utilizzata con metodo B (poiché ogni classe di test dovrebbe sottoclasse TestCase). Qual è il modo corretto per raggruppare i test per l'approccio B?
Edit: ho aggiunto le versioni JUnit per entrambi gli approcci
Risposta utile e approfondita, ma non capisco completamente "controlla il messaggio di eccezione". Il controllo di una stringa hardcoded sarà un incubo di manutenzione. Devi aver inteso "controlla le proprietà del tuo specifico tipo di eccezione". – thSoft
@thSoft: non è spesso usato, ma occasionalmente voglio assicurarmi che il metodo di eccezione menzioni il campo incriminato, per esempio. Quindi un semplice 'assertTrue (e.getMessage(). Contains (" foo "))' potrebbe essere utile. –
Anche in JUnit4 questo è un idioma importante quando devi controllare il messaggio o qualche altra proprietà dell'eccezione (come la causa). Il metodo 'expected' controlla solo il tipo. – Yishai