加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java-8 – 始终使用Cucumber-Java8获取异常“常量池索引的错误类

发布时间:2020-12-14 16:22:15 所属栏目:Java 来源:网络整理
导读:我正在设计一个用于 Java8方言的示例项目.我的问题是,我没有得到它运行.我总是得到以下异常层次结构: Tests run: 1,Failures: 0,Errors: 1,Skipped: 0,Time elapsed: 0.068 sec FAILURE! - in soy.wimmer.CucumberITFeature: Cucumber with Java8 Time elap
我正在设计一个用于 Java8方言的示例项目.我的问题是,我没有得到它运行.我总是得到以下异常层次结构:
Tests run: 1,Failures: 0,Errors: 1,Skipped: 0,Time elapsed: 0.068 sec <<< FAILURE! - in soy.wimmer.CucumberIT
Feature: Cucumber with Java8  Time elapsed: 0.051 sec  <<< ERROR!
cucumber.runtime.CucumberException: Failed to instantiate class soy.wimmer.CucumberStepdefs
[…]
Caused by: java.lang.reflect.InvocationTargetException: null
[…]
Caused by: cucumber.runtime.CucumberException: java.lang.IllegalArgumentException: Wrong type at constant pool index
[…]
Caused by: java.lang.IllegalArgumentException: Wrong type at constant pool index
    at sun.reflect.ConstantPool.getMemberRefInfoAt0(Native Method)
    at sun.reflect.ConstantPool.getMemberRefInfoAt(ConstantPool.java:47)
    at cucumber.runtime.java8.ConstantPoolTypeIntrospector.getTypeString(ConstantPoolTypeIntrospector.java:37)
    at cucumber.runtime.java8.ConstantPoolTypeIntrospector.getGenericTypes(ConstantPoolTypeIntrospector.java:27)
    at cucumber.runtime.java.Java8StepDefinition.<init>(Java8StepDefinition.java:45)
    at cucumber.runtime.java.JavaBackend.addStepDefinition(JavaBackend.java:162)
    at cucumber.api.java8.En.Given(En.java:190)
    at soy.wimmer.CucumberStepdefs.<init>(CucumberStepdefs.java:8)
[…]

Results :

Tests in error: 
  Failed to instantiate class soy.wimmer.CucumberStepdefs

Tests run: 1,Skipped: 0

我不知道为什么我得到这个错误,也不知道如何解决它.

我把所有东西都包装在Maven项目中.布局是这样的:

./src/test/java/soy/wimmer/CucumberIT.java
./src/test/java/soy/wimmer/CucumberStepdefs.java
./src/test/resources/cucumber/cucumber-java8.feature
./pom.xml

我在pom.xml中包含的依赖关系是:

<dependencies>                                                               
    <dependency>                                                             
        <groupId>info.cukes</groupId>                                        
        <artifactId>cucumber-java8</artifactId>                              
        <version>1.2.3</version>                                             
        <scope>test</scope>                                                  
    </dependency>                                                            

    <dependency>                                                             
        <groupId>info.cukes</groupId>                                        
        <artifactId>cucumber-junit</artifactId>                              
        <version>1.2.3</version>                                             
        <scope>test</scope>                                                  
    </dependency>                                                            

    <dependency>                                                             
        <groupId>junit</groupId>                                             
        <artifactId>junit</artifactId>                                       
        <version>4.12</version>                                              
        <scope>test</scope>                                                  
    </dependency>                                                            
</dependencies>

另外,pom.xml仅加载编译器和故障安全插件.

我的CucumberIT.java定义:

package soy.wimmer;                                                              

import cucumber.api.CucumberOptions;                                             
import cucumber.api.junit.Cucumber;                                              
import org.junit.runner.RunWith;                                                 

@RunWith(Cucumber.class)                                                         
@CucumberOptions(features = "classpath:cucumber")                                
public class CucumberIT {                                                        
}

我的功能定义:

Feature: Cucumber with Java8                                                     
        As a developer                                                           
        I want to use Cucumber-java8                                             
        So that I have nicer step definitions                                    

        Scenario: Let's try it                                                   
                Given I have some dummy code                                     
                When I try to test it                                            
                Then it should work with cucumber-java8

这是我的步骤定义:

package soy.wimmer;                                                              

import cucumber.api.PendingException;                                            
import cucumber.api.java8.En;                                                    

public class CucumberStepdefs implements En {                                    
    public CucumberStepdefs() {                                                  
        Given("^I have some dummy code$",() -> {                                
            // Write code here that turns the phrase above into concrete actions 
            throw new PendingException();                                        
        });                                                                      

        When("^I try to test it$",() -> {                                       
            // Write code here that turns the phrase above into concrete actions 
            throw new PendingException();                                        
        });                                                                      

        Then("^it should work with cucumber-java(d+)$",(Integer arg1) -> {    
            // Write code here that turns the phrase above into concrete actions 
            throw new PendingException();                                        
        });                                                                      
    }                                                                            
}

任何想法我在这里做错什么?

解决方法

这个问题是因为Java8的Cucumber方言使用了Oracle JDK8的实现细节.

我正在使用Debian打包的OpenJDK8,这导致不断的池的不同组织.当我尝试与Oracle的JDK8相同时,一切都按预期工作.

如果您想自己尝试,我在github:https://github.com/mawis/cucumber-java8-test上发布了完整的示例项目

我还在黄瓜jvm的问题跟踪器上报了一个错误:https://github.com/cucumber/cucumber-jvm/issues/912

您可以检查问题跟踪器,看看是否会在以后修复问题.

现在如果你想使用cucumber-java8,你似乎必须使用Oracle的JDK实现.

(解决这个问题的名声属于霍格尔,他对这个问题的评论,我只是想把这个答案写成总结)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读