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