【问题标题】:Can I use jmock to replace an implementation returned by a factory?我可以使用 jmock 替换工厂返回的实现吗?
【发布时间】:2008-11-10 23:07:48
【问题描述】:
我有一个返回接口FormatService的工厂:
public class FormatServiceFactory {
public FormatService getService() {
...
}
}
是否可以模拟这个工厂,以便它在我们的单元测试中总是返回 FormatService - FormatServiceStub 的存根实现?
【问题讨论】:
标签:
java
unit-testing
interface
mocking
【解决方案1】:
视情况而定。被测代码如何获取/使用工厂?
如果它在您正在测试的方法中显式实例化,或者如果它是一个静态工厂,您将无法模拟它。
如果被注入到被测对象中,你可以在执行测试之前创建并注入模拟工厂。
使用 JMock 模拟工厂应该很容易。从您的示例代码来看,它看起来像是一个类,而不是一个接口,因此您需要使用 JMock 的 cglib 版本和 JMock 1 的 cglib 包中的 MockObjectTestCase 类,或者 JMock 的 ClassImposteriser 2.
一旦被模拟,当您定义 getService() 方法的期望时,您可以让它返回您的存根实现(甚至是模拟 FormatService)。
【解决方案2】:
嘲讽嘲讽 = new JUnit4Mockery() {{setImposteriser(ClassImposteriser.INSTANCE);}};
最终的 FormatServiceFactory 工厂 = mockery.mock(FormatServiceFactory .class);
context.checking(新期望() {{
oneOf(工厂).getService(); will(returnValue(new FormatServiceMock()));
}});