Groovy:存根类型引用

Groovy:存根类型引用,groovy,stubbing,Groovy,Stubbing,我有一个类似于的Groovy类 class MyClass { Foo foo } 在某些情况下,我不想初始化foo,而是想取消对它的所有调用。任何返回值的方法都不应执行任何操作。我可以这样做: Foo.metaClass.method1 = {param -> } Foo.metaClass.method2 = { -> } Foo.metaClass.method3 = {param1, param2 -> } import static org.mockito.

我有一个类似于的Groovy类

class MyClass {

  Foo foo
}
在某些情况下,我不想初始化foo,而是想取消对它的所有调用。任何返回值的方法都不应执行任何操作。我可以这样做:

Foo.metaClass.method1 = {param -> }
Foo.metaClass.method2 = { -> }
Foo.metaClass.method3 = {param1, param2 -> }
import static org.mockito.Mockito.*;
new MyClass().foo = mock(Foo.class);
虽然这会起作用,但也有一些问题

冗长乏味,特别是如果Foo有很多方法的话 这将取消对任何Foo实例的调用,而不仅仅是Foo 尽管Groovy提供了StubFor类,但如果我这样做:

this.foo = new groovy.mock.interceptor.StubFor(Foo)
我在运行时得到一个ClassCastException。虽然如果我能将foo重新定义为:

def foo
但由于我不想进入这里的原因,我不能这样做

谢谢,
不要

您需要将Foo实例传递给MyClass对象。在测试中,传入一个存根实现。在真实的程序中,传递一个真实的实现


您不需要任何特殊的框架来编写存根。如果您只是将查询存根到Foo,而不希望向其发送命令,那么手工编写存根实现就更容易了。一个模拟对象库是过分的,它会使以后的代码读者感到困惑,他们希望测试包含期望

我猜这只是出于测试目的

该行:

Foo foo
创建一个getter/setter对,因此您可以通过以下操作在测试用例中注入一个mock:

new MyClass().foo = new MockFoo()
如果不想为自己创建模拟,请尝试模拟库。我建议使用。使用此小型库,您可以执行以下操作:

Foo.metaClass.method1 = {param -> }
Foo.metaClass.method2 = { -> }
Foo.metaClass.method3 = {param1, param2 -> }
import static org.mockito.Mockito.*;
new MyClass().foo = mock(Foo.class);
我找到了解决办法:

this.foo = {Object[] args -> println "I don't do anything"} as Foo

您还可以使用映射创建存根,这样就可以存根多个方法,如下所示:

def stubbedList = [empty : { false }, get: {index -> "always return this"}] as ArrayList
如果像上面的ArrayList示例中那样删除了一个类,那么不重写的方法将在类中实现时保留。显然,您也可以删除接口

如果您需要模拟功能,即验证测试中的行为,如计算对给定方法的调用数,我强烈建议您检查。它确实非常支持更高级的存根和模拟