2013-03-30 2 views
1

이상한 문제가 있습니다. 설명해 드리겠습니다 : xml에서 입력 데이터 집합을 전달하고 JAXB를 사용하여 xml을 구문 분석합니다. 이 java 객체는 testng dataprovider를 사용하여 내 테스트 메소드로 전달됩니다. 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 : 지금 모든 매력과 나는 같은 작품

@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; 
    } 

} 

까지 어떤 문제도 보이지 않습니다.

다른 테스트 케이스에 대해 다른 테스트 메소드를 작성 중입니다. 이를 위해 나는이처럼 내 대한 기존 XML에서 다음과 같은 추가 :

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

을 이제 난 내 기존 XML이 추가되면 기존 시험 방법은 작동하지 않습니다. 내가 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) 

: 실행할 때 나는 다음과 같은 예외를 얻고있다. 누군가 도와주세요 !!!

답변

0

가 음, 코드를 기반으로, 그리고 내가 제대로 :) 이해하면

당신은 이름, 당신은 요소의 총 수의 크기에 개체 배열을 초기화 한 다른 세 번째 항목을 추가 할 때,

obj = new Object [testcaseList.size()] []; 초기화가 3 개체에 대해 수행 된 것처럼, 그래서

하지만, 선택적으로 이름을 기준으로 배열에 추가하고, 데이터 만이 사용할 수 있습니다 - 이것은 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 객체라는 것을 알았습니다. 현재 object == null인지 확인하고 있는데 테스트 케이스에서 사용하지는 않지만 해킹과 깨끗한 솔루션이 아닙니다. 더 좋은 방법이 있습니까? – Pratik