我有一个简单的类,如
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
的子类,我在其中覆盖了我希望模拟/存根的方法。在此之后,使用子类的实例为我提供了我需要的东西。
答案 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'
}