首页 > Java > java教程 > 正文

如何使用 PowerMock 和 Mockito 模拟私有方法进行测试?

Patricia Arquette
发布: 2024-11-04 04:21:29
原创
1045 人浏览过

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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板