使用EasyMock模拟超类方法

时间:2014-02-01 21:11:20

标签: java unit-testing easymock

我有一个类层次结构如下:

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来模拟它?

3 个答案:

答案 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方法时,它会以前面描述的方式静默运行。

希望这对将来有所帮助。

干杯, 史蒂夫