首頁  >  文章  >  Java  >  如何使用 PowerMock 和 Mockito 模擬私有方法進行測試?

如何使用 PowerMock 和 Mockito 模擬私有方法進行測試?

Patricia Arquette
Patricia Arquette原創
2024-11-04 04:21:291044瀏覽

How to Mock Private Methods for Testing with PowerMock and Mockito?

模擬私有方法以使用PowerMock 進行測試

使用私有方法測試類別可能具有挑戰性,尤其是在嘗試假設這些方法的正確行為時。 PowerMock 為此提供了解決方案,但對於某些用戶來說,它可能無法按預期運行。在這裡,我們將探索一種可能的方法,結合使用 Mockito 和 PowerMock 來成功模擬私有方法。

方法:

我們將使用的主要工具是Mockito 的 when 方法指定私有方法的行為。為了存取私有方法,我們將利用 PowerMock 的 Spy 功能。這允許我們創建一個間諜對象,攔截對私有方法的調用,並使我們能夠模擬其行為。

範例:

考慮以下類,CodeWithPrivateMethod,其中有一個私有方法 doTheGamble。

<code class="java">public class CodeWithPrivateMethod {

    public void meaningfulPublicApi() {
        if (doTheGamble("Whatever", 1 << 3)) {
            throw new RuntimeException("boom");
        }
    }

    private boolean doTheGamble(String whatever, int binary) {
        Random random = new Random(System.nanoTime());
        boolean gamble = random.nextBoolean();
        return gamble;
    }
}</code>

測試:

使用所描述的方法,我們可以編寫一個JUnit 測試來模擬私有方法並斷言所需的方法

<code class="java">import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import static org.mockito.Matchers.anyInt;
import static org.mockito.Matchers.anyString;
import static org.powermock.api.mockito.PowerMockito.when;
import static org.powermock.api.support.membermodification.MemberMatcher.method;

@RunWith(PowerMockRunner.class)
@PrepareForTest(CodeWithPrivateMethod.class)
public class CodeWithPrivateMethodTest {

    @Test(expected = RuntimeException.class)
    public void when_gambling_is_true_then_always_explode() {
        CodeWithPrivateMethod spy = PowerMockito.spy(new CodeWithPrivateMethod());

        when(spy, method(CodeWithPrivateMethod.class, "doTheGamble", String.class, int.class))
                .withArguments(anyString(), anyInt())
                .thenReturn(true);

        spy.meaningfulPublicApi();
    }
}</code>

在這個測試中,我們建立一個間諜物件間諜並使用when模擬doTheGamble方法。我們指定對於任何輸入,該方法應始終傳回 true。因此,當呼叫有意義的PublicApi方法時,測試期望程式碼由於私有方法的模擬行為而拋出RuntimeException。

這種方法結合了Mockito用於模擬的功能和PowerMock用於存取私有方法的功能。方法,為測試依賴私有方法的程式碼提供了完整的解決方案。

以上是如何使用 PowerMock 和 Mockito 模擬私有方法進行測試?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn