英文:
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}};
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论