Groovy MockFor - 如何在模拟上处理对“with”方法的调用

时间:2010-10-02 11:56:38

标签: unit-testing testing groovy mocking

我在使用Groovy中的模拟支持来测试与依赖的协作时遇到了一些有趣的问题。我们有两个类(例子):

class Dependency {

    void method() {
        throw new OperationNotSupportedException()
    }
}

class Dependent {

    Dependency dependency

    void useDependency() {
        dependency.with {  method() }
    }
}

注意方法()在依赖方面被调用的方式 - 它是在“with”依赖方法中完成的。

我需要在测试中模拟对method()的调用,所以我的第一次尝试是做这样的事情:

class IgnoringWithTest {

    @Test
    void testWithMock() {
        def depMock = new MockFor(Dependency)
        Dependent dep = new Dependent()
        depMock.demand.method { }
        dep.dependency = depMock.proxyInstance()

        dep.useDependency()

        depMock.verify dep.dependency
    }
}

不幸的是,这种“天真”的方法会在测试执行过程中导致错误消息“此时无法调用'with'。预计还会有1次调用'方法'。”这很好,因为我们真的尝试在依赖项上调用with()方法。

我试图通过添加下一行来忽略对with()方法的调用:

depMock.ignore('with')

在此之后,我没有收到有关with()方法调用的抱怨,但事实证明,使用demand声明的期望被忽略了。结果我得到了OperationNotSupportedException。

现在问题是 - 如何在没有问题的情况下对method()进行模拟,在实现时将调用它来传递给with()?

1 个答案:

答案 0 :(得分:0)

我认为这是MockFor的一个错误,但有一个简单的解决方法:将模拟的使用包含在depMock.use块中,如下所示:

import groovy.util.GroovyTestCase
import groovy.mock.interceptor.MockFor

class IgnoringWithTest extends GroovyTestCase {

    void testWithMock() {
        def depMock = new MockFor(Dependency)
        Dependent dep = new Dependent()
        depMock.ignore('with')
        depMock.demand.method { }
        dep.dependency = depMock.proxyInstance()

        depMock.use {
            dep.useDependency()
        }
    }
}