【发布时间】:2016-05-28 19:19:47
【问题描述】:
我有一个类,我想用一个调用另一个类的私有方法的公共方法来测试它。当我尝试调用同一类的私有方法时,一切正常。当我尝试模拟从被测类调用的另一个私有方法时,就会出现问题。以下是测试类的代码示例。
@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?
【问题讨论】:
-
如果您删除 cmets,可能会更容易阅读。我认为,一旦您创建了一个被测类的实例(
CodeWithPrivateMethod)并创建了一个模拟本身(CodeWithAnotherPrivateMethod),您只需将被测类中的私有实例设置为模拟对象(检查Whitebox提供帮助)。
标签: java unit-testing testing mockito powermock