1

我想使用以下链接中建议的模式 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 之前。

有谁知道如何解决这个问题,或者我做错了什么?

提前谢谢你们的帮助!!

4

2 回答 2

0

如果您只需要在类中设置一个字段,则可以使用MockitoAnnotations

您只需要在部分调用之前创建所需的字段,对其进行注释并在单元测试中MockitoAnnotations.initMocks(this)

在你的情况下,它看起来像:

 @Spy
 @InjectMocks
 MyClass myClass;
 @Mock
 Foo foo;

 @Before
 public void initMocks() {
     MockitoAnnotations.initMocks(this);
 }

另请阅读上述文档。

于 2013-10-09T11:45:59.943 回答
0

看看whenNewPowerMockito。这允许“覆盖”对象的构造函数调用并返回它的模拟。

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

于 2013-10-10T09:26:58.570 回答