我想在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。因此,我将删除决赛或为该类提取接口。

最佳答案

查看是否使用doReturn("dummy").when(example).doSomething()可以解决问题。

Mockito.doReturn

从JavaDoc:


  在无法使用when(Object)的极少数情况下,请使用doReturn()。
  请注意,始终建议对when(Object)进行存根,因为它是参数类型安全的,并且更具可读性(尤其是在存根连续调用时)。
  
  以下是doReturn()派上用场的那些罕见情况:
  
  
  监视真实对象并在监视中调用真实方法时会带来副作用
  
  列表列表= new LinkedList();
  
  清单间谍=间谍(清单);
  
  //不可能:调用了真正的方法,因此spy.get(0)抛出IndexOutOfBoundsException(列表尚未为空)
  when(spy.get(0))。thenReturn(“ foo”);
  
  //您必须使用doReturn()进行存根:
  doReturn(“ foo”)。when(spy).get(0);

关于java - 如何初始化真实类的模拟,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13472392/

10-11 07:15