验证使用PowerMockito调用最终类的私有静态方法

时间:2016-10-12 11:03:35

标签: java powermockito

我有以下课程

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
  }
}

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

  

通缉但没有援引com.example.Foo.baz(       null);

     

但是,这个模拟还有其他互动。

删除上面的prepare行似乎会使验证行无论您检查的times数量是多少...... :(

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

任何想法如何做到这一点?

1 个答案:

答案 0 :(得分:1)

您的代码存在的问题是您模拟 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
        ...
    }
}