我想使用以下链接中建议的模式 1:https://code.google.com/p/mockito/wiki/MockingObjectCreation 并具有以下类:
public class MyClass {
private AnyType anyObject;
private Foo foo; // Foo is a thirdparty class
public MyClass(AnyType anyObject) {
//...
foo = makeFoo();
}
private Foo makeFoo() {
return new Foo();
}
}
我正在尝试进行测试如下:
@Test
public void myTestMethod() {
MyClass myClass = Mockito.spy(new MyClass());
// now i want to do something like this:
Foo mockFoo= Mockito.mock(Foo.class);
// Mockito.doReturn(mockFoo).when(myClass).makeFoo());
}
问题是我的工厂方法 makeFoo 是一种私有方法,所以我无法访问它。我不想仅仅为了考试而公开它。我的测试类与我的生产代码也不在同一个包中,因此使其仅对包可见是行不通的。
更新:现在我发现了另一个问题。假设 makeFoo(( 是公开的,'mockFoo' 也不会返回,但真正的 makeFoo(( 方法被调用。发生这种情况是因为 makeFoo(((在 MyClass 的构造函数中(的调用是在创建 mockFoo 之前。
有谁知道如何解决这个问题,或者我做错了什么?
提前感谢你们的帮助!!
看看 PowerMockito 的whenNew
。这允许"覆盖"对象的构造函数调用并返回它的模拟。
http://powermock.googlecode.com/svn/docs/powermock-1.3.7/apidocs/org/powermock/api/mockito/PowerMockito.html#whenNew%28java.lang.Class%29
http://www.gitshah.com/2010/05/how-to-mock-constructors-using.html
如果你只需要在类中设置一个字段,那么使用MockitoAnnotations
您只需要创建所需的字段,注释它们并在部分调用之前进行单元测试MockitoAnnotations.initMocks(this)
在您的情况下,它将看起来像:
@Spy
@InjectMocks
MyClass myClass;
@Mock
Foo foo;
@Before
public void initMocks() {
MockitoAnnotations.initMocks(this);
}
另请阅读上面的文档。