JUnit:拦截方法调用,然后使用不同的参数调用

时间:2016-08-17 10:33:14

标签: java unit-testing junit powermock

我正在使用junit并使用PowerMockRunner来模拟静态方法。

我知道可以使用when(...).thenReturn(...)

模拟静态方法

我需要模拟一个带有四个参数的方法:

public static void addInputPath(String, Boolean, Integer, Double)

我需要在对此方法的任何调用中使用第三个参数(Integer)替换为10。所有其他参数应该按原样传递。

换句话说,我需要做这样的事情:

when(addInputPath(str, bool, intgr, dbl)).thenReturn(addInputPath(str, bool, 10, dbl));

有办法做到这一点吗?

1 个答案:

答案 0 :(得分:0)

因此,当我的要求正确时,您实际想要做的是拦截对addInputPath()的调用并使用不同的参数调用它?

如果是这样的话:我不确定这是否可以用任何模拟框架来完成(我怀疑它是否可行)。模拟框架是关于模拟调用的;不是关于检测/拦截电话。

回到你的问题,这是一个很好的例子,为什么静态调用太经常会导致问题。因此,我眼中最好的解决方案是更改你的方法xyz()以避免直接调用addInputPath()。像这样:

interface InputPathAdder {
   void addInputPath(str, ... );
}

class ForwardingInputPathAdder implements InputPathAdder {
   // implements the method by calling the static method

突然之间,你也可以这样做:

class ForwardingInputPathAdderWithFixedIntegerParm implements InputPathAdder {
   // implements the method by calling the static method, but using 10 always

(显然,这里可以改进命名)

现在:您使用依赖注入来为您的"类进行测试"一些实现InputPathAdder的Object。这可能是一个完全被嘲笑的测试;或者它可能只是转发(在您的生产环境中;或者它可能是修复第3个参数的那个)。并且不需要嘲笑你的"拦截"情况。