web-dev-qa-db-fra.com

Contournement non statique de JUnit @BeforeClass pour l'application Spring Boot

L'annotation @BeforeClass de JUnit doit être déclarée statique si vous souhaitez qu'elle s'exécute une fois avant toutes les méthodes @Test. Cependant, cela ne peut pas être utilisé avec l'injection de dépendance.

Je souhaite nettoyer une base de données que je @Autowire avec Spring Boot, une fois avant d'exécuter mes tests JUnit. Je ne peux pas @Autowire champs statiques donc je dois penser à un moyen de contourner le problème. Des idées?

14
Kingamere

Utilisez simplement @Before (au lieu de @BeforeClass) (ou BeforeTransaction (selon la façon dont vous initialisez la base de données)). Cette annotation doit être attachée à une méthode publique non statique.

Bien sûr: @Before exécuté avant chaque méthode de test (pas comme @BeforeClass qui ne s'exécute qu'une seule fois). Mais si vous voulez l'exécuter exactement une fois, utilisez un champ de marqueur statique.

private static boolean initialized = false;
...
@Before
public void initializeDB() { 
   if (!initialized) {
       ... //your db initialization
       initialized = true;
   }
}
---
25
Ralph

Essayez cette solution: https://stackoverflow.com/a/46274919/907576 :

avec les annotations @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. 

1
radistao

Bien que la réponse acceptée soit intelligente, semble hacky. Avez-vous essayé d'utiliser un constructeur normal? 

public class MyJUnitTest {

    public MyJUnitTest() {
       // code for initializeDB
    }

    // Tests

}
0
Arun Avanathan

Examinez la bibliothèque DBUnit - elle est conçue pour exécuter les actions que vous décrivez. Il peut créer et supprimer des instances de base de données et vous fournit des moyens simples de le faire.

0
TrueDub