如何初始化真实类的模拟



我想在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 。当我试图解决这个问题时,我忽略了这一点。无论如何,这是 mockito 的一个已知限制。因此,我要么删除决赛,要么为该类提取一个接口。

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

Mockito.doReturn

来自JavaDoc:

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

以下是doReturn()派上用场的罕见情况:

  1. 当监视真实对象并在间谍上调用真实方法会带来副作用

    列表

    列表 = 新的链接列表();

    列表

    间谍=间谍(列表);

    /

    /不可能:调用真正的方法,所以 spy.get(0) 抛出 IndexOutOfBoundsException(列表还为空) when(spy.get(0)).thenReturn("foo");

    你必须使用 doReturn() 进行存根: doReturn("foo").when(spy).get(0);

您可以从

spy关键字而不是mock中受益。

就我从 Mockito 的文档来看,您可以使用间谍进行部分模拟。

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

相关内容

  • 没有找到相关文章

最新更新