【问题标题】:how to mock a parametrized constructor?如何模拟参数化构造函数?
【发布时间】:2009-10-20 07:36:28
【问题描述】:

我有以下课程。它的构造函数中有连接到 SAP 的代码。我想模拟一个抽象方法(子类定义实现)。

public abstract class BapiExecutor {
        ...
        public BapiExecutor(final SapConnectionInfo connectionInfo)
            throws java.lang.Exception {
        if (!validConnectorData()) {
            throw new IllegalArgumentException(
                    "Does not have valid data to connect to SAP");
        }
        initializeState(connectionInfo);
    }

    public abstract Object execute() throws Exception ;
        ....

}

我要测试的单元是: 我想模拟对execute() 方法的调用。

private String invokeBapiToAddAssociation(Map associationMap,
            SapConnectionInfo connectionInfo) {
        EidCcBapiExecutor executor = null;
        String bapiExecutionResult = null;
        try {
            executor = new EidCcBapiExecutor(connectionInfo, associationMap);
            bapiExecutionResult = (String) executor.execute();
        } catch (Exception e) {
            e.printStackTrace();
            throw new CcGenericException(
                    "Exception occurred while invoking the EID-CC Association BAPI executor!",
                    e);
        }
        return bapiExecutionResult;
    }

任何支持模拟参数化构造函数的 Java 框架?

我只是想避免在构造函数中连接到 SAP。

【问题讨论】:

  • 你对它说这样的话......“有这样的身体,我们看不到你是件好事”。 :-)

标签: java unit-testing mocking


【解决方案1】:

JMockClassImposteriser 可以做到这一点,大多数优秀的模拟框架也可以。

ClassImposteriser 创建模拟 实例而不调用 模拟类的构造函数。所以 具有构造函数的类 参数或调用可覆盖的方法 可以安全地模拟对象。

【讨论】:

  • 查看了代码。听起来很酷。以前从未使用过 JMock。 +1
  • 这需要一点时间来适应(泛型可能会有点毛茸茸),但它非常有用。
【解决方案2】:

您可以简单地创建模拟类,继承抽象 BapiExecutor 类,并在 execute()(或任何其他方法)中实现您想要的行为。您无需在此处恢复为框架。

您能否详细说明一下阻塞点是什么?

【讨论】:

    【解决方案3】:

    我希望 EidCcBapiExecutor 从 BapiExecutor 扩展。

    public class EidCcBapiExecutor extends BapiExecutor {
    ...
    }
    

    您可以创建 Mockup 类来测试特定方法,例如:

    public class EidCcBapiExecutorMockup extends EidCcBapiExecutor{
    
       public EidCcBapiExecutorMockup (final SapConnectionInfo connectionInfo){
         super(connectionInfo);
       }
    
       public Object execute() throws Exception {
          // You mockup code
       }
    }
    

    如果你想测试构造函数,你可以像这样创建类:

    public class EidCcBapiExecutorMockup extends EidCcBapiExecutor{
    
           public EidCcBapiExecutorMockup (){
             super(new SapConnectionInfo());
           }
    
        }
    

    您放置在构造函数中的对象可以在您的 JUnit 测试的 setUp 方法中创建!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多