2009-10-20 11 views
1

У меня есть следующий класс. Он имеет код для подключения к 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 в конструкторе.

+0

Вы говорите что-то в этом роде ... «С таким телом хорошо, что мы не можем видеть вас в сыром». :-) –

ответ

3

JMock с ClassImposteriser может это сделать, как и большинство удачных издевательств.

ClassImposteriser создает фиктивные экземпляров без вызова конструктора издевался класс. Итак, классы с конструкторами, которые имеют аргументы или переадресовывают вызовы объекта можно смело высмеять.

+0

Посмотрел код. Звучит круто. Никогда раньше не использовался JMock. +1 –

+0

Нужно немного привыкнуть (дженерики могут немного причесываться), но это очень полезно. – skaffman

0

Вы можете просто создать класс mock, подклассифицируя абстрактный класс BapiExecutor и реализуя поведение, которое вы хотите в execute() (или любой другой метод). Вам не нужно возвращаться к инфраструктуре здесь.

Не могли бы вы рассказать о том, что такое блокировка?

0

Я ожидаю, что EidCcBapiExecutor простирается от BapiExecutor.

public class EidCcBapiExecutor extends BapiExecutor { 
... 
} 

Чем вы могли бы создать макет класса для тестирования конкретного метода, как:

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

    } 

объект, который вы размещаете в конструкторе, может быть создан в методе setUp из вашего теста JUnit!

Смежные вопросы