Mockito / PowerMockito嘲弄私人工厂的方法

时间:2013-10-09 11:33:02

标签: java mockito private factory-method

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

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

先谢谢你们帮忙!!

2 个答案:

答案 0 :(得分:0)

如果你只需要在课堂上设置一个字段,就可以使用MockitoAnnotations

您只需创建所需的字段,在部分调用MockitoAnnotations.initMocks(this)

之前对其进行注释和单元测试

在您的情况下,它将如下所示:

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

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

请阅读上述文档。

答案 1 :(得分:0)