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



我已经在StackOverflow和Google周围搜索了一段时间,试图找到能够在Spock规范中运行此代码的正确配置/语法:

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)

我查看了这个问题/答案——在Spock中使用GroovyMock或类似的方法模拟静态方法——希望它可以给我一个好的起点,但是在我的例子中被模拟的类是groovy。Sql是一个groovy类,所以我不确定这是正确的地方开始。

我已经成功地测试了Groovy。在使用GroovyMock的其他单元测试中使用Sql,但我希望也许我只是错过了一些可以使它实现的东西,以便我可以同时使用Spock魔法和Groovy Sql。如果我错过了答案,我很抱歉——希望我没有重复别人的问题。

当用Spock模拟类(而不是接口)时,建议在测试运行时类路径上放置objenesi -1.2或更高版本(除了CGLIB)。否则,Spock将无法避免执行要模拟的类的构造函数,这可能会产生不想要的副作用。

最新更新