如何模拟参数化构造函数?

时间:2009-10-20 07:36:28

标签: java unit-testing mocking

我有以下课程。它具有在其构造函数中连接到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。

3 个答案:

答案 0 :(得分:3)

使用JMock

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

  

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

答案 1 :(得分:0)

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

请您详细说明阻塞点是什么?

答案 2 :(得分:0)

我希望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方法中创建!