2017-07-15 86 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(...)。 但是你没有提供足够的细节来帮助你。

相关问题