Post

Generyczne testy z adnotacją Parameters w JUnit 4

Wydawałoby się, że JUnit jest na tyle prostą biblioteką, iż nic nie jest w stanie nas w niej zaskoczyć. A jednak, odkryłem niedawno ciekawą adnotację @Parameters pozwalającą na generowanie testów z dostarczonych danych. Przykład wiele rozjaśni:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
@RunWith(Parameterized.class) 
public class ParamsTest { 
    private int a;  
    private int b;  
    private int expected;  

    @Parameters  
    public static Collection data() {  
      return Arrays.asList(new Object[][] { { 1, 1, 2 }, { 1, 2, 3 }, { 4, 6, 9 }, { -2, 2, 0 } });  
    }  

    public ParamsTest(int a, int b, int expected) {  
        this.a = a;  
        this.b = b;  
        this.expected = expected;  
    }  

    @Test  
        public void sum() {  
        assertEquals(expected, a + b);  
    }  
}

Należy zwrócić uwagę na dwie rzeczy: brak konstruktora bezargumentowego; normalnie JUnit nie byłby w stanie uruchomić jakiegokolwiek testu z tekiej klasy metoda data() zwraca kolekcję tablic.

JUnit automatycznie dla każdego elementu kolekcji zwróconego przez metodę data() tworzy instancję klasy ParamsTest. A co wstrzykuje do argumentów konstruktora? Oczywiście wartości z tablicy bieżącego elementu kolekcji. Przykładowo pierwszy test:

1
new ParamsTest(1, 1, 2)

Dla każdej instacji klasy ParamsTest zostaną oczywiście wywołane wszystkie testy, zatem nie jeden sum, a cztery: sum[0], sum[1], sum[2], sum[3]. W podanym przykładzie błędem zakończy się test o nazwie sum[2]. Potrafisz powiedzieć czemu?

This post is licensed under CC BY 4.0 by the author.