2016-06-07 43 views
0

这似乎应该很简单,但我在圈子里跑来跑去。Mockito无法在方法中抛出异常时设置

我:

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

然后我尝试设置上的缓存来电setup()

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

但是,这是因为它试图执行抛出一个空指针异常从getOrCreate()内实际对象中的实际代码,根本没有被模拟,并且没有设置。

但我不想永远运行getOrCreate真实代码,我只是想让它返回嘲弄的值!

那么,我怎么做,而不必设置underlyingCache内的一切,我永远不会用来嘲笑这一个方法调用?

+0

underlyingCache是​​您正在测试的类的成员对象吗?你是否将模拟注入了正在测试的课程中?你可以发布更多的测试课程吗? – blur0224

+0

underlyingCache作为构造函数参数传递给正在测试的类。但是我从来没有进入这个阶段,因为我不能使用when()来设置underlyingCache。 ...我刚刚设法通过切换模拟接口而不是缓存对象来解决此问题。尽管如此,我仍然想知道如何解决这个问题。 –

+0

从你发布的内容看,它看起来不错,但行为最终听起来像这个班不被嘲笑。我需要看到一个更完整的例子来猜测为什么。此外,这可能是有用的,因为你正在处理抽象类http://stackoverflow.com/questions/1087339/using-mockito-to-test-abstract-classes – blur0224

回答

0

如果你担心间谍或已存根对象的行为,我会推荐这句法,它不依赖于调用嘲笑对象:

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

...但所有似乎是对的。如果您使用的是@Mock注释,那么整个对象应该被嘲笑,或者如果您忘记了Mockito亚军/规则/初始化,就应该使用null

在有些情况下嘲讽会失败少数情况下,你会得到的实际行为,而不是:

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