Android 无法在项目中找到步骤定义(缺少步骤定义错误)

Android 无法在项目中找到步骤定义(缺少步骤定义错误),android,cucumber-jvm,Android,Cucumber Jvm,我正试图在我的Android项目中使用Cucumber JVM。 我可以很好地运行示例(android测试和cukeulator测试) 当我将cucumber android引入我自己的Maven项目时,我得到了下面的MissingStepDefinitionError。这就好像安卓不知道在哪里可以找到它的步骤。最初我认为是org.picocontainer.paranamer.NullParanamer导致了这个问题,但是示例项目也有这个错误,它们运行得很好。所以这可能是一种转移注意力的手段

我正试图在我的Android项目中使用Cucumber JVM。
我可以很好地运行示例(
android测试
cukeulator测试

当我将cucumber 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>

信息杯
黄瓜机器人
1.1.6
apklib
信息杯
黄瓜核
1.1.6
信息杯
黄瓜皮容器
1.1.6

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();
    }
03-3114:14:19.5117089-17089/?D/秘书长﹕ 在com.myapp.tests.MyActivitySteps类中找到CucumberOptions
03-31 14:14:19.511  17089-17089/? D/秘书长﹕ @cucumber.api.CucumberOptions(dotccumber=、dryRun=false、features=[features]、format=[]、glue=[]、monology=false、name=[]、snippets=下划线、strict=false、tags=[])
...
03-31 14:14:20.401  17089-17104/? D/秘书长﹕ 功能:测试(功能/helloworld.Feature)
03-31 14:14:20.411  17089-17104/? E/dalvikvm﹕ 找不到从方法org.picocontainer.paranamer.AnnotationParanamer引用的类“org.picocontainer.paranamer.NullParanamer”。
03-31 14:14:20.421  17089-17104/? W/dalvikvm﹕ VFY:无法在Lorg/picocontainer/paranamer/AnnotationParanamer中解析新实例2070(Lorg/picocontainer/paranamer/NullParanamer;);
03-31 14:14:20.421  17089-17104/? D/dalvikvm﹕ VFY:在0x0000处替换操作码0x22
03-31 14:14:20.421  17089-17104/? D/dalvikvm﹕ DexOpt:无法在Lorg/picocontainer/paranamer/AnnotationParanamer;中的0x02处选择直接调用0x29a6;。
03-31 14:14:20.441 17089-17104/com.sbg.mobile.tablet D/android﹕ 场景:测试
03-31 14:14:20.441 17089-17104/com.sbg.mobile.tablet D/android﹕ 因为我要考试
03-31 14:14:20.441 17089-17104/com.sbg.mobile.tablet D/android﹕ 当我测试的时候
03-31 14:14:20.461 17089-17104/com.sbg.mobile.tablet W/android﹕ @给定(“^I有一个测试$”)
public void i_有一个测试()可丢弃{
//在这里编写代码,将上面的短语转化为具体的行动
抛出新的PendingException();
}
03-31 14:14:20.461 17089-17104/com.sbg.mobile.tablet W/android﹕ @当(^I test$)时
public void i_test()抛出可丢弃的{
//在这里编写代码,将上面的短语转化为具体的行动
抛出新的PendingException();
}

通过反复试验,我终于找出了问题所在

首先,我尝试将步骤定义从
src/main
移动到
src/test
,但没有任何帮助

最终起作用的是确保步骤def不在使用
@CucumberOptions
注释的同一类中。这是没有意义的,因为这就是示例的设置方式,它们工作正常。但在我的项目中,如果步骤定义在带有选项注释的类中,则不会拾取它们。同一个包中的另一个Java类也可以


有点奇怪。

我的步骤当然是根据示例项目在com.myapp.tests.MyActivitySteps.java中定义的。是的,web上的大多数示例都过时了。