我四处寻找这个问题,但没有找到我真正需要的东西。我对 JMockit 和模拟有了更多的了解。这很好。似乎每个人都想知道如何确保某些事情已经执行。我想了解相反的情况。
好的 - 我正在编写一个测试来检查公共(public)方法中不太愉快的路径。正在测试的方法是 void
所以我真的不能 assert
结果。 我想做的是验证此测试用例中是否未执行某个方法。
例如:
class ClassToTest {
private void method(String arg){}
public void publicMethod(String arg0, String arg1){
if(false){
//this method should never get called.
method(arg0);
}
}
}
class TestingClass{
@Tested
private ClassToTest classToTest = new ClassToTest();
@Test
public void testCheckingIfPrivateMethodWasCalled(){
classToTest.publicMethod("string1", "string2");
new Verifications() {
{
//At this point I am trying something like
Deencapsulation.invoke(classToTest, "method", "string1");
times = 0; //Also tried maxTimes = 0;
//Through debug it looks like the invoke is doing what it's named...
//invoking the private method, I don't want to invoke.
//How do I check that ClassToTest#method was not called?
}
}
}
}
我得到的测试用例结果是 java.lang.IllegalStateException: Missing invocation to mocked type at this point; please make sure such invocations appear only after the declaration of a suitable mock field or parameter
。就在times = 0;
线上.
我知道invoke
正在执行私有(private)方法。我摸不着头脑,试图找出如何“检查”调用该方法而不调用/执行它。
谢谢。
最佳答案
一种方法是使用 faking 的 MockUp API :
import static org.junit.Assert.assertFalse;
import org.junit.Test;
import mockit.Mock;
import mockit.MockUp;
import mockit.Tested;
public class TestingClass {
@Tested
private ClassToTest classToTest = new ClassToTest();
@Test
public void testCheckingIfPrivateMethodWasCalled() {
PrivateMethodCheckMockUp mockUp = new PrivateMethodCheckMockUp() {
@Mock
private void method(String arg) {
calledPrivate = true;
}
};
classToTest.publicMethod("string1", "string2");
assertFalse(mockUp.calledPrivate);
}
class PrivateMethodCheckMockUp extends MockUp<ClassToTest> {
boolean calledPrivate = false;
@Mock
private void method(String arg) {
calledPrivate = true;
}
}
}
关于java - 验证私有(private)方法未执行 JMockit,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38797588/