我试图在我的Android项目中使用Cucumber-JVM
我可以很好地运行示例(android-test
和cukeulator-test
)。
当我将cuc-android引入我自己的Maven项目时,我得到了下面的MissingStepDefinitionError
。好像黄瓜机器人并不知道在哪里可以找到它的步骤。最初我认为org.picocontainer.paranamer.NullParanamer
导致了问题,但示例项目也有这个错误,它们运行得很好。所以这可能是一个红鲱鱼。
任何帮助或建议都将受到赞赏。
Maven输出:
[INFO] Device 015d46d41a300612_asus_Nexus7 found.
[INFO] 015d46d41a300612_asus_Nexus7 : Running instrumentation tests in com.myapp.tests
[INFO] 015d46d41a300612_asus_Nexus7 : Run started: com.myapp.tests, 1 tests:
[INFO] 015d46d41a300612_asus_Nexus7 : Start [1/1]: Feature Test#Scenario Testing
[INFO] 015d46d41a300612_asus_Nexus7 : ERROR:Feature Test#Scenario Testing
[INFO] 015d46d41a300612_asus_Nexus7 : cucumber.runtime.android.MissingStepDefinitionError:
@When("^I test$")
public void i_test() throws Throwable {
// Write code here that turns the phrase above into concrete actions
throw new PendingException();
}
at cucumber.runtime.android.AndroidInstrumentationReporter.endOfScenarioLifeCycle(AndroidInstrumentationReporter.java:146)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at cucumber.runtime.Utils$1.call(Utils.java:34)
at cucumber.runtime.Timeout.timeout(Timeout.java:13)
at cucumber.runtime.Utils.invoke(Utils.java:30)
at cucumber.runtime.RuntimeOptions$1.invoke(RuntimeOptions.java:179)
at $Proxy2.endOfScenarioLifeCycle(Native Method)
at cucumber.runtime.model.CucumberScenario.run(CucumberScenario.java:52)
at cucumber.runtime.model.CucumberFeature.run(CucumberFeature.java:116)
at cucumber.api.android.CucumberInstrumentationCore.onStart(CucumberInstrumentationCore.java:131)
at cucumber.api.android.CucumberInstrumentation.onStart(CucumberInstrumentation.java:21)
at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1701)
[INFO] 015d46d41a300612_asus_Nexus7 : End [1/1]: Feature Test#Scenario Testing
[INFO] 015d46d41a300612_asus_Nexus7 : Run ended: 0 ms
[ERROR] 015d46d41a300612_asus_Nexus7 : FAILURES!!!
[INFO] Tests run: 1, Failures: 0, Errors: 1
Maven依赖:
<dependency>
<groupId>info.cukes</groupId>
<artifactId>cucumber-android</artifactId>
<version>1.1.6</version>
<type>apklib</type>
</dependency>
<dependency>
<groupId>info.cukes</groupId>
<artifactId>cucumber-core</artifactId>
<version>1.1.6</version>
</dependency>
<dependency>
<groupId>info.cukes</groupId>
<artifactId>cucumber-picocontainer</artifactId>
<version>1.1.6</version>
</dependency>
Logcat输出:
03-31 14:14:19.511 17089-17089/? D/cucumber-android﹕ Found CucumberOptions in class com.myapp.tests.MyActivitySteps
03-31 14:14:19.511 17089-17089/? D/cucumber-android﹕ @cucumber.api.CucumberOptions(dotcucumber=, dryRun=false, features=[features], format=[], glue=[], monochrome=false, name=[], snippets=UNDERSCORE, strict=false, tags=[])
...
03-31 14:14:20.401 17089-17104/? D/cucumber-android﹕ Feature: Test (features/helloworld.feature)
03-31 14:14:20.411 17089-17104/? E/dalvikvm﹕ Could not find class 'org.picocontainer.paranamer.NullParanamer', referenced from method org.picocontainer.paranamer.AnnotationParanamer.<init>
03-31 14:14:20.421 17089-17104/? W/dalvikvm﹕ VFY: unable to resolve new-instance 2070 (Lorg/picocontainer/paranamer/NullParanamer;) in Lorg/picocontainer/paranamer/AnnotationParanamer;
03-31 14:14:20.421 17089-17104/? D/dalvikvm﹕ VFY: replacing opcode 0x22 at 0x0000
03-31 14:14:20.421 17089-17104/? D/dalvikvm﹕ DexOpt: unable to opt direct call 0x29a6 at 0x02 in Lorg/picocontainer/paranamer/AnnotationParanamer;.<init>
03-31 14:14:20.441 17089-17104/com.sbg.mobile.tablet D/cucumber-android﹕ Scenario: Testing
03-31 14:14:20.441 17089-17104/com.sbg.mobile.tablet D/cucumber-android﹕ Given I have a test
03-31 14:14:20.441 17089-17104/com.sbg.mobile.tablet D/cucumber-android﹕ When I test
03-31 14:14:20.461 17089-17104/com.sbg.mobile.tablet W/cucumber-android﹕ @Given("^I have a test$")
public void i_have_a_test() throws Throwable {
// Write code here that turns the phrase above into concrete actions
throw new PendingException();
}
03-31 14:14:20.461 17089-17104/com.sbg.mobile.tablet W/cucumber-android﹕ @When("^I test$")
public void i_test() throws Throwable {
// Write code here that turns the phrase above into concrete actions
throw new PendingException();
}
答案 0 :(得分:1)
我能够通过反复试验找出问题。
首先尝试将我的步骤定义从src/main
移到src/test
,但这并没有帮助。
最终起作用的是确保步骤defs 不在与@CucumberOptions
注释相同的类中。它没有意义,因为这是示例的设置方式,它们可以正常工作。但是在我的项目中,如果步骤定义带有选项注释,则不会选择步骤定义。同一个包中的另一个Java类很好。
有点奇怪。