2015-09-22 17 views
9

Tôi đang cố gắng thiết lập dự án mẫu cho phương ngữ Java8 của Cucumber. Vấn đề của tôi là, tôi không làm cho nó chạy. Tôi luôn nhận được hệ thống phân cấp ngoại lệ sau:Luôn nhận ngoại lệ "Loại sai tại chỉ mục hồ bơi không đổi" với Cucumber-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, Failures: 0, Errors: 1, Skipped: 0 

Tôi không biết tại sao tôi gặp lỗi này cũng như cách khắc phục.

Tôi đã đóng gói mọi thứ trong dự án Maven. Việc bố trí là như thế:

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

sự phụ thuộc tôi bao gồm trong pom.xml là:

<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> 

Ngoài pom.xml chỉ tải các trình biên dịch và các plugin chạy failsafe.

định nghĩa của tôi về 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 {               
}   

định nghĩa tính năng của tôi:

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 

Và đây là định nghĩa bước của tôi:

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();           
     });                  
    }                    
} 

Bất kỳ ý tưởng những gì tôi đang làm sai ở đây?

+0

Vâng, thông báo ngoại lệ thiếu loại thực tế, nhưng tôi đoán đó là loại '18' và [câu trả lời này] (http://stackoverflow.com/a/23625762/2711488) được áp dụng. Tóm lại, có vẻ như Cucumber không phù hợp với Java 8, trên thực tế, thậm chí nó không tương thích 100% Java 7 sau đó… – Holger

+0

Nó có thể là một Invokedynamic vì có các biểu thức lambda trong hàm tạo của lớp. Nhưng tôi đã cấu hình trình biên dịch thành nguồn và đích phiên bản 1.8 trong tệp pom.xml và đó là các định nghĩa bước và do đó một lớp được biên dịch cục bộ, phải không? –

+0

Như đã nói trong câu trả lời được liên kết, vấn đề là * không * trình biên dịch.Vấn đề là có một công cụ * runtime * để xử lý tệp lớp đã biên dịch, hay còn gọi là bytecode. Nhìn vào phương thức mà ném 'IllegalArgumentException'. – Holger

Trả lời

10

Vấn đề là do phương ngữ Java8 của Cucumber sử dụng các chi tiết triển khai của JDK8 của Oracle.

Tôi đang sử dụng OpenJDK8 được đóng gói bởi Debian gây ra một tổ chức khác của nhóm không đổi. Khi tôi thử cùng với JDK8 của Oracle, mọi thứ hoạt động như mong đợi.

Nếu bạn muốn thử nó cho mình, tôi đã công bố dự án ví dụ hoàn chỉnh trên github: https://github.com/mawis/cucumber-java8-test

tôi cũng báo cáo một lỗi ở theo dõi vấn đề của dưa chuột-JVM ở đây: https://github.com/cucumber/cucumber-jvm/issues/912

Bạn có thể kiểm tra trình theo dõi vấn đề để xem sự cố có được khắc phục trong tương lai hay không.

Bây giờ nếu bạn muốn sử dụng dưa chuột-java8 có vẻ như bạn phải sử dụng triển khai thực hiện JDK của Oracle.

(Sự nổi tiếng để giải quyết vấn đề này thuộc về Holger với ý kiến ​​của mình cho câu hỏi. Tôi chỉ muốn viết câu trả lời này như một bản tóm tắt.)

+1

Vì vậy, nếu tôi đọc chính xác, tôi sẽ thấy điều này làm việc miễn là tôi đang sử dụng JDK của Oracle. Tuy nhiên, tôi nhận được lỗi chính xác giống như áp phích gốc. Tôi đang sử dụng phiên bản Java 1.8.0_60, được tải xuống như một phần của Oracle JDK. –

+5

Dường như cũng phụ thuộc vào phiên bản JDK bạn đang sử dụng. JDK gần đây của Oracle dường như không hoạt động tốt. –

7

Chỉ cần sử dụng 1.2.5 phiên bản mà đã được gần đây phát hành. Nó giải quyết lỗi được tham chiếu bằng câu trả lời được chấp nhận.

Các vấn đề liên quan