我想在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()派上用场的罕见情况:
当监视真实对象并在间谍上调用真实方法会带来副作用
列表列表 = 新的链接列表();
列表间谍=间谍(列表);
//不可能:调用真正的方法,所以 spy.get(0) 抛出 IndexOutOfBoundsException(列表还为空) when(spy.get(0)).thenReturn("foo");
你必须使用 doReturn() 进行存根: doReturn("foo").when(spy).get(0);
spy
关键字而不是mock
中受益。
就我从 Mockito 的文档来看,您可以使用间谍进行部分模拟。
有关详细说明,您可以从其文档中的主题 13 中受益。