java - 使用 PowerMockito 验证调用最终类上的私有(private)静态方法

标签 java powermockito

我有以下类(class)

public final class Foo {
  private Foo() {}
  public static void bar() {
    if(baz("a", "b", new Object())) { }
  }
  private static boolean baz(Object... args) {
    return true;  // slightly abbreviated logic
  }
}

这是我的测试:

@PrepareOnlyThisForTest(Foo.class)
@RunWith(PowerMockRunner.class)
public class FooTest {
  @Test
  public void bar() {
    PowerMockito.mockStatic(Foo.class); // prepare
    Foo.bar(); // execute
    verifyPrivate(Foo.class, times(1)).invoke("baz", anyVararg()); // verify - fails
  }
}

为此,我收到以下错误消息 - 我不明白为什么......

Wanted but not invoked com.example.Foo.baz( null );

However, there were other interactions with this mock.

删除上面的 prepare 行似乎会使验证行通过,无论您检查多少...:(

(我们的 SONAR 代码检查强制每个测试都包含某种 assertXyz() (因此调用 verify())并强制执行非常高的测试覆盖范围。)

有什么想法可以做到这一点吗?

最佳答案

您的代码的问题在于您模拟 Foo,因此默认情况下不会调用您的方法实现,这样当您调用 Foo.call( ) 默认情况下它什么都不做,这意味着它永远不会调用 baz 这就是为什么你会得到这种行为。如果您想部分模拟Foo,请使用选项Mockito.CALLS_REAL_METHODS来模拟它,以便让它像您看起来那样调用真实的方法期望,所以代码应该是:

@PrepareOnlyThisForTest(Foo.class)
@RunWith(PowerMockRunner.class)
public class FooTest {
    @Test
    public void bar() throws Exception {
        PowerMockito.mockStatic(Foo.class, Mockito.CALLS_REAL_METHODS); // prepare
        ...
    }
}

关于java - 使用 PowerMockito 验证调用最终类上的私有(private)静态方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39997000/

相关文章:

java - 如何为多个观察者实现不同的行为?

java - 如何验证方法内部正在启动的方法?

android - PowerMockito.whenNew 不适用于 android 的 Intent 类

java - JVM堆大小不断增加(但使用的Memory()不断减少)

java - 如何计算其值总和等于输入数字的骰子总和

java - 在jar中包含jar文件

java - 使用 PowerMock 模拟私有(private)方法

java - 如何使用 powermock 或任何模拟工具模拟父类(super class)的 java 方法?

spring - TestNG + Spring + Power mock 单元测试

java - 创建具有重复键的映射