簡體   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