在Spock中模拟groovy.sql的运行时异常

6

我在StackOverflow和Google上搜索了一段时间,试图找到正确的配置/语法,以便在Spock Specification中运行此代码:

Sql mockSql = Mock()

然而,当我运行单元测试时,CGLIB会抛出一个让人不爽的异常:
java.lang.IllegalAccessError: tried to access method groovy.sql.Sql.<init>()V from class groovy.sql.Sql$$EnhancerByCGLIB$$d0b7cd7f
at org.spockframework.mock.runtime.MockInstantiator.instantiate(MockInstantiator.java:33)
at org.spockframework.mock.runtime.ProxyBasedMockFactory$CglibMockFactory.createMock(ProxyBasedMockFactory.java:92)
at org.spockframework.mock.runtime.ProxyBasedMockFactory.create(ProxyBasedMockFactory.java:49)
at org.spockframework.mock.runtime.JavaMockFactory.create(JavaMockFactory.java:51)
at org.spockframework.mock.runtime.CompositeMockFactory.create(CompositeMockFactory.java:44)
at org.spockframework.lang.SpecInternals.createMock(SpecInternals.java:47)
at org.spockframework.lang.SpecInternals.createMockImpl(SpecInternals.java:282)
at org.spockframework.lang.SpecInternals.MockImpl(SpecInternals.java:83)

我看了这个问题/答案 - Mock static method with GroovyMock or similar in Spock - 希望它能给我一个好的起点,但是在我的情况下被模拟的类groovy.Sql是一个Groovy类,所以我不确定这是否是正确的起点。
我已经成功地使用GroovyMock在其他单元测试中测试了Groovy.Sql,但我希望可能我只是错过了一些可以使Spock魔法和Groovy SQL一起愉快的东西。如果我只是错过了答案,请谅解 - 希望我没有重复别人的询问。

这个能用吗?https://github.com/nickmcdowall/Groovy-Examples/blob/master/SpockExamples/src/test/groovy/interactions/InteractionsTest.groovy Spock和Groovy的版本是什么? - tim_yates
Spock是0.7版本,Groovy是2.2.2版本。Sql sql = Mock(Sql)我刚试过了,但没有成功。看起来可能是类路径或兼容性问题,因为其他人似乎没有这种模拟的问题。 - Jason Lowenthal
Spock spock 0.7-groovy-2.0 是吧?你能在一个全新的项目中尝试它吗? - tim_yates
我会试一试。依赖版本正确。 - Jason Lowenthal
1
你是否已将 objenesis 添加到你的测试运行时类路径中? - Peter Niederwieser
@peter-niederwieser 看起来 objenesis 就是那个东西。如果你把它作为答案,我会接受并投票支持它。 - Jason Lowenthal
1个回答

7

在使用Spock模拟类(而不是接口)时,建议将objenesis-1.2或更高版本添加到测试运行时类路径中(除了CGLIB)。否则,Spock将无法避免执行要模拟的类的构造函数,这可能会产生不良影响。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接