代码之家  ›  专栏  ›  技术社区  ›  KhiladiBhaiyya

是否可以在不遵循继承链的Java类中给出@ Prxxx TestNG注释?

  •  0
  • KhiladiBhaiyya  · 技术社区  · 6 年前

    我在SAMPE项目中有3个Java类,但是在不同的包中有:A类、B类和C类。

    类B扩展了类A。类B是我的主要类,我在其中对如下所示的几种方法给出了@test注释:

    Class B extends A {
    
      @Test
      public void Method1(){
          ...
      }
    
      @Test
      public void Method2(){
          ...
      }
    
    }
    

    现在在类A中,它是类B的父类,包含各种@beforexxx和@afterxxx注释方法以及其他方法,如下图所示:

    Class A {
    
      @BeforeTest
      public void Method3(){
          ...
      }
    
      @BeforeMethod
      public void Method2(){
          ...
      }
    
      @AfterMethod
      public void Method2(){
          ...
      }
    
    }
    

    现在,我有了一个C类,它与主类B没有关系。但是我想在C类中使用@aftersuite注释放置一个方法。在调试期间,我发现在类C中,@aftersuite注释的方法没有执行。

    那么,有人能给我一些建议,通过这些建议我可以达到我想要的目标吗?

    1 回复  |  直到 6 年前
        1
  •  2
  •   Xwris Stoixeia    6 年前

    我认为解决你的问题很容易。您需要做的只是将@aftersuite注释放在类A或类B上。

    最好将@beforesuite+@aftersuite仅用于一个 放置(这样你就知道套房前后装的是什么,而不是 必须去所有的类中并最终得到结果。如果你想的话 将来改变一些事情会更容易。

    但你的问题的答案是在A班:

    Class A {
    
      @BeforeTest
      public void Method3(){
          ...
      }
    
      @BeforeMethod
      public void Method2(){
          ...
      }
    
      @AfterMethod
      public void Method2(){
          ...
      }
    
      @AfterSuite
      public void afterSuite(){
          ...
      }
    
    }
    

    如果您有任何问题,请在下面发表评论;但是是的,@after suite注释将在该套件的所有测试完成后执行。所以假设这是开始测试的XML文件:

    <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
    <suite name="AfterSuite">
    
    
      <test name="test1">
        <classes> 
         <class name="tests.A"/>        
         </classes>
      </test>
    
        <test name="test2">
        <classes> 
         <class name="tests.B"/>        
         </classes>
      </test>
    
       <test name="test3">
        <classes> 
         <class name="tests.C"/>        
         </classes>
      </test>
    
    
    </suite>
    

    只要套件中的所有类都是实际测试,那么在哪里使用@aftersuite注释并不重要。您提到了一些调试显示类C无法访问的内容;因此,如果您只是为@aftersuite注释创建了C,那么您可能根本不需要它。实际上,即使将@aftersuite注释放在类B中,它也可以工作。但据我所知,您的testbase是类A(只要其他所有类都扩展它),因此它可能是放置它的更好地方。

    祝你好运!:)

    ps.如果您想要另一个没有继承的解决方案(即仍然保留类C),您需要做的就是将类A的obj创建到类C中。例如:

    Class C {
    A objectOfClassA = new A();
    }