gpt4 book ai didi

java - 如何使用 PowerMock 模拟被测类以外的另一个类的私有(private)方法?

转载 作者:行者123 更新时间:2023-11-30 08:40:48 25 4
gpt4 key购买 nike

我有一个类,我想用调用另一个类的私有(private)方法的公共(public)方法对其进行测试。当我尝试调用同一类的私有(private)方法时,一切正常。当我尝试模拟从被测类调用的另一个私有(private)方法时,就会出现问题。以下是测试类的代码示例。

@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?

最佳答案

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

CodeWithAnotherPrivateMethod anotherPrivateMethod = new CodeWithAnotherPrivateMethod();

为避免这种情况,您可以在创建新实例时强制返回您的 CodeWithAnotherPrivateMethod 模拟。您可以使用 PowerMockito whenNew()有能力做到这一点。

例子:

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();
}

希望对您有所帮助。

关于java - 如何使用 PowerMock 模拟被测类以外的另一个类的私有(private)方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35450741/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com