@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
的间谍,但在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