我有一个类层次结构如下:
public class Parent {
public int parentMethod(...) {...}
}
public class Child extends Parent {
public int childMethod(...) {...}
}
我想模拟Child
类的实例,但经常在该对象上调用parentMethod
(以及childMethod
)。当我尝试在expect()
调用时使用parentMethod
时,默认的EasyMock行为是使用 real parentMethod
,但这不起作用,因为有一堆父类中的状态,我不想嘲笑。有没有办法使用createMockBuilder
或任何其他EasyMock API来模拟它?
答案 0 :(得分:1)
我认为局部嘲笑就是你在想什么。
Partial Mocks允许您拥有一个具有特定功能(特定方法)模拟的真实对象。因此,在调用parentMethod
时会使用真实状态,但可以模拟childMethod
。
然后设置您的期望并以与完全模拟对象相同的方式验证模拟。
就在EasyMock中创建一个而言,类似这样的东西可以解决问题:
final IMockBuilder<Child> mockBuilder = EasyMock.createMockBuilder(Child.class);
mockBuilder.addMockedMethod("childMethod");
final Child mockedChild = mockBuilder.createMock();
EasyMock.expect(mockedChild.childMethod()).andReturn(1);
EasyMock.replay(mockedChild);
//Whatever else happens in your test
EasyMock.verify(mockedChild);
答案 1 :(得分:0)
从您的问题中我能理解的内容。您是否不想模拟parentClass {}。
您可以尝试一下。
objenesis = new ObjenesisStd(); // or ObjenesisSerializer
obj_1 = objenesis.newInstance(Child.class);
method = obj_1.getClass().getDeclaredMethod("childMethod",NULL);
method.setAccessible(true);
method.invoke(obj_1,NULL);
通过这种方法,您可以仅模拟子类,而不必依赖任何父类。
答案 2 :(得分:0)
在提出原始问题之后的六年中,我碰到了我认为OP真正要问的问题:如何模拟子类,并模拟父类中的所有方法?如果是这种情况,这里的其他答案(涉及部分模拟)就不合常理了。
无论如何,这只是发生在我身上。当我模拟子类时,调用了父级的真实方法。答案?父方法被声明为final
,因此EasyMock无法在模拟的子类中覆盖它。删除final
声明将其清除,并且该方法现在已被模拟。
现在,关于部分模拟的建议并非一无是处:我通过尝试通过部分模拟仅模拟该方法来弄清了这一点,那时EasyMock告诉我它无法做到。当仅使用掩盖式createMock
方法时,它会以前面描述的方式静默运行。
希望这对将来有所帮助。
干杯, 史蒂夫