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 ?
Réponses
Trop de publicités?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;
}
Vous pouvez utiliser le site BeforeClass
annotation :
@BeforeClass
public static void setUpClass() {
//executed only once, before the first test
}
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).
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 !
- Réponses précédentes
- Plus de réponses