【发布时间】:2017-05-13 12:29:26
【问题描述】:
我在方法中有以下代码。
AdminServiceProxy proxy=new AdminServiceProxy();
boolean flag=proxy.isAdminFree();
如何使用Jmock 模拟“AdminServiceProxy”。由于对象是使用 new 运算符创建的。
【问题讨论】:
我在方法中有以下代码。
AdminServiceProxy proxy=new AdminServiceProxy();
boolean flag=proxy.isAdminFree();
如何使用Jmock 模拟“AdminServiceProxy”。由于对象是使用 new 运算符创建的。
【问题讨论】:
你不能。
一种可能的解决方案是创建一个 AdminServiceProxyFactory 接口和实现:
public interface AdminServiceProxyFactory {
public AdminServiceProxy createAdminServiceProxy();
}
public class AdminServiceProxyFactoryImpl {
public AdminServiceProxy createAdminServiceProxy() {
return new AdminServiceProxy();
}
}
然后在你的类中添加一个 setter 和私有属性:
public class Foo {
private AdminServiceProxyFactory adminServiceProxyFactory;
...
public void setAdminServiceProxyFactory(AdminServiceProxyFactory factory) {
adminServiceProxyFactory = factory;
}
public myMethod() {
...
AdminServiceProxy proxy=adminServiceProxyFactory.createAdminServiceProxy();
boolean flag=proxy.isAdminFree();
...
}
}
现在您可以创建一个模拟 AdminServiceProxyFactory 并将其注入您的类。然后,您告诉您的模拟工厂在调用时返回一个模拟 AdminServiceProxy。
【讨论】:
jMock 不支持模拟“未来对象”或模拟构造函数。
其他模拟库提供此类支持。其中之一(我开发的)是 JMockit,其语法最初受到 jMock 的“期望”的启发。在这种情况下,我们可以:
@Test
public void exampleTestThatMocksAFutureObject(@Mocked AdminServiceProxy proxy) {
new Expectations() {{ proxy.isAdminFree(); result = true; }};
// Call code under test which instantiates an AdminServiceProxy...
boolean adminFree = new AdminServiceProxy().isAdminFree();
assertTrue(adminFree);
}
【讨论】: