Spock 在接口中未出现的动态方法上抛出 MissingMethodException

Spock throws MissingMethodException on dynamic method that is not presented in interface

我有 groovy.lang.GroovyObject 扩展的接口。实现者 class 没有 public 构造函数并且包含未在界面中显示的动态方法。

我正在尝试这样做:

def bean = Stub(GroovyObject)
bean.getResults() >> ['result1', 'results2']

调用时:

bean.getResults() 

它会抛出 groovy.lang.MissingMethodException。 事实上我没有进行接口契约,我只需要确保存根对象 returns 预期列表。

我也不能存根实现 class,它会抛出 CannotCreateMockException。

看来我终于自己找到了解决办法。

必须使用 GroovyStub 而不是 Stub。这将不允许对 stubed class 的方法进行验证。 GroovyObject 接口也不起作用,必须使用 GroovyObjectSupport 抽象 class:

def bean = GroovyStub(GroovyObjectSupport) 
bean.getResults() >> ['result1', 'results2']
assert bean.getResults() == ['result1', 'results2']