我想在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。所以我要么删除决赛,要么提取该类的接口。
答案 0 :(得分:2)
查看使用doReturn("dummy").when(example).doSomething()
是否有效。
来自JavaDoc:
在无法使用when(Object)的极少数情况下使用doReturn()。 请注意,始终建议将(Object)用于存根,因为它是参数类型安全且更具可读性(特别是当存根连续调用时)。
以下是doReturn()出现的罕见场合:
- 醇>
当侦察真实物体并在间谍上调用真实方法时会产生副作用
列表list = new LinkedList();
列出spy = spy(list);
//不可能:调用真正的方法,因此spy.get(0)抛出IndexOutOfBoundsException(列表尚未清空) 当(spy.get(0))thenReturn( “富”);
//你必须使用doReturn()进行存根: 。doReturn( “富”)时(间谍)获得(0);
答案 1 :(得分:0)