3

テストクラスとテストメソッドがあります。これは、データ プロバイダーの方法によって異なります。データ プロバイダー メソッドは、テスト クラスまたはその基本クラスの 1 つ以外の別のクラスにあります。TestNGのドキュメントによると

データプロバイダーを別のクラスに配置する場合は、静的メソッドまたは非引数コンストラクターを持つクラスである必要があり、 dataProviderClass 属性で見つけることができるクラスを指定します

テストクラス:

package test;

import org.testng.Assert;
import org.testng.annotations.Test;

import dataprovider.TestDataProvider;

public class TestClass {
      @Test(dataProvider = "get", dataProviderClass=TestDataProvider.class)
      public void test1(String s1, String s2) {
          Assert.assertEquals(s1.length(), s2.length());
      }
}

データ プロバイダー クラス:

package dataprovider;

import org.testng.annotations.DataProvider;

public class TestDataProvider {
    @DataProvider(name = "get")
    public Object[][] testData() {
        return new Object[][] {{"a", "b"},{"c", "d"}};
    }
}

Eclipse からのテスト出力:

    java.lang.RuntimeException: Can't invoke method public java.lang.Object[][] dataprovider.
TestDataProvider.testData() on this instance of class test.TestClass due to class mismatch
    at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:75)
    at org.testng.internal.MethodInvocationHelper.invokeDataProvider(MethodInvocationHelper.java:137)
    at org.testng.internal.Parameters.handleParameters(Parameters.java:430)
    at org.testng.internal.Invoker.handleParameters(Invoker.java:1243)
    at org.testng.internal.Invoker.createParameters(Invoker.java:992)
    at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1082)
    at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:129)
    at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:112)
    at org.testng.TestRunner.privateRun(TestRunner.java:778)
    at org.testng.TestRunner.run(TestRunner.java:632)
    at org.testng.SuiteRunner.runTest(SuiteRunner.java:366)
    at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:361)
    at org.testng.SuiteRunner.privateRun(SuiteRunner.java:319)
    at org.testng.SuiteRunner.run(SuiteRunner.java:268)
    at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
    at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86)
    at org.testng.TestNG.runSuitesSequentially(TestNG.java:1225)
    at org.testng.TestNG.runSuitesLocally(TestNG.java:1150)
    at org.testng.TestNG.runSuites(TestNG.java:1075)
    at org.testng.TestNG.run(TestNG.java:1047)
    at org.testng.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:126)
    at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:137)
    at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:58)

機能していないようです。私はTestNG 6.9.11を使用しており、MavenとEclipseから実行しようとしました。最新の Eclipse-TestNG プラグインを使用しています。

4

4 に答える 4

7

免責事項:外部 dataProvider からの非静的メソッドのサポートを追加したのは私です。

@Guiceクラスを追加するだけです:

@Guice
public class TestClass {
    @Test(dataProvider = "get", dataProviderClass=TestDataProvider.class)
    public void test1(String s1, String s2) {
        Assert.assertEquals(s1.length(), s2.length());
    }
}

これはまだ参照されていない問題です。

于 2016-04-12T09:50:37.737 に答える
0

すでにあなたの質問に答えています。

データ プロバイダーを別のクラスに配置する場合は、静的メソッドまたは引数のないコンストラクターを持つクラスである必要があります。

そして、Java Design Itが機能しないようにする必要があるため、他のクラスからメソッドを呼び出すには、そのメソッドが静的であるか、そのクラスのオブジェクトが必要です。

testDataメソッドは静的ではないため、クラスを使用して呼び出すことができず、引数のないコンストラクターを作成していないため、オブジェクトを作成できません (オブジェクトがないと非静的メソッドを呼び出すことができませんでした)。

私の言いたいことを理解し、あなたの答えが得られることを願っています:)

于 2016-04-12T08:36:31.570 に答える