public static ResponseBean call(Bean bean) throws Exception {
// statements...
IgnoreCall.ignoreMethodCall(bean);
// statements...
// return
}
使用上面的代码片段,是否可以测试忽略IgnoreCall.ignoreMethod(Bean)
调用的方法,而无需将整个语句置于布尔条件下?
下面是单元测试代码片段:
@RunWith(PowerMockRunner.class)
@PrepareTest
public ClassHelperTest {
@Test
public void testCall() throws Excpetion {
// stubbing...
ResponseBean responseBean = ClassHelper.call(bean);
// verify/ies
// assert/s
}
}
笔记:
- 应避免重构
ClassHelper.call(Bean)
。即使有一个糟糕的OO设计,重构也是昂贵的。 - 方法签名将被锁定,除非其他模式适用于替换。
- 尝试在目标静态方法上使用
Mockito.when
和PowerMockito.when
,存根在运行时调试中不起作用。
由于您的注释表明无法更改生产代码,因此您"简单地"必须深入研究 PowerMock 的静态模拟方面;例如,如此处所述。
基本上,您需要为静态模拟启用IgnoreCall;然后调用ignoreMethodCall()为无操作。
但正如你一直在问的那样:你的问题的核心问题是你想模拟一个无效的静态方法。我在下面有一个完整的例子,但在此之前有一些解释。
关键是:您调用方法有两个原因:
- 它有副作用
- 它返回一个值,也许也会导致副作用
无效方法只能用于副作用。问题是:当你做静态模拟时,这在课堂层面上是有效的。
意思是:你指示 PowerMock "阻止"某个类的任何静态方法执行;你只是"擦除"了所有这些静态方法的副作用!因此,通过告诉 PowerMock 执行这些静态模拟,所有 void 方法都已经"消失"了。
但如前所述,您也可以调用方法以获取其返回值。然后是Mockito的when()
方法发挥作用的时候。你用这个方法说:当调用那个值返回方法时,然后做这个或那个。
长话短说;这是一个使用您要求的元素的 [mcve]:
package ghostcat.test;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
class IgnoreCall {
public static void ignoreMethodCall(Object o) {
System.out.println("SHOULD NOT SHOW UP: " + o);
}
}
class CuT {
public static Object call(Object bean) {
System.out.println("statement1");
IgnoreCall.ignoreMethodCall(bean);
System.out.println("statement2");
return "whatever";
}
}
@RunWith(PowerMockRunner.class)
@PrepareForTest(IgnoreCall.class)
public class PMTest {
@Test
public void test() {
PowerMockito.mockStatic(IgnoreCall.class);
CuT.call("yeha");
}
}
就像你的例子一样...有忽略呼叫;在其中使用了我刚刚称为"调用"的静态方法。
这将打印:
statement1
statement2
当我进入并注释掉时
// PowerMockito.mockStatic(IgnoreCall.class);
它打印:
statement1
SHOULD NOT SHOW UP: yeha
statement2
因此,一个简单的示例应该确切地告诉您需要做什么。
我使用eclipse neon,IBM java8 JDK,并简单地将所有JAR从powermock-mockito-junit-1.6.6.zip导入到我的测试项目中。