最新的Groovy稳定版本令人困惑的问题

mik*_*ent 2 testing groovy mocking gradle

我刚刚开始了一个新的Gradle项目.在我之前的build.gradles中,我一直在这样做:

compile 'org.codehaus.groovy:groovy-all:2.4.15'
testCompile 'org.spockframework:spock-core:1.1-groovy-2.4'
Run Code Online (Sandbox Code Playgroud)

......还有这些依赖关系:

testCompile 'net.bytebuddy:byte-buddy:1.6.11'
testCompile 'org.objenesis:objenesis:2.6'
Run Code Online (Sandbox Code Playgroud)

通过反复试验的过程,我发现Groovy 2.4.15带有这些Bytebuddy和Objensis依赖项使我能够模拟BufferedReader.这在我想模拟用户输入到控制台的控制台应用程序中证明是有用的.因此,"控制台处理程序"类具有以下字段/属性:

def br = new BufferedReader( new InputStreamReader(System.in, 'UTF-8' ))
Run Code Online (Sandbox Code Playgroud)

在app类中使用如下来获取用户控制台输入:

String response = br.readLine().trim()
Run Code Online (Sandbox Code Playgroud)

...这意味着Spock测试可以做这样的事情:

def 'prompt should show help on entering H'()  {
    given:
    consoleHandler.br = Mock( BufferedReader )
    consoleHandler.br.readLine() >> 'h'
Run Code Online (Sandbox Code Playgroud)

即模拟控制台上字母h的输入.

...但它不适用于Groovy 2.5.3及其匹配的Spock依赖项:对于这个新项目,我把:

compile 'org.codehaus.groovy:groovy-all:2.5.3'
testCompile 'org.spockframework:spock-core:1.2-groovy-2.5'
Run Code Online (Sandbox Code Playgroud)

...具有相同的ByteBuddy和Objenisis依赖项.我得到以下测试失败:

java.lang.IllegalArgumentException异常:无法在net.bytebuddy.TypeCache.findOrInsert(TypeCache.java:140)在net.bytebuddy.TypeCache $ WithInlineExpunction.findOrInsert(TypeCache.java:346)在net.bytebuddy.TypeCache.findOrInsert创建类型(TypeCache.java:161)在net.bytebuddy.TypeCache $ WithInlineExpunction.findOrInsert(TypeCache.java:355)在org.spockframework.mock.runtime.ByteBuddyMockFactory.createMock(ByteBuddyMockFactory.java:41)在org.spockframework.mock. runtime.ProxyBasedMockFactory.create(ProxyBasedMockFactory.java:42)在org.spockframework.mock.runtime.JavaMockFactory.createInternal(JavaMockFactory.java:58)在org.spockframework.mock.runtime.JavaMockFactory.create(JavaMockFactory.java:38)在org.spockframework.mock.runtime.CompositeMockFactory.create(CompositeMockFactory.java:42)在org.spockframework.lang.SpecInternals.createMock(SpecInternals.java:46)在org.spockframework.lang.SpecInternals.createMockImpl(SpecInternals.java :294)在org.spockframework.lang.SpecInternals.creat eMockImpl(SpecInternals.java:284)在org.spockframework.lang.SpecInternals.MockImpl(SpecInternals.java:100)在core.FirstSpec.setup(first_tests.groovy:20)

产生的原因:java.lang.NoSuchMethodError:net.bytebuddy .dynamic.loading.ClassInjector $ UsingLookup.isAvailable()Z org.spockframework.mock.runtime.ByteBuddyMockFactory.determineBestClassLoadingStrategy(ByteBuddyMockFactory.java:103)at org.spockframework.mock.runtime.ByteBuddyMockFactory.access $ 300(ByteBuddyMockFactory.java: 27)在org.spockframework.mock.runtime.ByteBuddyMockFactory $在org.spockframework.mock.runtime.ByteBuddyMockFactory $ 1.call 1.call(ByteBuddyMockFactory.java:54)(ByteBuddyMockFactory.java:43)在net.bytebuddy.TypeCache.findOrInsert (TypeCache.java:138)

任何Groovyüber-geeks在那里?

Szy*_*iak 8

你必须升级byte-buddy:

testCompile 'net.bytebuddy:byte-buddy:1.8.21'
Run Code Online (Sandbox Code Playgroud)

Spock版本1.1-groovy-2.4取决于byte-buddy:1.6.5- https://mvnrepository.com/artifact/org.spockframework/spock-core/1.1-groovy-2.4

Spock版本1.2-groovy-2.5取决于byte-buddy:1.8.21- https://mvnrepository.com/artifact/org.spockframework/spock-core/1.2-groovy-2.5