Citrus TestNG测试数据提供程序不匹配。

huangapple go评论165阅读模式
英文:

Citrus TestNG test Data Provider Mismatch

问题

I get an exception - data provider mismatch when trying to get citrus context with a data provider

This is the test and the data provider

@DataProvider(name = "todoDataProvider")
public Object[][] todoDataProvider() {
  return new Object[][] {
    new String[] {"todo1", "Description: todo1"},
    new String[] {"todo2", "Description: todo2"},
    new String[] {"todo3", "Description: todo3"}
  };
}

@Test(dataProvider = "todoDataProvider")
@CitrusTest
@Parameters({"name", "description", "context"})
public void testProvider(
    String name, String description, @CitrusResource @Optional TestContext context) {

  variable("todoId", "citrus:randomUUID()");
  //   this.name(todoName);
  echo(name);
}

org.testng.internal.reflect.MethodMatcherException:
Data provider mismatch
Method: testProvider([Parameter{index=0, type=java.lang.String, declaredAnnotations=[]}, Parameter{index=1, type=java.lang.String, declaredAnnotations=[]}, Parameter{index=2, type=com.consol.citrus.context.TestContext, declaredAnnotations=[@com.consol.citrus.annotations.CitrusResource(), @org.testng.annotations.Optional(value=null)]}])
Arguments: [(java.lang.String)todo1,(java.lang.String)Description: todo1]
at org.testng.internal.reflect.DataProviderMethodMatcher.getConformingArguments(DataProviderMethodMatcher.java:49)
at org.testng.internal.Invoker.injectParameters(Invoker.java:1293)
at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1187)
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:114)
at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:251)
at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:77)

英文:

I get an exception - data provider mismatch when trying to get citrus context with a data provider

This is the test and the data provider

 @DataProvider(name = "todoDataProvider")
  public Object[][] todoDataProvider() {
    return new Object[][] {
      new String[] {"todo1", "Description: todo1"},
      new String[] {"todo2", "Description: todo2"},
      new String[] {"todo3", "Description: todo3"}
    };
  }

  @Test(dataProvider = "todoDataProvider")
  @CitrusTest
  @Parameters({"name", "description", "context"})
  public void testProvider(
      String name, String description, @CitrusResource @Optional TestContext context) {

    variable("todoId", "citrus:randomUUID()");
    //   this.name(todoName);
    echo(name);
  }

> org.testng.internal.reflect.MethodMatcherException:
Data provider mismatch
Method: testProvider([Parameter{index=0, type=java.lang.String, declaredAnnotations=[]}, Parameter{index=1, type=java.lang.String, declaredAnnotations=[]}, Parameter{index=2, type=com.consol.citrus.context.TestContext, declaredAnnotations=[@com.consol.citrus.annotations.CitrusResource(), @org.testng.annotations.Optional(value=null)]}])
Arguments: [(java.lang.String)todo1,(java.lang.String)Description: todo1]
at org.testng.internal.reflect.DataProviderMethodMatcher.getConformingArguments(DataProviderMethodMatcher.java:49)
at org.testng.internal.Invoker.injectParameters(Invoker.java:1293)
at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1187)
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:114)
at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:251)
at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:77)

答案1

得分: 1

以下是您提供的代码部分的中文翻译:

Citrus参数似乎被注入到传递的数据提供程序参数中,因此数据提供程序需要包括Citrus参数的空间。

找到了一个修复Citrus变量与数据提供程序一起传递的问题的修复,更重要的是对我来说更有用的单元测试。因此,对单元测试进行了测试,看起来在数据提供程序中需要为每个Citrus变量注入/传递null。

@DataProvider(name = "todoDataProvider")
public Object[][] todoDataProvider() {
  return new Object[][] {
    new String[] {"todo1", "描述:todo1", null},
    new String[] {"todo2", "描述:todo2", null},
    new String[] {"todo3", "描述:todo3", null}
  };
}

@Test(dataProvider = "todoDataProvider")
@CitrusTest
@Parameters({"name", "description", "context"})
public void testProvider(
    String name, String description, @CitrusResource @Optional TestContext context) {

  variable("todoId", "citrus:randomUUID()");
  echo(name);
}

@Test(dataProvider = "testData")
@Parameters({"data", "temp", "runner", "context"})
@CitrusTest
public void injectResourceRunnerCombinedWithParameter(
    String data,
    String test,
    @CitrusResource TestRunner testRunner,
    @CitrusResource TestContext context) {
  final String number = Functions.randomNumber(10L, context);
  context.setVariable("message", "注入成功!");

  testRunner.echo("${message}");
  testRunner.echo("${data}");
  testRunner.createVariable("random", number);

  testRunner.run(
      new AbstractTestAction() {
        @Override
        public void doExecute(TestContext context) {
          Assert.assertEquals(context.getVariable("random"), number);
        }
      });
}

@DataProvider
public Object[][] testData() {

  return new Object[][] {{"你好", "测试", null, null}, {"再见", "测试", null, null}};
}
英文:

The citrus parameters seem to get injected into the data provider parameters that are passed, so the data provider needs to include space for the citrus parameters.

found
https://github.com/citrusframework/citrus/commit/952204eaacf672677a01cc66f3385f64cd08f8d4
which had a fix for passing citrus variables with data provider, but more importantly/useful to me, unit tests. So played with unit tests and looks like the null is required in the data provider for each citrus variable to be injected/passed.

 @DataProvider(name = "todoDataProvider")
public Object[][] todoDataProvider() {
return new Object[][] {
new String[] {"todo1", "Description: todo1", null},
new String[] {"todo2", "Description: todo2", null},
new String[] {"todo3", "Description: todo3", null}
};
}
@Test(dataProvider = "todoDataProvider")
@CitrusTest
@Parameters({"name", "description", "context"})
public void testProvider(
String name, String description, @CitrusResource @Optional TestContext context) {
variable("todoId", "citrus:randomUUID()");
//   this.name(todoName);
echo(name);
}
@Test(dataProvider = "testData")
@Parameters({"data", "temp", "runner", "context"})
@CitrusTest
public void injectResourceRunnerCombinedWithParameter(
String data,
String test,
@CitrusResource TestRunner testRunner,
@CitrusResource TestContext context) {
final String number = Functions.randomNumber(10L, context);
context.setVariable("message", "Injection worked!");
testRunner.echo("${message}");
testRunner.echo("${data}");
testRunner.createVariable("random", number);
testRunner.run(
new AbstractTestAction() {
@Override
public void doExecute(TestContext context) {
Assert.assertEquals(context.getVariable("random"), number);
}
});
}
@DataProvider
public Object[][] testData() {
return new Object[][] {{"hello", "test", null, null}, {"bye", "test", null, null}};
}

huangapple
  • 本文由 发表于 2020年1月7日 00:31:13
  • 转载请务必保留本文链接:https://go.coder-hub.com/59615660.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定