2015-10-06 2 views
1
не виртуальной

Я пытаюсь настроить простой тест в Groovy с Спком с помощью Betamax:Betamax с весной Ботинками бросает незаконное использование вызова функции

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 

Без Spring Boot на пути это прекрасно работает. Похоже на проблемы с некоторыми версиями. У кого-то была аналогичная проблема?

Мой полный 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

Я нашел решение. Проблема заключалась в неправильных версиях причала и httpclient. BetaMax требует версий, показанных ниже, в то время как родительский pom Spring объявляет гораздо более новые версии.

Добавление эти две строки свойств в моей 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 - другой).

Смежные вопросы