在Groovy中模拟单个测试单元的方法

时间:2014-05-22 22:03:10

标签: unit-testing groovy mocking

我有一个简单的类,如

class SomeClass {
  def foo() {
    def bar= bar()
    switch( bar ) {
      return something based on format
    }
  }

  def bar() {
    return someValue
  }
}

我已经为bar()编写了完整的单元测试。现在我需要为foo()编写单元测试,这严重依赖于bar()方法的使用。我不想像bar()那样复制设置阶段,所以我想通过简单地返回我想要的值来模拟它。

我知道Groovy只需像SomeClass.property = "Hello World"那样定义它就可以轻松地支持这种“嘲弄”。此外,这可以作为SomeClass.service = myMockedService与协作者一起完成。但是我没有找到一种方法来完成这个方法,在测试单元内部的方法。有吗?

我在

中尝试使用MockFor
def uut = new MockFor( SomeClass )
uut.demand.bar{ /* some values */ }
uut.use {
  assert uut.foo() == expected
}

但它给了我

groovy.lang.MissingMethodException: No signature of method: groovy.mock.interceptor.MockFor.foo() is applicable for argument types: () values: []

更新

事实上,我想出了一个使用子类的简单解决方案。在测试方法中,我创建了一个SomeClass的子类,我在其中覆盖了我希望模拟/存根的方法。在此之后,使用子类的实例为我提供了我需要的东西。

但是,这看起来有点粗糙。还有其他任何建议吗?

1 个答案:

答案 0 :(得分:3)

如果要为bar()的单个实例模拟SomeClass返回的值,则可以使用元编程。在Groovy控制台中尝试以下操作:

class SomeClass {
  def foo() {
  }

  def bar() {
    return 'real value'
  }
}

def uut = new SomeClass()

uut.metaClass.bar = {
  return 'mock value'
}

assert 'mock value' == uut.bar()

如果您要为bar()的所有实例模拟SomeClass,请将其替换为:

uut.metaClass.bar = {
  return 'mock value'
}

使用:

SomeClass.metaClass.bar = {
  return 'mock value'
}