在 Spock 中模拟最终类

21

Spock能够mock final类吗?如果可以,如何操作?搜索结果出现了这个代码片段,看起来是可以的,但我找不到任何实际操作的例子。同时,我也在论坛上发现有人说mock final类是不被支持的。


有时候,使用 Groovy 最好的方法就是直接尝试一下。 - cjstehno
@cjstehno 我尝试了,但是出现了异常。但我想也许有一种我不知道的特殊方法可以做到这一点。 - Julian A.
简短的回答是不行的,关于这个问题有一个开放的问题。https://github.com/spockframework/spock/issues/735 - Maximiliano De Lorenzo
2个回答

41

本规范:

@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        
    }
}

哪个效果不错。


1
Java String类的定义和Groovy版本不同,所以String.length()的差异可能是由此引起的。这个答案似乎支持这种说法。 - Julian A.
9
@JulianA. 这也是我的经验:GroovyMock 对于大多数 Java 类的 final 方法似乎没有帮助。我想要一些澄清...! - mike rodent
1
除了使用GroovyMock之外,还有其他选项吗?Spock是否提供了解决这个问题的其他方法? - ptk

6

1
我尝试了一下,但它完全没有做任何事情。也许这就是为什么它不受欢迎的原因。 - nasch

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