A JUnit4 lehetővé teszi, hogy tesztjeinket paraméterezzük a @Parameterized.Parameters annotáció segítségével. Így az egyes teszt metódusok többször is végrehajtódnak az előzőleg meghatározott paraméterek listáján végighaladva.
Példaként nézzük meg a Prime Factors Kata bejegyzésben bemutatott teszteket. A Kata végén kilenc tesztesetet tartalmazott a PrimeFactorsTest osztály:
@Test
public void one() throws Exception {
assertEquals(list(), generate(1));
}
@Test
public void two() throws Exception {
assertEquals(list(2), generate(2));
}
...
@Test
public void nine() throws Exception {
assertEquals(list(3, 3), generate(9));
}
Jól látszik, hogy mind a kilenc teszteset ugyanazt csinálja, csak más-más értékeket használva. A tesztet paraméterezve mindössze egyetlen tesztmetódusra van szükségünk:
@RunWith(Parameterized.class)
public class PrimeFactorsTest {
private final int number;
private final List<Integer> expectedPrimes;
private static List<Integer> list(Integer... integers) {
return Arrays.asList(integers);
}
@Parameters
public static Collection<Object[]> parameters() {
return Arrays.asList(new Object[][] {
{ list(), 1 },
{ list(2), 2 },
{ list(3), 3 },
{ list(2, 2), 4 },
{ list(5), 5 },
{ list(2, 3), 6 },
{ list(7), 7 },
{ list(2, 2, 2), 8 },
{ list(3, 3), 9 }
});
}
public PrimeFactorsTest(List<Integer> expectedPrimes, int number) {
this.expectedPrimes = expectedPrimes;
this.number = number;
}
@Test
public void primeFactorsOfAnyNumber() throws Exception {
assertEquals(expectedPrimes, generate(number));
}
}
Ahhoz, hogy paramétereket használhassunk, először is el kell látni a tesztosztályt egy @RunWith(Parameterized.class) annotációval (1. sor). Kell készítenünk egy olyan konstruktort, amelyik megkapja a változó paramétereket (26. sor). Ezután egy statikus metódust kell készítenünk, és a @Parameterized.Parameters annotációval ellátnunk (12. sor). Ez a metódus fogja egy Collection formájában visszaadni a paramétereket. A teszt futtatása során ezeket a paramétereket kapja meg a konstruktor egymás után.
Tehát a tesztet lefuttatva kilencszer fog végrehajtódni a primeFactorsOfAnyNumber() teszteset különböző értékekkel, és ugyanazt az eredményt kapjuk, mint a Prime Factors Kata végére elkészült kilenc tesztesetet tartalmazó teszt lefuttatása esetén.


