PowerMock,模拟静态方法,然后在所有其他静态上调用实际方法

时间:2013-02-01 16:49:53

标签: java junit mockito powermock

我正在设置模拟类的静态方法。我必须在@Before - 带注释的JUnit设置方法中执行此操作。

我的目标是设置类来调用实际方法,除了以便我明确模拟这些方法。

基本上:

@Before
public void setupStaticUtil() {
  PowerMockito.mockStatic(StaticUtilClass.class);

  when(StaticUtilClass.someStaticMethod(anyS

特林()))thenReturn(5)。 //嘲笑某些方法......

  // Now have all OTHER methods call the real implmentation???  How do I do this?
}

我遇到的问题是,在StaticUtilClass public static int someStaticMethod(String s)范围内,如果RuntimeException提供了null值,则@Before public void setupStaticUtil() { PowerMockito.mockStatic(StaticUtilClass.class, CALLS_REAL_METHODS); // Default to calling real static methods // The below call to someStaticMethod() will throw a RuntimeException, as the arg is null! // Even though I don't actually want to call the method, I just want to setup a mock result when(StaticUtilClass.someStaticMethod(antString())).thenReturn(5); } 会抛出{{1}}。

所以我不能简单地将调用真实方法的明显路线作为默认答案,如下所示:

{{1}}

我需要设置默认的Answer来调用所有其他静态方法的实方法之后我模拟了我对模拟感兴趣的方法的结果。

这可能吗?

2 个答案:

答案 0 :(得分:56)

你在寻找什么称为部分嘲笑

在PowerMock中,您可以使用 mockStaticPartial 方法。

在PowerMockito中,你可以使用stubbing,它只存根定义的方法并保留其他方法:

PowerMockito.stub(PowerMockito.method(StaticUtilClass.class, "someStaticMethod")).toReturn(5);

也不要忘记

@PrepareForTest(StaticUtilClass.class)

答案 1 :(得分:2)

尽管我迟到了,但我们可以实现部分模拟并通过显式指定模拟对象来覆盖模拟对象的默认行为。

以下示例显示了如何在行为未明确定义的情况下使PowerMockito调用真实方法:

例如PowerMockito.mockStatic(MyClass.class, new CallsRealMethods());