我正在使用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));
有办法做到这一点吗?
答案 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个参数的那个)。并且不需要嘲笑你的"拦截"情况。