如何初始化一个真正的类的模拟

时间:2012-11-20 11:39:12

标签: java testng mockito

我想在TestNG测试用例中模拟一个具体的类。该类可能如下所示(简化示例):

public class Example() {

  private MyHello myHello;

  public Example(MyHello myHello) {
    this.myHello = myHello;
  }

  public String doSomething() {
    return myHello.doSomethingElse();
  }
}

现在我们要模拟Example返回一些定义的值:

@BeforeMethod
public void setUp() {
  this.example = mock(Example.class);
  when(this.example.doSomething()).thenReturn("dummyValue");
}

这个看起来非常好,但实际上并非如此。 setup方法的最后一行在Example的实例上调用该方法,该实例没有通过构造函数获得MyHello,因此我在setUp方法中获得了NPE。

有没有办法在创建模拟时注入MyHello或禁止Mockito在真实的实例上调用该方法?

修改

导致观察到的行为的问题是,doSomething()方法实际上是final。当我试图解决这个问题时,我忽略了这一点。 And this is a known limitation with mockito anyway。所以我要么删除决赛,要么提取该类的接口。

2 个答案:

答案 0 :(得分:2)

查看使用doReturn("dummy").when(example).doSomething()是否有效。

Mockito.doReturn

来自JavaDoc:

  

在无法使用when(Object)的极少数情况下使用doReturn()。   请注意,始终建议将(Object)用于存根,因为它是参数类型安全且更具可读性(特别是当存根连续调用时)。

     

以下是doReturn()出现的罕见场合:

     
      
  1. 当侦察真实物体并在间谍上调用真实方法时会产生副作用

         

    列表list = new LinkedList();

         

    列出spy = spy(list);

         

    //不可能:调用真正的方法,因此spy.get(0)抛出IndexOutOfBoundsException(列表尚未清空)   当(spy.get(0))thenReturn( “富”);

         

    //你必须使用doReturn()进行存根:   。doReturn( “富”)时(间谍)获得(0);

  2.   

答案 1 :(得分:0)

您可以使用spy关键字代替mock

就我对Mockito的文档感到担心,你可以与间谍进行部分嘲笑。

有关详细说明,您可以从doc中的主题13中受益。