2017-09-17 5 views
1

Je reçois une exception NullPointerException lorsque j'essaie d'exécuter des tests test après avoir commandé les méthodes de test en fonction de leurs priorités. J'ai essayé d'ajouter des priorités aux méthodes de test mais pas utile. Est-ce que quelqu'un pourrait m'aider à résoudre cela? Je suis nouveau pour les auditeurs de TestNG.IMethodInterceptor lève NullPointerException tout en réorganisant les méthodes de test

Suite est ma mise en œuvre de IMEthodInterceptor:

public class TestNGImethodInterceptor implements IMethodInterceptor { 

@Override 
public List<IMethodInstance> intercept (List<IMethodInstance> methods, ITestContext context){ 
    List<IMethodInstance> sortedMethods = new ArrayList<IMethodInstance>(); 
    for(IMethodInstance method : methods){ 
     Test testMethod = method.getMethod().getConstructorOrMethod().getMethod().getAnnotation(Test.class); 
     if(testMethod.priority() == 1){ 
      sortedMethods.add(method); 
     } 
    } 
    return sortedMethods; 
} 

} 

Suite est la classe de test:

@Test(groups = {"functest"}) 
public class TestNGAnnotations { 

@BeforeSuite 
public void beforeSuite(){ 
    System.out.println("Before Suite in Super Class"); 
} 

@AfterSuite 
public void afterSuite(){ 
    System.out.println("After Suite in Super Class"); 
} 

@BeforeTest 
public void beforeTest(){ 
    System.out.println("Before Test in Super Class"); 
} 

@AfterTest 
public void afterTest(){ 
    System.out.println("After Test in Super Class"); 
} 

@BeforeClass 
public void beforeClass(){ 
    System.out.println("Before Class in Super Class"); 
} 

@AfterClass 
public void afterClass(){ 
    System.out.println("After Class in Super Class"); 
} 

@BeforeGroups 
public void beforeGroups(){ 
    System.out.println("Before Groups in Super Class"); 
} 

@AfterGroups 
public void afterGroups(){ 
    System.out.println("After Groups in Super Class"); 
} 

@BeforeMethod(alwaysRun=true) 
public void beforeMethod(){ 
    System.out.println("Before Methods in Super Class"); 
} 

@AfterMethod(alwaysRun=true) 
public void afterMethod(){ 
    System.out.println("After Methods in Super Class"); 
} 

@Test(groups = {"functest", "checkintest"}) 
public void test1(){ 
    System.out.println("Test method 1 in super class"); 
} 

@Test(groups = {"functest", "checkintest"}) 
public String test2(){ 
    System.out.println("Test method 2 in super class"); 
    return "Hello"; 
} 

@Test(groups = {"functest"}) 
public void test3(){ 
    System.out.println("Test method 3 in super class"); 
} 

@Test(priority=1,groups = {"checkintest"}) 
public String test4(){ 
    System.out.println("Test method 4 in super class"); 
    return "Hello"; 
} 

@Parameters("param") 
@Test 
public void paramTest(String param){ 
    System.out.println("Parameter received " + param); 
} 

@DataProvider(name = "test1") 
public Object[][] createData1() { 
return new Object[][] { 
    { "Cedric", new Integer(36) }, 
    { "Anne", new Integer(37)}, 
}; 
} 

//This test method declares that its data should be supplied by the Data Provider 
//named "test1" 
@Test(dataProvider = "test1") 
public void verifyData1(String n1, Integer n2) { 
System.out.println(n1 + " " + n2); 
} 

@Test(dataProvider = "create", dataProviderClass=SecondTestNGAnnotation.class) 
public void dpFromOtherClass(Integer i){ 
    System.out.println("DP from other class " + i); 
} 

} 

Suite est la teneur en testng.xml:

<suite name="Test Suite" allow-return-values="true"> 
<parameter name="param" value="Test ParameterSuite"/> 
<listeners> 
    <listener class-name="com.harish.testng.TestNGImethodInterceptor" /> 
</listeners> 
<test name="Test"> 
<parameter name="param" value="Test Parameter"/> 
    <groups> 
     <run> 
      <exclude name="checkintest" /> 
      <include name="functest" /> 
     </run> 
    </groups> 
    <classes> 
     <class name="com.harish.testng.TestNGAnnotations" /> 
    </classes> 
</test> <!-- Test --> 

Ce qui suit est le résultat alors que je tente d'exécuter les tests en utilisant testng.xml:

Before Suite in Super Class 
Before Test in Super Class 
After Test in Super Class 
java.lang.NullPointerException 
at com.harish.testng.TestNGImethodInterceptor.intercept(TestNGImethodInterceptor.java:18) 
at org.testng.TestRunner.intercept(TestRunner.java:794) 
at org.testng.TestRunner.privateRun(TestRunner.java:747) 
at org.testng.TestRunner.run(TestRunner.java:634) 
at org.testng.SuiteRunner.runTest(SuiteRunner.java:425) 
at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:420) 
at org.testng.SuiteRunner.privateRun(SuiteRunner.java:385) 
at org.testng.SuiteRunner.run(SuiteRunner.java:334) 
at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52) 
at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86) 
at org.testng.TestNG.runSuitesSequentially(TestNG.java:1318) 
at org.testng.TestNG.runSuitesLocally(TestNG.java:1243) 
at org.testng.TestNG.runSuites(TestNG.java:1161) 
at org.testng.TestNG.run(TestNG.java:1129) 
at org.testng.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:114) 
at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:251) 
at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:77) 
+2

Copie possible de [Qu'est-ce qu'une exception NullPointerException, et comment la réparer?] (Https://stackoverflow.com/questions/218384/what-is-a-nullpointerexception-and-how-do-i-fix -it) –

Répondre

1

changer votre S'il vous plaît intercepteur à quelque chose comme ci-dessous:

public List<IMethodInstance> intercept(List<IMethodInstance> methods, ITestContext context) { 
    List<IMethodInstance> sortedMethods = new ArrayList<IMethodInstance>(); 
    for (IMethodInstance method : methods) { 
     Test testMethod = method.getMethod().getConstructorOrMethod().getMethod().getAnnotation(Test.class); 
     //testMethod would be "null" for "@DataProvider" annotated methods 
     if (testMethod != null && testMethod.priority() == 1) { 
      sortedMethods.add(method); 
     } 
    } 
    return sortedMethods; 
} 

La raison derrière la NPE est que TestNG est alimentation dans le fournisseur de données méthode annotée ainsi

@DataProvider(name = "test1") 
public Object[][] createData1() { 
    return new Object[][]{ 
      {"Cedric", new Integer(36)}, 
      {"Anne", new Integer(37)}, 
    }; 
} 

à votre intercepteur de méthode, parce que vous avez une annotation niveau de la classe @Test. Mais lorsque vous interrogez l'annotation de la méthode, elle revient à zéro, car cette méthode n'a aucune annotation @Test, mais c'est la classe englobante qui a cette annotation.

Le correctif consiste essentiellement à ajouter une vérification null supplémentaire.

Vous pouvez également vous débarrasser de l'annotation @Test que vous avez ajoutée au niveau de la classe.

+0

Merci! Cela a fonctionné après avoir modifié l'intercepteur comme suggéré par vous. – Harish