2

我想在 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。

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

编辑

导致观察到的行为的问题是,该doSomething()方法实际上是final. 当我试图解决这个问题时,我忽略了这一点。无论如何,这是 mockito 的一个已知限制。所以我要么删除final,要么为那个类提取一个接口。

4

2 回答 2

2

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

Mockito.doReturn

来自 JavaDoc:

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

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

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

    列表列表 = 新的 LinkedList();

    列表间谍 = 间谍(列表);

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

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

于 2012-11-20T11:50:16.407 回答
0

您可以从spy关键字而不是mock.

就我从 Mockito 的文档而言,您可以使用 spy 进行部分模拟。

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

于 2012-11-20T13:33:49.837 回答