J'ai une classe de base abstraite, que j'utilise comme base pour mes tests unitaires (TestNG 5.10). Dans cette classe, j'initialise tout l'environnement pour mes tests, la configuration des mappages de bases de données, etc. Cette classe abstraite a une méthode avec une @BeforeClass
annotation qui effectue l'initialisation.
Ensuite, j'étends cette classe avec des classes spécifiques dans lesquelles j'ai des @Test
méthodes et aussi des @BeforeClass
méthodes. Ces méthodes effectuent une initialisation spécifique à la classe de l'environnement (par exemple, mettre certains enregistrements dans la base de données).
Comment puis-je appliquer un ordre spécifique des @BeforeClass
méthodes annotées? J'ai besoin que ceux de la classe de base abstraite soient exécutés avant ceux de la classe d'extension.
Exemple:
abstract class A {
@BeforeClass
doInitialization() {...}
}
class B extends A {
@BeforeClass
doSpecificInitialization() {...}
@Test
doTests() {...}
}
Commande attendue:
A.doInitialization
B.doSpecificInitialization
B.doTests
Commande réelle:
B.doSpecificInitialization // <- crashes, as the base init is missing
(A.doInitialization // <---not executed
B.doTests) // <-/
la source
dependsOnMethods
solution de contournement a fait l'affaire. Bien que je préfère une approche "superclasse d'abord" ...edit: La réponse ci-dessous est pour JUnit , mais je la laisserai quand même ici, car cela pourrait être utile.
Selon l' API JUnit : "Les méthodes @BeforeClass des superclasses seront exécutées avant celles de la classe actuelle."
J'ai testé cela, et cela semble fonctionner pour moi.
Cependant, comme @Odys le mentionne ci-dessous, pour JUnit, vous devez nommer les deux méthodes différemment, car sinon, seule la méthode de la sous-classe sera exécutée car le parent sera masqué.
la source
J'ai ajouté
public
à la classe abstraite et TestNG (6.0.1) a exécuté le doInitialization () avantdoTests
. TestNG ne s'exécute pasdoInitialization()
si je retirepublic
de la classe A.la source
B
également une@BeforeClass
méthode -annotée, comme dans le cas de l'OP.Je viens d'essayer votre exemple avec 5.11 et j'obtiens le @BeforeClass de la classe de base invoquée en premier.
Pouvez-vous publier votre fichier testng.xml? Peut-être que vous spécifiez à la fois A et B ici, alors que seul B est nécessaire.
N'hésitez pas à suivre la liste de diffusion testng-users et nous pourrons examiner votre problème de plus près.
- Cédric
la source
Je viens de passer par là et j'ai trouvé un autre moyen d'y parvenir. Utilisez simplement
alwaysRun
sur@BeforeClass
ou@BeforeMethod
dans la classe abstraite, fonctionne comme vous vous en doutez.la source
Quand je cours depuis: JUnitCore.runClasses (TestClass.class); Il exécutera le parent correctement, avant l'enfant (Vous n'avez pas besoin de super.SetUpBeforeClass (); ) Si vous l'exécutez depuis Eclipse: Pour une raison quelconque, il ne parvient pas à exécuter la classe de base. Le contournement: Appelez la classe de base explicitement: ( BaseTest.setUpBeforeClass (); ) Vous souhaiterez peut-être avoir un indicateur dans la classe de base au cas où vous l'exécutiez à partir d'une application, pour déterminer si elle est déjà configurée ou non. Donc, il ne s'exécute qu'une seule fois si vous l'exécutez via les deux méthodes possibles (telles que depuis eclipse pour des tests personnels et via ANT pour une version de build).
Cela semble être un bogue avec Eclipse, ou du moins des résultats inattendus.
la source
Pour JUnit : Comme @fortega l'a mentionné: Selon l'API JUnit: "Les méthodes @BeforeClass des superclasses seront exécutées avant celles de la classe actuelle."
Mais veillez à ne pas nommer les deux méthodes avec le même nom . Dans ce cas, la méthode parent sera masquée par le parent enfant. Source .
la source
Que diriez-vous d'avoir votre méthode @BeforeClass appeler une méthode specificBeforeClass () vide qui peut ou non être écrasée par des sous-classes comme ceci:
la source
dependsOnMethod
peut être utilisé.par exemple dans le cas de Spring (
AbstractTestNGSpringContextTests
)la source
Vérifiez votre déclaration d'importation. Ça devrait être
import org.testng.annotations.BeforeClass;
ne pas
import org.junit.BeforeClass;
la source
Cela fonctionne pour moi -
la source
Pourquoi n'essayez-vous pas de créer une méthode abstraite doSpecialInit () dans votre super classe, appelée à partir de votre méthode annotée BeforeClass dans superclass.
Les développeurs qui héritent de votre classe sont donc obligés d'implémenter cette méthode.
la source
Il existe une autre solution simple ici.
Ma situation particulière est que je dois injecter des services fictifs de "BeforeClass" dans la sous-classe avant que "BeforeClass" dans la superclasse ne soit exécuté.
Pour ce faire, utilisez simplement a
@ClassRule
dans la sous-classe.Par exemple:
J'espère que ça aide. Cela peut exécuter efficacement la configuration statique dans l'ordre «inverse».
la source
J'ai rencontré un problème similaire aujourd'hui, la seule différence était qu'une classe de base n'était pas abstraite
Voici mon cas
Il s'est produit qu'une
@BeforeClass
méthode de la classe A n'a jamais été exécutée.En jouant avec les modificateurs de confidentialité, j'ai trouvé que TestNG n'exécutera pas une
@BeforeClass
méthode annotée à partir d'une classe héritée si une méthode n'est pas visible d'un héritier de classeDonc cela fonctionnera:
En conséquence, ce qui suit se produit:
la source
Dans mon cas (JUnit), j'ai les mêmes méthodes appelées setup () dans la classe de base et la classe dérivée. Dans ce cas, seule la méthode de la classe dérivée est appelée, et je la fais appeler la méthode de la classe de base.
la source
Une manière meilleure et plus propre d'y parvenir en utilisant l'héritage peut être la suivante:
la source