Mockito在方法中抛出异常时无法设置

时间:2016-06-07 14:08:10

标签: java mockito

这似乎应该很简单,但我在圈子里跑来跑去。

我有:

@Mock
SimpleAbstractCacheWithInputs<Key, Value, Inputs> underlyingCache;

然后我尝试在setup()

中设置对缓存的调用
when(underlyingCache.getOrCreate(usdgbpKey)).thenReturn(usdgbpCfi);

但是这会在getOrCreate()内抛出一个空指针异常,因为它试图执行真实对象中的实际代码,而不是嘲笑,并且没有设置。

但我不想运行getOrCreate实际代码,我只想让它返回模拟值!

那么如何在不设置我永远不会用来模拟这个方法调用的underlyingCache内的所有内容的情况下这样做呢?

1 个答案:

答案 0 :(得分:0)

如果您担心间谍或已经存根的对象的行为,我会推荐这种语法,它不依赖于调用模拟对象:

doReturn(usdgbpCfi).when(underlyingCache).getOrCreate(usdgbpKey);

......但这一切似乎都是正确的。如果你正在使用@Mock注释,那么整个对象应该被模拟,或null如果你忘记了Mockito运行/规则/初始化。

在某些情况下,模拟会失败并且您会获得实际行为:

  1. 如果方法是final,因为Mockito无法覆盖该方法(通过代理)。
  2. 如果课程为final,那么Mockito就无法覆盖课程(通过代理)。
  3. 如果类具有复杂的访问语义,例如访问私有父方法的公共嵌套类,因为Java编译器可能通过Mockito无法(轻松)模拟的合成方法重写方法调用。