2013-03-30 20 views
1

我正在運行一個奇怪的問題。讓我解釋一下: 我從xml傳入一組輸入數據,然後使用JAXB解析xml。然後使用testng數據提供者將此java對象傳遞給我的測試方法。 這裏有一些相關的代碼: TESTDATA XML: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(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; 
    } 

} 

到目前爲止一切正常,就像一個魅力和我我沒有看到任何問題。

現在我正在編寫另一個測試用例的另一種測試方法。對於我已經加入以下我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()] [];

但要添加到選擇基於名稱的數組,所以儘管初始化已經爲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