2013-03-30 5 views
1

У меня запуталась странная проблема. Позвольте мне объяснить: Я передаю набор входных данных из xml, а затем с помощью JAXB для синтаксического анализа xml. Этот java-объект затем передается моему тестовому методу с помощью testng dataprovider. Вот некоторые из них связаны код: Testdata XML:Исключение Null Pointer на testng datprovider

<TestData> 
<TestDetails> 
    <testcasename>itemStatusTest</testcasename> 
    <testcasedetails>App in SUPPRESSED Status</testcasedetails> 
    <appid>28371</appid> 
    <status>SUPPRESSED</status> 
    <marketplace /> 
</TestDetails> 
<TestDetails> 
    <testcasename>itemStatusTest</testcasename> 
    <testcasedetails>App in REVIEW Status</testcasedetails> 
    <appid>22559</appid> 
    <status>REVIEW</status> 
    <marketplace /> 
</TestDetails> 
</TestData> 

Метод, который возвращает объект:

private static Object[][] generateTestData(String dataProvider,TestCaseName tcName) throws Exception { 

    Object[][] obj = null; 
    try { 
     JAXBContext jaxbContext = JAXBContext.newInstance(TestData.class); 
     Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller(); 
     TestData testData = (TestData) jaxbUnmarshaller 
       .unmarshal(new FileInputStream(new File(dataProvider) 
         .getAbsoluteFile())); 
     List<TestDetails> testcaseList = testData.getTestDetails(); 
     obj = new Object[testcaseList.size()][]; 
     for (int i = 0; i < testcaseList.size(); i++) { 
      if (testcaseList 
        .get(i) 
        .getTestcasename() 
        .equalsIgnoreCase(tcName.testCaseName())) 
       obj[i] = new Object[] { testcaseList.get(i) }; 
     } 

    } catch (JAXBException e) { 
     e.getMessage(); 
     return null; 
    } 
    return obj; 
} 

и мой DataProvider:

@DataProvider(parallel = true, name = "TestData") 
public Object[][] TestData() { 
    try { 
     Object obj[][]= IngestionTestHelper 
       .generateTestDataForItemStatus(dataProvider); 
     Reporter.log("Size "+obj.length, true); 
     return obj; 
    } catch (Exception e) { 
     Reporter.log(
       "Either XML input is in wrong format or XML is not parsed correctly", 
       true); 
     return null; 
    } 

} 

До сих пор все работает как шарм и I я не вижу никаких проблем.

Теперь я пишу еще один метод тестирования для другого тестового случая. Для этого я добавил следующее в моем exisitng XML, как это:

<TestDetails> 
    <testcasename>itemWorkflowTest</testcasename> 
    <testcasedetails>Validate workflow for iap</testcasedetails> 
    <appid>26120</appid> 
    <status /> 
    <marketplace /> 
</TestDetails> 

Теперь, как только я добавил это в моем существующий XML мой существующий метод испытания не работает. При работе я получаю следующее исключение:

java.lang.NullPointerException 
at org.testng.internal.Invoker.injectParameters(Invoker.java:1333) 
at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1203) 
at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:127) 
at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:111) 
at org.testng.TestRunner.privateRun(TestRunner.java:767) 
at org.testng.TestRunner.run(TestRunner.java:617) 
at org.testng.SuiteRunner.runTest(SuiteRunner.java:334) 
at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:329) 
at org.testng.SuiteRunner.privateRun(SuiteRunner.java:291) 
at org.testng.SuiteRunner.run(SuiteRunner.java:240) 
at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52) 
at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86) 
at org.testng.TestNG.runSuitesSequentially(TestNG.java:1197) 
at org.testng.TestNG.runSuitesLocally(TestNG.java:1122) 
at org.testng.TestNG.run(TestNG.java:1030) 
at org.testng.remote.RemoteTestNG.run(RemoteTestNG.java:111) 
at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:204) 
at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:175) 

Если я удаляю вновь добавленный блок в xml, он начинает работать. Пожалуйста, помогите!

ответ

0

Ну, на основе кода, и если я правильно понял :)

При добавлении третьего пункта имя отличается, Вы инициализируется массив объектов с размером от общего числа элементов,

obj = new Object [testcaseList.size()] [];

Но вы добавляете в массив выборочно на основе имени, так хотя INIT было сделано для 3-х объектов, данные доступны только для 2 - это может быть причиной NPE ..

List<TestDetails> testcaseList = testData.getTestDetails(); 
     obj = new Object[testcaseList.size()][]; 
     for (int i = 0; i < testcaseList.size(); i++) { 
      if (testcaseList 
        .get(i) 
        .getTestcasename() 
        .equalsIgnoreCase(tcName.testCaseName())) 
       obj[i] = new Object[] { testcaseList.get(i) }; 
     } 
+0

Спасибо niharika_neo. Да после отладки я узнал, что причиной NPE является нулевой объект. Я в настоящее время проверяю, если объект == null, то не используйте его в тестовом случае, но его вид взлома, а не чистое решение. Есть ли лучший выход? – Pratik

 Смежные вопросы

  • Нет связанных вопросов^_^