Java 验证JMockit是否未执行私有方法
我环顾了一下这个问题,没有找到我真正需要的。我学到了更多关于JMockit和mocking的知识。这很好。似乎每个人都想知道如何确保执行了某些操作。我想学习相反的知识 好的-我正在编写一个测试来检查公共方法中的一条不太愉快的路径。正在测试的方法是Java 验证JMockit是否未执行私有方法,java,unit-testing,jmockit,Java,Unit Testing,Jmockit,我环顾了一下这个问题,没有找到我真正需要的。我学到了更多关于JMockit和mocking的知识。这很好。似乎每个人都想知道如何确保执行了某些操作。我想学习相反的知识 好的-我正在编写一个测试来检查公共方法中的一条不太愉快的路径。正在测试的方法是void,因此我不能真正断言结果我想做的是验证此测试用例中没有执行方法。 例如: class ClassToTest { private void method(String arg){} public void publicMethod(St
void
,因此我不能真正断言结果我想做的是验证此测试用例中没有执行方法。
例如:
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:此时缺少对模拟类型的调用;请确保此类调用仅在声明合适的模拟字段或参数后出现
。在times=0的行上代码>
我知道,invoke
正在执行私有方法。我绞尽脑汁想弄清楚如何在不调用/执行该方法的情况下“检查”该方法是否被调用
谢谢。实现这一点的一种方法是为以下对象使用模拟API:
import static org.junit.Assert.assertFalse;
导入org.junit.Test;
导入mockit.Mock;
导入mockit.MockUp;
导入mockit.Tested;
公共类测试类{
@测试
private ClassToTest ClassToTest=new ClassToTest();
@试验
public void testCheckingIfPrivateMethodWasCalled(){
PrivateMethodCheckMockUp模型=新PrivateMethodCheckMockUp(){
@嘲弄
私有void方法(字符串arg){
calledPrivate=true;
}
};
classToTest.publicMethod(“string1”、“string2”);
assertFalse(实体模型,称为IVate);
}
类PrivateMethodCheckMockUp扩展了MockUp{
布尔值calledPrivate=false;
@嘲弄
私有void方法(字符串arg){
calledPrivate=true;
}
}
}
测试应用程序的状态。如果私有方法的调用很重要,那么它应该会影响某个地方的状态,并且您应该能够对其进行测试。除此之外,还可以考虑给方法默认可见性(AKA包保护),这样您的测试就可以验证它。(这是假设您的测试与您正在测试的类位于同一个包中,这是一个合理的假设。)永远不要模拟private
方法,这样做没有充分的理由。试想一下:关心质量的开发人员可以随时创建或内联私有方法。您真的想在通过保留功能的重构改进生产代码的同时修改工作测试吗?即使你不关心这一点,也可以考虑团队或将来的其他开发人员。所以你在嘲笑这个类的一个实例,然后嘲笑那个类的方法。你模拟了什么PrivateMethodCheckMockUp#method
两次?实际上ClassToTest
只模拟了一次,@Tested
不会创建模拟,“JMockit可以自动实例化这个类,并有选择地注入相关的模拟依赖项。这就是@Tested注释的作用。”然后我使用MockUp
API模拟它的私有方法,并使用一个标志来知道它是否被调用(可能使用Assert.fail()
就足够了)。
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;
}
}
}