我使用了“模式 2 - “工厂助手模式”
模式 2 - 工厂助手模式
这种模式不起作用的一种情况是 MyClass 是最终的。大多数 Mockito 框架在 final 类中表现不佳;这包括使用 spy()。另一种情况是 MyClass 在某处使用 getClass(),并要求结果值为 MyClass。这是行不通的,因为 spy 的类实际上是原始类的 Mockito 生成的子类。
在这两种情况下,您都需要更健壮的工厂助手模式,如下所示。
public class MyClass{
static class FactoryHelper{
Foo makeFoo( A a, B b, C c ){
return new Foo( a, b, c );
}
}
//...
private FactoryHelper helper;
public MyClass( X x, Y y ){
this( x, y, new FactoryHelper());
}
MyClass( X x, Y, y, FactoryHelper helper ){
//...
this.helper = helper;
}
//...
Foo foo = helper.makeFoo( a, b, c );
}
因此,您有一个特殊的构造函数,仅用于测试,它有一个附加参数。这在您的测试类中使用,在创建您要测试的对象时。在您的测试类中,您模拟 FactoryHelper 类以及您要创建的对象。
@Mock private MyClass.FactoryHelper mockFactoryHelper;
@Mock private Foo mockFoo;
private MyClass toTest;
你可以像这样使用它
toTest = new MyClass( x, y, mockFactoryHelper );
when( mockFactoryHelper.makeFoo(
any( A.class ), any( B.class ), any( C.class )))
.thenReturn( mockFoo );
来源:http ://web.archive.org/web/20160322155004/http://code.google.com/p/mockito/wiki/MockingObjectCreation