【问题标题】:How to Mock Object in Jmock? If Object created using new operator如何在 Jmock 中模拟对象?如果使用 new 运算符创建对象
【发布时间】:2017-05-13 12:29:26
【问题描述】:

我在方法中有以下代码。

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

如何使用Jmock 模拟“AdminServiceProxy”。由于对象是使用 new 运算符创建的。

【问题讨论】:

    标签: java jmock


    【解决方案1】:

    你不能。

    一种可能的解决方案是创建一个 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。

    【讨论】:

    • 问题是我不允许更改源代码。在这种情况下,我们可能不得不使用 Power-mock。 @JimNicholson 感谢您的帮助。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-16
      • 1970-01-01
      • 1970-01-01
      • 2015-11-19
      相关资源
      最近更新 更多