Mockito无法在方法中抛出异常时设置
问题描述:
这似乎应该很简单,但我在圈子里跑来跑去。Mockito无法在方法中抛出异常时设置
我:
@Mock
SimpleAbstractCacheWithInputs<Key, Value, Inputs> underlyingCache;
然后我尝试设置上的缓存来电setup()
:
when(underlyingCache.getOrCreate(usdgbpKey)).thenReturn(usdgbpCfi);
但是,这是因为它试图执行抛出一个空指针异常从getOrCreate()
内实际对象中的实际代码,根本没有被模拟,并且没有设置。
但我不想永远运行getOrCreate
真实代码,我只是想让它返回嘲弄的值!
那么,我怎么做,而不必设置underlyingCache
内的一切,我永远不会用来嘲笑这一个方法调用?
答
如果你担心间谍或已存根对象的行为,我会推荐这句法,它不依赖于调用嘲笑对象:
doReturn(usdgbpCfi).when(underlyingCache).getOrCreate(usdgbpKey);
...但所有似乎是对的。如果您使用的是@Mock注释,那么整个对象应该被嘲笑,或者如果您忘记了Mockito亚军/规则/初始化,就应该使用null
。
在有些情况下嘲讽会失败少数情况下,你会得到的实际行为,而不是:
- 如果方法
final
,因为那时的Mockito不能覆盖的方法(通过代理)。 - 如果班级是
final
,因为那么Mockito无法覆盖该类(通过代理)。 - 如果类具有复杂的访问语义,例如访问私有父级方法的公共嵌套类,因为Java编译器可能会通过Mockito无法(很容易)模拟的合成方法重写方法调用。
underlyingCache是您正在测试的类的成员对象吗?你是否将模拟注入了正在测试的课程中?你可以发布更多的测试课程吗? – blur0224
underlyingCache作为构造函数参数传递给正在测试的类。但是我从来没有进入这个阶段,因为我不能使用when()来设置underlyingCache。 ...我刚刚设法通过切换模拟接口而不是缓存对象来解决此问题。尽管如此,我仍然想知道如何解决这个问题。 –
从你发布的内容看,它看起来不错,但行为最终听起来像这个班不被嘲笑。我需要看到一个更完整的例子来猜测为什么。此外,这可能是有用的,因为你正在处理抽象类http://stackoverflow.com/questions/1087339/using-mockito-to-test-abstract-classes – blur0224