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 ?

4voto

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.

2voto

Utilisez la méthode @PostConstruct de Spring pour effectuer tout le travail d'initialisation et cette méthode s'exécute avant l'exécution de tout @Test.

0voto

radistao Points 1070

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.

0voto

Obi Two Points 1

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.

0voto

SecretService Points 1469

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 ... 
    }

}

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