141 votes

Junit - exécuter une fois la méthode d'installation

J'ai créé une classe avec quelques tests et, au lieu d'utiliser la fonction @Before J'aimerais avoir une méthode de configuration qui ne s'exécute qu'une fois avant tous les tests. Est-ce possible avec Junit 4.8 ?

234voto

AlexR Points 60796

Bien que je sois d'accord avec @assylias que l'utilisation de @BeforeClass est une solution classique, mais elle n'est pas toujours pratique. La méthode annotée avec @BeforeClass doit être statique. C'est très gênant pour certains tests qui nécessitent une instance du scénario de test. Par exemple, les tests basés sur Spring qui utilisent @Autowired pour travailler avec les services définis dans le contexte du printemps.

Dans ce cas, j'utilise personnellement les setUp() méthode annotée avec @Before et de gérer ma propre annotation static ( !) boolean drapeau :

private static boolean setUpIsDone = false;
.....
@Before
public void setUp() {
    if (setUpIsDone) {
        return;
    }
    // do the setup
    setUpIsDone = true;
}

97voto

assylias Points 102015

Vous pouvez utiliser le site BeforeClass annotation :

@BeforeClass
public static void setUpClass() {
    //executed only once, before the first test
}

32voto

Brian Points 7072

JUnit 5 possède maintenant une annotation @BeforeAll :

Indique que la méthode annotée doit être exécutée avant tous les @Test de la classe actuelle ou de la hiérarchie de classes ; analogue à JUnit 4, @BeforeClass. Ces méthodes doivent être statiques.

Les annotations du cycle de vie de JUnit 5 semblent avoir enfin trouvé la bonne solution ! Vous pouvez deviner les annotations disponibles sans même regarder (par exemple, @BeforeEach @AfterAll).

10voto

Steve Chambers Points 3303

Quand setUp() se trouve dans une superclasse de la classe de test (par ex. AbstractTestBase ci-dessous), la réponse acceptée peut être modifiée comme suit :

public abstract class AbstractTestBase {
    private static Class<? extends AbstractTestBase> testClass;
    .....
    public void setUp() {
        if (this.getClass().equals(testClass)) {
            return;
        }

        // do the setup - once per concrete test class
        .....
        testClass = this.getClass();
    }
}

Cela devrait fonctionner pour un seul fichier non statique setUp() mais je ne parviens pas à produire un équivalent pour la méthode tearDown() sans s'égarer dans un monde de réflexion complexe... Des points de prime à celui qui y arrivera !

7voto

Deepak Points 1

JUnit 5 @BeforeAll peut être non statique à condition que le cycle de vie de la classe de test soit par classe, c'est-à-dire que l'on annote la classe de test avec une balise @TestInstance(Lifecycle.PER_CLASS) et vous êtes prêt à partir

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X