【问题标题】:Mock final class in Spock在 Spock 中模拟最后一堂课
【发布时间】:2015-12-06 20:00:56
【问题描述】:

spock 可以模拟期末课程吗?如果是这样,怎么做?搜索结果提出了这个gist,这似乎暗示了这一点,但我找不到任何这样做的例子。我还发现论坛帖子说不支持模拟最终课程。

【问题讨论】:

  • 有时,使用 Groovy 最好尝试一下。
  • @cjstehno 我试过了,但遇到了异常。但我想也许有一种我不知道的特殊方法。
  • 简短的回答是否定的,这是一个未解决的问题。 github.com/spockframework/spock/issues/735

标签: mocking final spock


【解决方案1】:

本规范:

@Grab('org.spockframework:spock-core:1.0-groovy-2.4')
@Grab('cglib:cglib-nodep:3.1')

import spock.lang.*

class Test extends Specification {
    def 'lol'() {
        given: 
        def s = Mock(String) {
            size() >> 10
        }

        expect:
        s.size() == 10        
    }
}

以下列异常结束:

JUnit 4 Runner, Tests: 1, Failures: 1, Time: 29 Test Failure:
lol(Test) org.spockframework.mock.CannotCreateMockException:
Cannot create mock for class java.lang.String because Java mocks cannot mock final classes.
If the code under test is written in Groovy, use Groovy mock.

解决方法是使用GroovyMock:

@Grab('org.spockframework:spock-core:1.0-groovy-2.4')
@Grab('cglib:cglib-nodep:3.1')

import spock.lang.*

class Test extends Specification {
    def 'lol'() {
        given: 
        def s = GroovyMock(String) {
            size() >> 10
        }

        expect:
        s.size() == 10        
    }
}

效果很好。

【讨论】:

  • 与 String.length() 的区别可能是因为它是在 Java String 类上定义的,而不是在 Groovy 版本上?这个answer 似乎是这样建议的。
  • @JulianA。这也是我的经验:GroovyMock 似乎对大多数 Java 类的 final 方法没有帮助。我想澄清一下...!
  • 除了使用 GroovyMock 之外,还有其他选择吗? Spock 是否针对此问题提供任何其他解决方法?
【解决方案2】:

有一个第三方库https://github.com/joke/spock-mockable 似乎可以完成这项工作。不知道为什么它不那么受欢迎。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-09
    • 1970-01-01
    • 2014-12-05
    • 1970-01-01
    • 2019-12-04
    • 1970-01-01
    • 2021-06-28
    相关资源
    最近更新 更多