7
votes

Quelle est la différence entre utiliser @beforeclass et utiliser une instance ou une variable statique dans Junit 4 Java?

Je suis nouveau au test unitaire. À propos du but d'utiliser @Before Annotation dans Junit 4 . Je ne connais tout simplement pas le point de l'utiliser: xxx

vs xxx

Quelle est la différence?


0 commentaires

7 Réponses :


3
votes

Dans ce cas, il peut ne pas être nécessaire, car l'initialisation est vraiment simple.

Si vous avez une journalisation, une initialisation complexe ou une nécessité de libérer certaines ressources, vous devez utiliser @ Beforeclass et @afterclass


3 commentaires

Vous pouvez utiliser un bloc statique pour faire cette initialisation. static {...} Le seul cas différent est lorsque votre code d'initialisation jette une exception vérifiée


Qu'en est-il de la libération des ressources? Vous ne pouvez pas faire cela dans un bloc statique. Eh bien, vous pouvez, mais pas quand c'est vraiment nécessaire.


Vous pouvez acquérir des ressources en bloc statique et utiliser finaliser (). Pas la meilleure approche. L'API Junit permet au développeur de savoir moins Java et d'écrire un meilleur code)



0
votes

Dans votre exemple particulier - pas beaucoup. Cependant, il existe également une annotation @Before qui fonctionnera avant chaque test de votre classe. Jetez un coup d'œil à http://elftectechy.com / 2011/05/17 / Junit4-avant-vs-beforeclass-après-vs-après-class , il est expliqué bien là-bas.


0 commentaires

2
votes

Presque pas de différence. Mais si le constructeur de sandwich jette une exception, vous ne pouvez pas l'initialiser directement sandwich de nourriture privée statique = nouveau sandwich (); mais doit envelopper l'initialisation avec essayer bloc. Toutefois, la méthode initiale () peut être déclarée sous forme jette myException , de sorte que le cas de test échouera si l'exception est effectivement lancée lors de l'initialisation.


0 commentaires

0
votes

@beforeclass est pour les initialisations statiques.

Les instances créées ici seront réutilisées dans tous vos @Test S

alors que @Before est par @Test .

généralement @beforeclass est réservé aux objets relativement coûteux à instancier.
par exemple. Connexions de base de données


0 commentaires

1
votes

Supposons que vous aviez toutes vos données liées à la nourriture (disons un menu) Configuration au backend dans une table de base de données. Vos cas de test alimentaire pourraient ensuite se rapporter à la mise à jour du menu (toutes les opérations de crudement fondamentalement).

au lieu d'ouvrir une connexion DB pour chaque cas de test (en utilisant @Before ); Il serait sage si vous le faites juste une fois avant d'exécuter tous vos cas de test via une méthode marquée @beforeclass . .

Maintenant, l'utilisation d'une méthode a du sens, car la configuration serait probablement légèrement complexe (vous pouvez décider d'utiliser un conteneur à ressort pour obtenir votre connexion à partir d'un DataSource ) et vous ne pourrez pas y parvenir à une seule ligne dans laquelle vous déclarez votre Connection objet.

De même, vous utiliserez le @afterclass sur Det Down Votre configuration globale (pour tous les cas de test), c'est-à-dire la fermeture de votre connexion de base de données ici.


0 commentaires

2
votes

Je pense que l'idée est comme ça: Vous utilisez @Afterclass vers des ressources gratuites. Ensuite, il est logique d'avoir @beforeclass pour les acquérir. Parce que ce n'est peut-être pas une bonne idée de laisser le développeur à deviner qu'il doit utiliser un bloc statique.


0 commentaires

0
votes

L'héritage ajoute une autre ride:

Disons que vous avez deux tests JUNIT qui prolongent une classe de base commune. Et disons que la classe de base a à la fois un bloc d'initialisateur statique et a @beforeclass méthode. Dans ce cas, le bloc d'initialisateur statique fonctionnera une fois , tandis que la méthode @beforeclass fonctionnera deux fois . .

Donc, si vous avez un très de calcul ou de ressource coûteux que vous avez besoin installé dans un ensemble des cas de test partageant une classe de base commune, vous pouviez alors Utilisez le bloc d'initialisateur statique pour cela.


0 commentaires