web-dev-qa-db-fra.com

Des tests paramétrés avec Mockito en utilisant JUnit @Rule?

Cela fait suite à cette question : où on me demande de commencer une nouvelle question.

Le problème est que je ne connais pas suffisamment JUnit Rule, ou ce qui se passe ici avec Runners et autres, pour résoudre le problème de la manière dont Jeff Bowman y a fait allusion.

13
mike rodent

Dans vos commentaires ultérieurs, j'ai compris l'écart: vous devez utiliser Mockito comme règle et paramétré comme coureur, et non l'inverse.

La raison en est que le Runner est responsable de la notification du nombre de tests et que Parameterized manipule le nombre de tests en fonction du nombre de méthodes de test et du nombre d'entrées paramétrées, il est donc très important que Parameterized fasse partie du processus Runner. . En revanche, l'utilisation d'un runner ou d'une règle Mockito consiste simplement à encapsuler le @Before et @After méthodes qui initialisent les annotations Mockito et valident l'utilisation de Mockito, ce qui peut être fait très facilement comme @Rule qui fonctionne à côté d'autres @Rule instances - au point que le MockitoJUnitRunner est très presque obsolète .

Pour crib directement à partir de la page de document JUnit4 Parameterized Test et MockitoRule doc:

@RunWith(Parameterized.class)
public class YourComponentTest {

    @Rule public MockitoRule rule = MockitoJUnit.rule();
    @Mock YourDep mockYourDep;

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

    private int fInput;

    private int fExpected;

    public YourComponentTest(int input, int expected) {
        fInput = input;
        fExpected = expected;
    }

    @Test
    public void test() {
        // As you may surmise, this is not a very realistic example of Mockito's use.
        when(mockYourDep.calculate(fInput)).thenReturn(fExpected);
        YourComponent yourComponent = new YourComponent(mockYourDep);
        assertEquals(fExpected, yourComponent.compute(fInput));
    }
}
24
Jeff Bowman