使用Groovy MockFor或StubFor模拟多个协作者

时间:2016-09-27 23:09:29

标签: unit-testing groovy

我正在学习如何使用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)
}

0 个答案:

没有答案