使用PowerMock 模擬私有方法進行測試
使用私有方法測試類別時,通常需要模擬這些方法以確保公共方法API 正在按預期工作。然而,在使用 Mockito 這樣的框架時,這樣做可能會很困難。
問題:
您在嘗試使用 PowerMock 模擬私有方法時可能會遇到問題,特別是當您想要操作私有方法的回傳值。
解決方案:
依照下列步驟使用PowerMock 模擬私有方法測試:
導入PowerMock API :將必要的PowerMock 註解和API 包含到您的測試類別中。
<code class="java">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;</code>
準備測試類別: 使用 @PrepareForTest 註解您的測試類,並指定包含要模擬的私有方法的類別。
<code class="java">@PrepareForTest(CodeWithPrivateMethod.class)</code>
建立 Spy 實例: 使用 PowerMockito ,建立包含私有方法的類別的間諜實例。
<code class="java">CodeWithPrivateMethod spy = PowerMockito.spy(new CodeWithPrivateMethod());</code>
模擬私有方法:使用PowerMockito的when方法模擬私有方法。指定類別、方法名稱、參數類型和所需的傳回值。
<code class="java">when(spy, method(CodeWithPrivateMethod.class, "doTheGamble", String.class, int.class)) .withArguments(anyString(), anyInt()) .thenReturn(true);</code>
測試公共方法:呼叫呼叫私有方法的公用方法並根據模擬的回傳值驗證其行為。
<code class="java">spy.meaningfulPublicApi();</code>
範例:
考慮以下具有私有方法doTheGamble 的類別CodeWith 這樣,您可以有效地模擬私有方法進行測試,確保您的公共方法即使私有方法實現保持不變,API 也能正常運行。 <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>
以上是如何使用 PowerMock 模擬私有方法進行測試?的詳細內容。更多資訊請關注PHP中文網其他相關文章!