2017-08-18 5 views
-1

Je suis un débutant à Java, s'il vous plaît consulter le code ci-dessous@Test appelle constructeur de la classe parent dans TestNG Sélénium

//Parent Class 
public class Abc { 
    Abc(){System.out.println("hiii"); 
    } 
} 

//Child Class 

public class CDE extends Abc{ 
    @Test 
    public void Xyz(){ 
     System.out.println("hi"); 
    } 
    } 

Output is coming as 
hiii 
hi 
PASSED: Xyz 

S'il vous plaît aider, je ne sais pas pourquoi le constructeur de la classe mère devient appelé quand je n'utilise même pas le nouveau mot-clé pour créer l'objet. J'ai créé deux classes différentes dans Eclipse. Il ne se passe pas si je crée la méthode principale dans la classe enfant, c'est-à-dire sans utiliser l'annotation TestNG @Test.

+0

Si vous placez un point d'arrêt dans votre code et le parcourez, vous verrez exactement où le constructeur est appelé. Vous devriez passer du temps à apprendre à déboguer vos propres programmes. – JeffC

Répondre

0

Lorsque vous utilisez une annotation @Test de TestNG, voici ce que TestNG fait, dans les coulisses.

  • Il commence par charger votre classe.
  • Il fait une liste de toutes les méthodes annotées TestNG qui sont à exécuter (Pour exemple, @Test, @BeforeClass etc.,) et leur ordonne de la façon TestNG (c.-à-@BeforeSuite, @BeforeTest, @BeforeClass, @Test et ainsi de suite)
  • Il trouve un constructeur par défaut dans votre classe. Si aucun constructeur par défaut n'est trouvé, il essaie de chercher un constructeur à 1 argument qui prend une chaîne.
  • En utilisant la réflexion, la classe est maintenant instanciée.
  • Maintenant, en utilisant l'instance de votre classe de test obtenue par réflexion, TestNG commence à appeler les différentes méthodes annotées dans un ordre prédéfini.

La raison pour laquelle votre constructeur de classe de base est invoquée, est due à TestNG instancier votre classe enfant par réflexion, ce qui déclenche la chaîne de constructeur de l'échelle de l'héritage (Ce qui est ce qu'on appelle Constructor Chaînage)

Vous pouvez tester cette théorie en ajoutant un constructeur à votre classe enfant CDE et en ajoutant un System.out.println. Vous verrez l'instruction d'impression en cours d'exécution.

Lorsque vous faites cela via une méthode main(), il n'y a pas de réflexion, car TestNG n'est pas impliqué.

+0

Merci beaucoup pour cette explication !! –

0

Cela s'appelle Constructor Chaining. Cela se produit par l'utilisation de l'héritage. Une méthode de constructeur de sous-classe appelle TOUJOURS la méthode constructeur de sa superclasse. Cela garantit que la création de l'objet de sous-classe commence avec l'initialisation des classes au-dessus dans la chaîne d'héritage.

Il peut y avoir un nombre quelconque de classes dans une chaîne d'héritage. Chaque méthode constructeur appellera la chaîne jusqu'à ce que la classe en haut ait été atteinte et initialisée. Ensuite, chaque classe suivante est initialisée lorsque la chaîne revient dans la sous-classe d'origine. Ce processus est appelé chaînage de constructeur.

Vous pouvez consulter https://www.thoughtco.com/constructor-chaining-2034057

+0

Je connais ce concept mais je n'ai pas fait de constructeur en classe enfant, c'est une méthode simple comme vous pouvez le voir, il appelle toujours le constructeur de classe parent, si j'utilise @ Test annotation de testng, si je supprime @Test et simplement écrire une méthode principale à la place, tout fonctionne bien –

+0

créez-vous un objet CDE dans la méthode principale, si vous le faites, il doit aussi appeler le constructeur de la classe parent. –