我正在学习如何使用Groovy编写单元测试。我熟悉EasyMock和Mockito,但我认为我会尝试纯粹的Groovy方式。我要测试的类有多个我需要模拟的协作者。 MockFor的examples演示了mock.use
,但没有说明如何使用多个模拟。因此,我扩展了Family / Person示例以包含Pet,并为需要Person和Pet的方法编写了一个示例测试。我发现同时应用Person mock和Pet mock的唯一方法是嵌套mock.use
闭包,如下所示。
这有效(产生一个JUnit绿色条),但我想知道它是否是正确/最好的方法呢?如果我不得不以这种方式嘲笑几个合作者,那么它可能会变得很难看 - 嵌套N级深度。啊。
import groovy.mock.interceptor.MockFor
import org.junit.Test
class FamilyTest {
@Test
void testCuddle() {
def kidMock = new MockFor(Person)
kidMock.demand.getFirst {'Kid'}
kidMock.use {
def catMock = new MockFor(Pet)
catMock.demand.getName {'Cat'}
catMock.use {
def family = new Family(kid:new Person(), cat:new Pet())
assert family.cuddle() == 'Kid hugs Cat'
}
catMock.expect.verify()
}
kidMock.expect.verify()
}
class Person {
String first, last
}
class Pet {
String name
}
class Family {
Person kid
Pet cat
// method under test
def cuddle() { "$kid.first hugs $cat.name" }
}
}
编辑:以下方法有效,但验证方法与使用mock.expect.verify()
的文档不匹配。当我尝试后者时,我得到一个例外“预期1次呼叫,得到0”。
我再次怀疑 - 它有效,但它是正确/首选/最好的方式吗?
@Test
void testCuddle2() {
def kidMock = new MockFor(Person)
kidMock.demand.with {getFirst {'Kid'}}
def catMock = new MockFor(Pet)
catMock.demand.with {getName {'Cat'}}
def kidProxy = kidMock.proxyInstance();
def catProxy = catMock.proxyInstance();
def family = new Family(kid:kidProxy, cat:catProxy)
assert family.cuddle() == 'Kid hugs Cat'
kidMock.verify(kidProxy)
catMock.verify(catProxy)
}