2015-10-06 71 views
1

的我試圖建立在Groovy一個簡單的測試與斯波克使用的Betamax:的Betamax與Spring引導拋出非法使用非虛函數調用

class BetaMaxSpockTest extends Specification { 

    @Rule 
    public Recorder recorder = new Recorder() 

    @Betamax(tape = "some_tape") 
    def 'You shall pass'() { 
     expect: 
     true 
    } 
} 

我還使用了Spring啓動,所以我有春天啓動-starter父母爲我的父母在pom.xml中:

<parent> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-starter-parent</artifactId> 
    <version>1.2.6.RELEASE</version> 
</parent> 

當我運行上面的測試,我得到這個錯誤:

java.lang.VerifyError: (class: co/freeside/betamax/proxy/jetty/BetamaxProxy, method: super$3$getBean signature: (Ljava/lang/Class;)Ljava/lang/Object;) Illegal use of nonvirtual function call 
at java.lang.Class.forName(Class.java:264) 
at co.freeside.betamax.proxy.jetty.ProxyServer.start(ProxyServer.groovy:47) 
at co.freeside.betamax.Recorder.startProxy(Recorder.groovy:198) 
at co.freeside.betamax.Recorder.withTape(Recorder.groovy:167) 
at co.freeside.betamax.Recorder$1.evaluate(Recorder.groovy:185) 
at org.spockframework.runtime.extension.builtin.MethodRuleInterceptor.intercept(MethodRuleInterceptor.java:40) 
at org.spockframework.runtime.extension.MethodInvocation.proceed(MethodInvocation.java:84) 
at org.spockframework.util.ReflectionUtil.invokeMethod(ReflectionUtil.java:138) 
at org.spockframework.util.ReflectionUtil.invokeMethod(ReflectionUtil.java:138) 
at org.spockframework.util.ReflectionUtil.invokeMethod 

沒有彈簧啓動路徑它工作正常。看起來像一些版本的問題。任何人有類似的問題?

我的全pom.xml中:

<?xml version="1.0" encoding="UTF-8"?> 
    <project xmlns="http://maven.apache.org/POM/4.0.0" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 

    <groupId>com.test</groupId> 
    <artifactId>test</artifactId> 
    <version>1.0-SNAPSHOT</version> 

    <parent> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-parent</artifactId> 
     <version>1.2.6.RELEASE</version> 
    </parent> 

    <properties> 
     <java.version>1.8</java.version> 
     <!--plugins versions--> 
     <maven.compiler.plugin.version>3.3</maven.compiler.plugin.version> 
     <!--settings--> 
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
    </properties> 

    <dependencies> 
     <!--Spring Boot--> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-data-jpa</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-web</artifactId> 
     </dependency> 
     <!--Spock Testing--> 
     <dependency> 
      <groupId>org.spockframework</groupId> 
      <artifactId>spock-core</artifactId> 
      <scope>test</scope> 
     </dependency> 
     <!--Groovy Testing--> 
     <dependency> 
      <groupId>org.codehaus.groovy</groupId> 
      <artifactId>groovy-all</artifactId> 
      <scope>test</scope> 
     </dependency> 
     <!--Betamax Http Mocks--> 
     <dependency> 
      <groupId>co.freeside</groupId> 
      <artifactId>betamax</artifactId> 
      <version>1.1.2</version> 
      <scope>test</scope> 
     </dependency> 
    </dependencies> 

    <build> 
     <plugins> 
      <plugin> 
       <groupId>org.springframework.boot</groupId> 
       <artifactId>spring-boot-maven-plugin</artifactId> 
      </plugin> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-compiler-plugin</artifactId> 
      </plugin> 
     </plugins> 

     <pluginManagement> 
      <--...--> 
     </pluginManagement> 
    </build> 
</project> 
+0

哪個Java版本? –

+0

@tim_yates 1.8 raduy

+0

是的,我可以看到....但是哪個版本的1.8? U60? –

回答

0

我已經找到了解決辦法。問題出在jetty和httpclient的錯誤版本上。 BetaMax需要如下所示的版本,而Spring的父pom聲明瞭更新的版本。

添加此兩線在我的pom.xml特性解決了問題:

<jetty.version>7.3.1.v20110307</jetty.version> 
<httpclient.version>4.2.1</httpclient.version> 

無論如何,感謝您的幫助!

0

有幾件事情可以做,以解決這個問題。首先,你可以在問題@CompileStatic(可能是你的案例中的Spec)中編寫代碼,這通常可以解決問題,但這並不總是可取的(並且並不總是有效)。

你可以做的另一件事是添加-Xverify:none到你的java命令行選項(無論你將其指定爲您的環境)。這將關閉驗證,這是導致錯誤的原因。

從我讀過關於這個問題,當我最初跑了進去,他們計劃在未來的Java版本默認關閉驗證。這通常發生在Groovy或其他一些在封面下進行大量字節碼操作的庫(asm是另一個)。

相關問題