我有一个工厂,它返回一个接口FormatService
:
public class FormatServiceFactory {
public FormatService getService() {
...
}
}
是否可以模拟这个工厂,以便它总是在我们的单元测试中返回FormatService
- FormatServiceStub
的存根实现?
答案 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())); }});