6
votes

JUnit 5 tests paramétrés multiples avec les mêmes paramètres - migrer paramétré

Auparavant dans JUnit4, vous pouviez faire quelque chose comme ceci:

public class MyTest {
    @ParameterizedTest
    @MethodSource("data")
    public void testIsEven(int number) {
        assertEquals(true, number % 2 == 0);
    }

    @ParameterizedTest
    @MethodSource("data")
    public void testIsNotOdd(int number) {
        assertEquals(false, number % 2 != 0);
    }

    public static int[] data() {
        return new int[] { 2, 4, 6 } 
    }
}

Cela traversait le tableau, instanciait MyTest avec chacune des valeurs, puis exécutait tout les tests sur chacune de ces instances. Consultez la Documentation paramétrée pour plus de détails. p>

Maintenant, dans JUnit5, les choses ont changé, selon le new docs vous devrez écrire les mêmes tests comme celui-ci:

@RunWith(Parameterized.class)
public class MyTest
{
    private final int number;

    public MyTest(int number) {
        this.play = play;
    }

    @Test
    public void testIsEven() {
        assertEquals(true, number % 2 == 0);
    }

    @Test
    public void testIsNotOdd() {
        assertEquals(false, number % 2 != 0);
    }

    @Parameterized.Parameters
    public static int[] data() {
        return new int[] { 2, 4, 6 } 
    }
}

Vous devez répéter le paramètre et la source de données pour chaque individu tester. Existe-t-il un moyen de faire quelque chose de similaire à JUnit4, où les tests paramétrés fonctionnent sur des instances de la classe instanciée avec les différents paramètres?


3 commentaires

Il existe un problème ouvert pour cela: github.com/junit-team/junit5/issues/ 878


C'est probablement le meilleur problème à surveiller: github.com/junit-team/junit5/issues / 871


@RolandWeisleder, vous aimeriez peut-être répondre à nos commentaires. ;-)


3 Réponses :


1
votes

À ce jour (JUnit 5.3.2 ou 5.4.0-M1), il semble que non.

J'ai essayé de créer une Extension pour gérer un tel cas, mais l'instanciation de classe de test se produit avant que les extensions TestTemplateInvocationContextProvider ne soient prises en compte.

Il ne semble donc pas possible d'avoir plusieurs contextes d'instanciation pour une même classe de test.

Vous pouvez sûrement interroger l'équipe principale à ce sujet en ouvrant un numéro sur le dépôt github JUnit5 .



1
votes

AFAIR junit5 prend en charge les méta-annotations. Vous pouvez définir une annotation personnalisée et la placer sur vos tests à la place:

@MethodSource("data")
@ParameterizedTest
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface OldParameterizedTest {
}

public class MyTest {
    @OldParameterizedTest
    public void testIsEven(int number) {
        assertEquals(true, number % 2 == 0);
    }

    public static int[] data() {
        return new int[] { 2, 4, 6 } 
    }
}


0 commentaires

4
votes

(un résumé des commentaires)

La réutilisation des mêmes paramètres pour toutes / plusieurs méthodes dans une classe de test n'est actuellement (version 5.3.2 et 5.4.0-M1) pas prise en charge. Mais c'est déjà une demande sur laquelle l'équipe JUnit travaille, voir


0 commentaires