Junit avant la classe ( non statique )
Sont là des pratiques exemplaires pour obtenir Junit exécuter une fonction qu'une seule fois dans un fichier de test , et il convient également de ne pas être statique.
comme @BeforeClass
non statique de la fonction?
Ici est un vilain solution :
@Before void init(){
if (init.get() == false){
init.set(true);
//do once block
}
}
eh bien, ce est quelque chose que je ne veux pas le faire , et je suis à la recherche intégrée à junit solution.
- Intérêt, pourquoi essayez-vous de faire?
- Eh bien , j'ai un assez gros hiérarchie de fichiers de test , et de la base de fichiers de test , j'ai besoin de la possibilité de remplacer cette action dans l'enfant de classes de test.
- j'ai eu le même problème que la première de nombreuses paramétrées, les tests doivent effectuer un de connexion.
- Notez que le "vilain" de la solution, la seule qui fonctionne avec la plaine JUnit, ne prenez pas de déchirure tests de fin de compte.
Vous devez vous connecter pour publier un commentaire.
Si vous ne souhaitez pas configurer les initialiseurs statiques pour un temps d'initialisation et ne sont pas spécifiques sur l'utilisation de JUnit, jetez un oeil à TestNG. TestNG prise en charge non-statique, un temps d'initialisation avec une variété d'options de configuration, tous les à l'aide d'annotations.
Dans TestNG, ce serait l'équivalent de:
Pour le démontage,
Pour la TestNG équivalent de JUnit 4
@Before
et@After
, vous pouvez utiliser@BeforeMethod
et@AfterMethod
respectivement.Une simple instruction if semble fonctionner très bien aussi:
@AfterClass
l'équivalent de larmes vers le bas après tous les tests ont exécuté?À l'utilisation d'un constructeur vide est la solution la plus simple. Vous pouvez toujours remplacer le constructeur dans la classe étendue.
Mais il n'est pas optimale avec tout l'héritage. C'est pourquoi JUnit 4 utilise les annotations à la place.
Une autre option est de créer un helper dans une usine/util classe et de laisser cette méthode de faire le travail.
Si vous êtes à l'aide de Printemps, vous devriez envisager d'utiliser la
@TestExecutionListeners
annotation.Quelque chose comme ce test:
Du printemps
AbstractTestExecutionListener
contient par exemple cette méthode vide que vous pouvez remplacer:REMARQUE: à NE PAS négliger/miss
DependencyInjectionTestExecutionListener
tandis que l'ajout deTestExecutionListeners
. Si vous le faites, tous les autowires seranull
.beforeTestClass()
appelée avant ou après le contexte initialisé?Facilement utiliser
@BeforeAllMethods
/@AfterAllMethods
annotations d'exécuter une méthode à l'intérieur de l'instance de contexte (non statique), où tous les injecté valeurs seront disponibles.Il existe une bibliothèque de test pour cette:
https://mvnrepository.com/artifact/org.bitbucket.radistao.test/before-after-spring-test-runner/0.1.0
https://bitbucket.org/radistao/before-after-spring-test-runner/
La seule limitation: ne fonctionne que pour les Printemps tests.
(Je suis le développeur de cette bibliothèque de test)
Je n'ai jamais essayé, mais peut-être que vous pouvez créer un constructeur sans argument et que vous appelez la fonction à partir de là?
L'article de discuter de 2 très belles solutions à ce problème:
Suffit d'utiliser
@BeforeClass
:Il ne fait pas de sens pour
init
non-statique car chaque test est exécuté dans une instance distincte. L'instanceque
init
est exécuté sur ne correspondraient pas à l'instance de test.La seule raison que vous pourriez voulez qu'il soit non-statique est de le remplacer dans les sous-classes, mais vous pouvez le faire
avec des méthodes statiques trop. Utiliser le même nom, et seule la sous-classe
init
méthode sera appelée.Mise à JOUR: voir le commentaire de Cerise pour lesquelles la suggestion ci-dessous est erronée. (Am gardant la réponse ici plutôt que de supprimer le commentaire peut fournir des informations utiles à d'autres, pourquoi ce n'est pas travail.)
une Autre option à considérer si l'aide de l'injection de dépendance (par exemple, Printemps) est@PostConstruct
. Ce sera la garantie d'injection de dépendance est complète, ce qui ne serait pas le cas dans un constructeur:@Before
et@After
méthodes sera appelé 6 fois! Ainsi, dans ce contexte@PostConstruct
se comporte comme@Before
annotation. Vous pouvez tout simplement le tester: il suffit de mettre 2 méthodes d'essai en classe de test, ajouter@PostConstruct public void init() {System.out.println("started");}
et de voir dans les journaux de combien de temps il est imprimé.@Test
exécuter: "exécuter la méthode, JUnit d'abord construit une nouvelle instance de la classe appelle ensuite la méthode annotée."