web-dev-qa-db-fra.com

JUnit: @Avant seulement pour certaines méthodes de test?

J'ai un code d'installation commun que j'ai pris en compte pour une méthode marquée par @Before. Cependant, il n'est pas nécessaire que tout ce code s'exécute pour chaque test. Existe-t-il un moyen de le marquer pour que le @Before la méthode ne s'exécute qu'avant certains tests?

40
Nick Heiner

Déplacez simplement les tests qui n'ont pas besoin du code d'installation dans une classe de test distincte. Si vous avez un autre code commun aux tests qui serait utile à conserver, déplacez-le dans une classe d'assistance.

36
Kirschstein

Ou utilisez TestNG . Il vous donne un contrôle plus fin sur les tests.

5
duffymo

@Nested + @ForEach

Entièrement d'accord avec le point de déplacer le code associé vers une classe interne. Voici donc ce que j'ai fait.

  1. Créez une classe interne dans votre classe de test
  2. Annoter la classe interne avec @Nested
  3. Déplacez toutes les méthodes de test que vous souhaitez utiliser dans la classe interne
  4. Écrivez le code init dans la classe interne et annotez-le avec @ForEach

Voici le code:

class Testing {

    @Test
    public void testextmethod1() {

      System.out.println("test ext method 1");

    }

    @Nested
    class TestNest{

       @BeforeEach
       public void init() {
          System.out.println("Init");
       }

       @Test
       public void testmethod1() {
          System.out.println("This is method 1");
       }

       @Test
       public void testmethod2() {
          System.out.println("This is method 2");
       }

       @Test
       public void testmethod3() {
          System.out.println("This is method 3");
       }

     }

     @Test
     public void testextmethod2() {

         System.out.println("test ext method 2");

     }

}

Voici la sortie

test ext method 1
test ext method 2
Init
This is method 1
Init
This is method 2
Init
This is method 3

Remarque: je ne sais pas si cela est pris en charge dans Junit4. Je fais ça dans JUnit5

4
Rohit Singh

Il est possible de réaliser également via Assume de JUnit. Et puis vous pouvez vérifier le nom de la méthode pour laquelle vous souhaitez traiter @Before.

public class MyTest {
     @Rule
     public TestName testName = new TestName();

     @Before
     public void setUp() {
       assumeTrue(testName.getMethodName().equals("myMethodName"));
       // setup follows
     }
}

Consultez le sujet pour plus d'informations sur @Rule.

3
vtor

Je ne suis pas sûr de @Before, mais j'ai récemment proposé une stratégie pour que le bloc @After s'exécute de manière sélective. La mise en œuvre a été simple. J'ai des indicateurs définis sur des valeurs par défaut dans le cadre de la classe de test. Ils sont réinitialisés aux valeurs par défaut dans la classe @Before. Dans la classe, j'ai besoin de faire des choses spécifiques à un indicateur, j'ai défini ces indicateurs et dans @Après avoir vérifié les valeurs d'indicateur pour effectuer les tâches respectives.

0
Pocha