2017-07-15 84 views
0

我有一個方法連接到DB並獲取所有用戶的用戶名和密碼。我將該方法傳遞給TestNG @DataProvider,因此@Test可以使用它。使用TestNG @DataProvider時,它返回「[實用程序] [錯誤] [錯誤] java.lang.NullPointerException」當調用一個方法(),返回對象[] []

摘要看起來像這樣

public class testing2 { 
 

 
    @Test(dataProvider = "dp") 
 
    public void f(String userName, String password) { 
 
    System.out.println(userName); 
 
    System.out.println(password); 
 
    } 
 

 
    //Option 1 : Won't work 
 
    //Will return [Utils] [ERROR] [Error] java.lang.NullPointerException 
 
    @DataProvider 
 
    public Object[][] dp() throws ClassNotFoundException, SQLException { 
 
     //Creating an instance from the class where the method is located and then calling that method credentials 
 
     Object[][] data = instance_of_the_class.method_to_fetch_datas_from_DB(); 
 
     return data; 
 

 

 

 
     //Option 2 : works fine 
 
     @DataProvider 
 
     public Object[][] dp() throws ClassNotFoundException, SQLException { 
 
      //Put the logic directly here without calling any method 
 
      //Logic ... 
 
      //Logic ... 
 
      //Logic ... 
 
      //End result is Object[][] data 
 
      return data;

詳細方法如下所示

public Object[][] credentials(String driverClass, 
 
    String DBuserName, String DBpassword, String jdbcAddress, 
 
    String company1, String company2) 
 
throws ClassNotFoundException, SQLException { 
 

 
    Class.forName(driverClass); 
 
    Connection con = DriverManager.getConnection(jdbcAddress, DBuserName, DBpassword); 
 
    Statement s = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); 
 

 

 
    ResultSet rs = s 
 
    .executeQuery("select * from users where COMPANYID = " + company1 + "or COMPANYID = " + company2); 
 

 
    int total = 0; 
 
    while (rs.next() == true) { 
 
    total++; 
 
    } 
 

 

 
    Object[][] data = new Object[total][2]; 
 

 
    rs.beforeFirst(); 
 
    int a = 0; 
 

 
    while (rs.next()) { 
 
    data[a][0] = rs.getString("USERNAME"); 
 
    data[a][1] = rs.getString("PASSWD"); 
 
    a++; 
 
    System.out.println(rs.getString("USERNAME")); 
 
    } 
 

 

 
    return data; 
 
}

我測試噸他的方法分開,它工作正常。

現在在我的主要測試類中,我開始使用這種方法。它看起來像這樣

public class testing2 { 
 
\t 
 
    @Test(dataProvider = "dp") 
 
    public void f(String userName, String password) { 
 
\t System.out.println(userName); 
 
\t System.out.println(password); 
 
    } 
 
    
 
    
 
    @DataProvider 
 
    public Object[][] dp() throws ClassNotFoundException, SQLException { 
 
     //Creating an instance from the class where method credentials() is located and then calling that method credentials 
 
\t Object[][] data =searching.credentials("interbase.interclient.Driver", "DBuserName", "DBpassword", "jdbc:interbase://10.110.10.10:3050/e:/Databases/DATABASE.IB", "5204", "5201"); 
 
\t return data;

當我運行它時,它拋出我

[Utils] [ERROR] [Error] java.lang.NullPointerException 
    at java.lang.Class.forName0(Native Method) 
    at java.lang.Class.forName(Unknown Source) 
    at ssdPage.SSDSearchPage.credentials(SSDSearchPage.java:52) 
    at ssdTest.SSDtest.getData(SSDtest.java:106) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    at java.lang.reflect.Method.invoke(Unknown Source) 
    at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:108) 
    at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:55) 
    at org.testng.internal.MethodInvocationHelper.invokeMethodNoCheckedException(MethodInvocationHelper.java:45) 
    at org.testng.internal.MethodInvocationHelper.invokeDataProvider(MethodInvocationHelper.java:115) 
    at org.testng.internal.Parameters.handleParameters(Parameters.java:509) 
    at org.testng.internal.Invoker.handleParameters(Invoker.java:1308) 
    at org.testng.internal.Invoker.createParameters(Invoker.java:1036) 
    at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1126) 
    at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:126) 
    at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:109) 
    at org.testng.TestRunner.privateRun(TestRunner.java:744) 
    at org.testng.TestRunner.run(TestRunner.java:602) 
    at org.testng.SuiteRunner.runTest(SuiteRunner.java:380) 
    at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:375) 
    at org.testng.SuiteRunner.privateRun(SuiteRunner.java:340) 
    at org.testng.SuiteRunner.run(SuiteRunner.java:289) 
    at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52) 
    at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86) 
    at org.testng.TestNG.runSuitesSequentially(TestNG.java:1301) 
    at org.testng.TestNG.runSuitesLocally(TestNG.java:1226) 
    at org.testng.TestNG.runSuites(TestNG.java:1144) 
    at org.testng.TestNG.run(TestNG.java:1115) 
    at org.testng.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:132) 
    at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:230) 
    at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:76) 

但是,如果我不調用方法憑證(),但我只是把邏輯直接在@DataProvider中,它工作正常。該代碼例子看起來像這樣

public class testing2 { 
 

 
    @Test(dataProvider = "dp") 
 
    public void f(String userName, String password) { 
 
    System.out.println(userName); 
 
    System.out.println(password); 
 
    } 
 

 
    @DataProvider 
 
    public Object[][] dp() throws ClassNotFoundException, SQLException { 
 

 
    Class.forName("interbase.interclient.Driver"); 
 
    Connection con = DriverManager.getConnection("jdbc:interbase://10.110.10.10:3050/e:/Databases/DATABASE.IB", "DBuserName", "DBpassword"); 
 
    Statement s = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); 
 

 

 
    ResultSet rs = s 
 
     .executeQuery("select * from users where COMPANYID = " + "5204" + "or COMPANYID = " + "5201"); 
 

 
    int total = 0; 
 
    while (rs.next() == true) { 
 
     total++; 
 
    } 
 

 

 
    Object[][] data = new Object[total][2]; 
 

 
    rs.beforeFirst(); 
 
    int a = 0; 
 

 
    while (rs.next()) { 
 
     data[a][0] = rs.getString("USERNAME"); 
 
     data[a][1] = rs.getString("PASSWD"); 
 
     a++; 
 
     System.out.println(rs.getString("USERNAME")); 
 
    } 
 

 

 
    return data; 
 
    } 
 
}

爲什麼我不能調用TestNG中@dataProvider返回Object [][]的方法? 爲什麼邏輯必須直接寫入@DataProvider?

謝謝。

+0

你必須找到NPE在哪裏以及爲什麼。 – juherr

+0

謝謝@juherr,我已經添加了完整的異常消息,但對我來說沒有多大幫助。 – keylogger

回答

1

你似乎是觸發從您的數據提供一個NullPointerException,從該行

Object[][] data =searching.credentials("interbase.interclient.Driver", "DBuserName", "DBpassword", "jdbc:interbase://10.110.10.10:3050/e:/Databases/DATABASE.IB", "5204", "5201"); 

我不明白,你在哪裏實例化對象searching。我想這是什麼導致NullPointerException。你能否通過在其定義中加入static關鍵字來嘗試使方法credentials()靜態化?希望能夠爲你解決問題。

+0

好的嘗試,這也是我的第一個想法。但'搜索'是一個類名...;) – juherr

+1

我認爲'搜索'應該是一個'SSDSearchPage'類型的對象。這就是stacktrace向我指示的東西:) –

+0

好的,好的!考試班的名字讓我感到不安! ,p – juherr

-1

您需要添加靜態到您的功能。 來自文檔:

查找數據提供者的類。如果未指定,則會查看當前測試方法 或其基類之一的數據提供程序 。如果指定了此屬性,則提供者方法的數據在指定的類上需要是靜態的。

http://testng.org/doc/documentation-main.html

+0

Thanks @Ron,我試過這個'@DataProvider public static Object [] [] getData()拋出ClassNotFoundException,SQLException {..................}',它仍然拋出我有同樣的錯誤信息。 – keylogger

+0

@keylogger你能提供完整的異常堆棧嗎? – ronhash

+0

謝謝@RonHashimshony,我在主要問題中添加了完整的異常消息。這個例外實際上並沒有告訴我們太多。 – keylogger

1
java.lang.NullPointerException 
    at java.lang.Class.forName0(Native Method) 
    at java.lang.Class.forName(Unknown Source) 
    at ssdPage.SSDSearchPage.credentials(SSDSearchPage.java:52) 

以任何理由,看起來你提供nulldriverClassClass.forName(...)。 但是你沒有提供足夠的細節來幫助你。

相關問題