【问题标题】:Runtime Exception Mocking groovy.sql in SpockSpock 中的运行时异常模拟 groovy.sql
【发布时间】:2014-06-10 18:54:42
【问题描述】:

我已经在 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)

我查看了这个问题/答案 - Mock static method with GroovyMock or similar in Spock - 希望它能给我一个很好的起点,但在我的例子中,被嘲笑的类 groovy.Sql 是一个 groovy 类,所以我不确定它是正确的起点。

我已经在其他使用 GroovyMock 的单元测试中成功地测试了 Groovy.Sql,但我希望我可能只是错过了一些可以使它成功的东西,这样我就可以同时拥有 Spock 魔法和 Groovy SQL。如果我只是在某个地方错过了答案,我深表歉意 - 希望我不会重复别人的询问。

【问题讨论】:

  • 这行得通吗? github.com/nickmcdowall/Groovy-Examples/blob/master/…什么版本的 Spock 和 groovy?
  • Spock 是 0.7,Groovy 是 2.2.2。 Sql sql = Mock(Sql) 我刚试过,没用。看起来这可能是类路径/兼容性问题,因为其他人似乎对这种嘲笑没有问题。
  • Spock spock 0.7-groovy-2.0 是吗?您可以在新建项目中尝试吗?
  • 我会试一试。更正依赖版本。
  • 您是否已将objenesis 添加到您的测试运行时类路径中?

标签: unit-testing groovy spock groovy-sql


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-20
    • 1970-01-01
    • 2014-02-16
    • 1970-01-01
    • 2022-01-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多