模拟私有方法以使用 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中文网其他相关文章!