Testing 最新Groovy稳定版本的令人费解的问题

Testing 最新Groovy稳定版本的令人费解的问题,testing,gradle,groovy,mocking,Testing,Gradle,Groovy,Mocking,我刚开始一个新的Gradle项目。在我以前的build.gradles中,我曾说过: compile 'org.codehaus.groovy:groovy-all:2.4.15' testCompile 'org.spockframework:spock-core:1.1-groovy-2.4' 。。。还有这些依赖关系: testCompile 'net.bytebuddy:byte-buddy:1.6.11' testCompile 'org.objenesis:objenesis:2.6

我刚开始一个新的Gradle项目。在我以前的build.gradles中,我曾说过:

compile 'org.codehaus.groovy:groovy-all:2.4.15'
testCompile 'org.spockframework:spock-core:1.1-groovy-2.4'
。。。还有这些依赖关系:

testCompile 'net.bytebuddy:byte-buddy:1.6.11'
testCompile 'org.objenesis:objenesis:2.6'
通过反复试验,我发现Groovy 2.4.15和这些Bytebuddy和Objensis依赖项使我能够模拟
BufferedReader
。这在控制台应用程序中很有用,我想模拟用户对控制台的输入。因此,“控制台处理程序”类具有以下字段/属性:

def br = new BufferedReader( new InputStreamReader(System.in, 'UTF-8' ))
在app类中按如下方式使用以获取用户控制台输入:

String response = br.readLine().trim()
。。。这意味着Spock测试可以做这种事情:

def 'prompt should show help on entering H'()  {
    given:
    consoleHandler.br = Mock( BufferedReader )
    consoleHandler.br.readLine() >> 'h'
i、 e.在控制台模拟字母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'
。。。具有相同的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.createMockImpl(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.DetermineTestClassLoadingStrategy(ByteBuddyMockFactory.java:103) 在 org.spockframework.mock.runtime.ByteBuddyMockFactory.access$300(ByteBuddyMockFactory.java:27) 在 org.spockframework.mock.runtime.ByteBuddyMockFactory$1.call(ByteBuddyMockFactory.java:54) 在 org.spockframework.mock.runtime.ByteBuddyMockFactory$1.call(ByteBuddyMockFactory.java:43) 位于net.bytebuddy.TypeCache.findOrInsert(TypeCache.java:138)


有没有Groovyüber极客?

你必须升级
byte buddy

testCompile 'net.bytebuddy:byte-buddy:1.8.21'
Spock版本
1.1-groovy-2.4
取决于
字节伙伴:1.6.5
-


Spock版本
1.2-groovy-2.5
取决于
byte buddy:1.8.21
-

太好了,谢谢。仍然有点困惑:如果byte buddy是Spock的“依赖项”,为什么Spock在部署和使用给定版本的Spock时不自动下载它?此依赖项标记为可选,这意味着它不参与依赖项版本解析。当您直接在build.gradle中定义
1.6.5
时,这就是得到解决的版本。感谢您的澄清。