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?Edit : Je viens de découvrir en déboguant que la classe est instanciée avant chaque test également. Je suppose que l'annotation @BeforeClass est la meilleure ici.
Vous pouvez également configurer sur le constructeur, la classe de test es une classe après tout. Je ne sais pas si c'est une mauvaise pratique car presque toutes les autres méthodes sont annotées, mais ça marche. Vous pourriez créer un constructeur comme ça :
public UT () {
// initialize once here
}
@Test
// Some test here...
Le ctor sera appelé avant les tests car ils ne sont pas statiques.
Essayez cette solution : https://stackoverflow.com/a/46274919/907576 :
avec @BeforeAllMethods
/ @AfterAllMethods
vous pouvez exécuter n'importe quelle méthode de la classe Test dans un contexte d'instance, où toutes les valeurs injectées sont disponibles.
Ma sale solution est :
public class TestCaseExtended extends TestCase {
private boolean isInitialized = false;
private int serId;
@Override
public void setUp() throws Exception {
super.setUp();
if(!isInitialized) {
loadSaveNewSerId();
emptyTestResultsDirectory();
isInitialized = true;
}
}
...
}
Je l'utilise comme base pour tous mes testCases.
Si vous ne voulez pas forcer la déclaration d'une variable qui est définie et vérifiée sur chaque sous-test, alors ajouter ceci à un SuperTest pourrait faire l'affaire :
public abstract class SuperTest {
private static final ConcurrentHashMap<Class, Boolean> INITIALIZED = new ConcurrentHashMap<>();
protected final boolean initialized() {
final boolean[] absent = {false};
INITIALIZED.computeIfAbsent(this.getClass(), (klass)-> {
return absent[0] = true;
});
return !absent[0];
}
}
public class SubTest extends SuperTest {
@Before
public void before() {
if ( super.initialized() ) return;
... magic ...
}
}