繁体   English   中英

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

[英]Verify private static method on final class gets called using 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 );

但是,与此模拟还有其他交互。

无论您检查多少times删除上面的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
        ...
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM