如何在Jmock中模拟对象?如果使用new运算符创建了Object

时间:2016-12-13 07:50:29

标签: java jmock

我在方法下面有一段代码。

AdminServiceProxy proxy=new AdminServiceProxy();
boolean flag=proxy.isAdminFree();

如何模拟" AdminServiceProxy"使用Jmock。因为使用new运算符创建了对象。

2 个答案:

答案 0 :(得分:0)

你不能。

一种可能的解决方案是创建一个AdminServiceProxyFactory接口和实现:

public interface AdminServiceProxyFactory {
    public AdminServiceProxy createAdminServiceProxy();
}

public class AdminServiceProxyFactoryImpl {
    public AdminServiceProxy createAdminServiceProxy() {
        return new AdminServiceProxy();
    }
}

然后在你的课堂上添加一个setter和private属性:

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。

答案 1 :(得分:0)

jMock不支持嘲笑"未来的对象"或嘲弄建设者。

其他模拟库提供此类支持。其中一个(我开发的)是JMockit,其语法最初的灵感来自jMock" Expectations"。在这种情况下,我们可以:

@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);
}