cucumber-android无法在项目中找到步骤定义(MissingStepDefinitionError)

时间:2014-03-31 12:49:42

标签: android cucumber-jvm

我试图在我的Android项目中使用Cucumber-JVM 我可以很好地运行示例(android-testcukeulator-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();
    }

1 个答案:

答案 0 :(得分:1)

我能够通过反复试验找出问题。

首先尝试将我的步骤定义从src/main移到src/test,但这并没有帮助。

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

有点奇怪。