我在使用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()?
答案 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()
}
}
}