我可以使用jmock替换工厂返回的实现吗?

时间:2008-11-10 23:07:49

标签: java unit-testing interface mocking

我有一个工厂,它返回一个接口FormatService

public class FormatServiceFactory {
    public FormatService getService() {
        ...
    }
}

是否可以模拟这个工厂,以便它总是在我们的单元测试中返回FormatService - FormatServiceStub的存根实现?

2 个答案:

答案 0 :(得分:1)

取决于。工厂如何获得/使用被测代码?

如果它在您正在测试的方法中显式实例化,或者它是静态工厂,您将无法模拟它。

如果将其注入到测试对象中,则可以在执行测试之前创建并注入模拟工厂。

使用JMock嘲弄工厂应该很容易。从您的示例代码看,它看起来像是一个类,而不是一个接口,因此您需要使用cglib版本的JMock和cglib包中的MockObjectTestCase类用于JMock 1,或者{{3对于JMock 2。

一旦被模拟,你可以在定义getService()方法的期望时让它返回你的存根实现(甚至是模拟的FormatService)。

答案 1 :(得分:0)

Mockery mockery = new JUnit4Mockery(){{setImposteriser(ClassImposteriser.INSTANCE);}};

final FormatServiceFactory factory = mockery.mock(FormatServiceFactory .class);

context.checking(new Expectations(){{ oneOf(factory).getService();将(returnValue(new FormatServiceMock())); }});