当前位置: 首页 > 知识库问答 >
问题:

如何使用PowerMock模拟测试类以外的另一个类的私有方法?

唐阳飇
2023-03-14
@RunWith(PowerMockRunner.class)
@PrepareForTest({CodeWithPrivateMethod.class,CodeWithAnotherPrivateMethod.class})
public class CodeWithPrivateMethodTest {

    @Test
    public void when_gambling_is_true_then_always_explode() throws Exception {
        CodeWithPrivateMethod spy = PowerMockito.spy(new CodeWithPrivateMethod());
        CodeWithAnotherPrivateMethod codeWithAnotherPrivateMethod = PowerMockito.spy(new CodeWithAnotherPrivateMethod());      

        /*when(codeWithAnotherPrivateMethod, method(CodeWithAnotherPrivateMethod.class, "doTheGame", String.class))
                .withArguments(anyString())
                .thenReturn(true);*/

        PowerMockito.when(codeWithAnotherPrivateMethod, "doTheGame", anyString()).thenReturn(true);
        //PowerMockito.doReturn(true).when(codeWithAnotherPrivateMethod, "doTheGamble", anyString(),anyInt());

        spy.meaningfulPublicApi();
    }
}
import java.util.Random;

public class CodeWithPrivateMethod {

    CodeWithAnotherPrivateMethod anotherPrivateMethod = new CodeWithAnotherPrivateMethod();

    public void meaningfulPublicApi() {
        if (anotherPrivateMethod.doTheGame("Whatever")) {
            System.out.println("kaboom");
        }
    } 
}

下面是从测试中的类调用的类的代码示例

import java.util.Random;

public class CodeWithAnotherPrivateMethod {

    public boolean doTheGame(String string) {
        return doTheGamble("Whatever", 1 << 3);
    }

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

所以我的问题是如何成功地模拟CodeWithAnotherPrivateMethod类的doTheGamble()方法,使其始终返回true?

共有1个答案

暨成双
2023-03-14

这里的问题是,尽管您在测试中创建了CodeWithanOtherPrivateMethod的间谍,但在CodeWithanOtherPrivateMethod中创建了CodeWithanOtherPrivateMethod的新实例。所以,实际上你没有使用你的模拟。

CodeWithAnotherPrivateMethod anotherPrivateMethod = new CodeWithAnotherPrivateMethod();

为了避免这种情况,可以在创建新实例时强制返回CodeWithAnotherPrivateMethod模拟。您可以使用PowerMockitoWhennew()功能来完成此操作。

示例

PowerMockito.whenNew(CodeWithAnotherPrivateMethod.class).withAnyArguments().thenReturn(codeWithAnotherPrivateMethod);
@Test
public void when_gambling_is_true_then_always_explode() throws Exception {
  // Spy CodeWithAnotherPrivateMethod and force return true when doTheGamble is called
  CodeWithAnotherPrivateMethod codeWithAnotherPrivateMethod = PowerMockito.spy(new CodeWithAnotherPrivateMethod());
  PowerMockito.doReturn(true).when(codeWithAnotherPrivateMethod, "doTheGamble", Mockito.anyString(), Mockito.anyInt());
  // Return your mock when a new instance of CodeWithAnotherPrivateMethod is created.
  PowerMockito.whenNew(CodeWithAnotherPrivateMethod.class).withAnyArguments().thenReturn(codeWithAnotherPrivateMethod);

  CodeWithPrivateMethod spy = PowerMockito.spy(new CodeWithPrivateMethod());
  spy.meaningfulPublicApi();
}
 类似资料:
  • 如果我正在为一个单例类编写单元测试,那么我如何去模仿单例类的私有方法。下面是我正在寻找的场景的示例代码片段:- 我如何模拟method2,以便在上面的示例中测试method1?

  • 我想现在,如果有可能模仿一个类一样 我们的业务逻辑在代码中的某个地方用< code>new myClass()创建了这个对象,因此我不能访问创建的对象来模拟这些方法。有没有办法替换整个类或者覆盖那些方法。我正在使用mockito,我只找到了这样做的例子 我们不能使用 PowerMock,因为它与我们的测试环境不兼容。 欢迎任何建议。

  • 我正在尝试测试下一种方法: 称为PrivateMethod: asyncTask的执行无法在Mockito的测试中完成,所以我需要以某种方式模拟它。我试着用PowerMock来嘲弄私有方法: 这在PowerMockito行(NullPointerException)中给了我一个异常,它说 方法引发了“org.mockito.exceptions.Misusing.UnfinishedStubbin

  • 我这样做是为了得到想要的结果

  • 问题内容: 我正在为具有两个方法methodA,methodB的类编写JUnit测试用例。我想在测试用例中模拟对methodA的methodB调用,我正在对正在测试的类使用间谍,但仍然执行methodB。 这是课程 这是测试课 尽管我已对其进行了模拟,但方法B仍会得到调用。请向我建议一个使用正确方法模拟同一类methodA的methodB调用的解决方案。 问题答案: 我昨天碰到这个,因为间谍最好做

  • 问题内容: 我有一个名为Java的Java类,我想用JUnit进行测试。我要测试的公共方法调用同一类中的私有方法,以确定要遵循的条件路径。我的目标是为中的不同路径编写JUnit测试。另外,调用服务,因此我不希望在运行JUnit测试时实际执行该服务。 模拟和控制其返回值以便我可以测试“ methodA”的不同路径的最佳方法是什么? 我更喜欢在编写模拟时使用JMockit,因此我对适用于JMockit