Ho trovato molto confuso l'uso corretto (o almeno la documentazione) di JUnit. Questa domanda serve sia come riferimento futuro sia come domanda reale.
Se ho capito bene, ci sono due approcci principali per creare ed eseguire un test JUnit:
Approccio A (stile JUnit 3): creare una classe che estende TestCase e avviare i metodi di test 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);
}
}
Approccio B (stile JUnit 4): creare una classe "normale" e anteporre @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);
}
}
Mescolare i due sembra non essere una buona idea, vedi ad esempio questa domanda di StackOverflow :
Ora, le mie domande:
- Qual è l'approccio preferito o quando useresti 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 l'approccio A, è possibile raggruppare un numero di classi di test in una suite di test come questa:
TestSuite suite = new TestSuite("All tests");
suite.addTestSuite(DummyTestA.class);
suite.addTestSuite(DummyTestAbis.class);
Ma questo non può essere usato con l'approccio B (poiché ogni testclass dovrebbe sottoclassare TestCase). Qual è il modo corretto di raggruppare i test per l'approccio B?
Modifica: ho aggiunto le versioni di JUnit ad entrambi gli approcci
extends TestCase
e poi ogni test anche annotato@Test
solo per confondere le cose. :)