2012-03-14 2 views
0

настоящее время я использую EasyMock и создания фиктивных объектов, как этотСоздание фиктивного объекта без рамок

mockedObject = createMock(myInterface.class); 

Easy издеваться ненужная над головой (так как метод, который я дразнить очень просто), и я хотел бы создать без него.

Но проблема в том, что myInterface - это интерфейс, так как я его создаю. Пожалуйста, предложите.

Спасибо, Sriram

ответ

3

Самый простой способ - создать внутренний класс, реализующий интерфейс, реализовать методы для возврата требуемых данных, а затем использовать его в тестовом примере.

Например:

public void testMethod () 
{ 
    MyInterface mockObject = new MyInterface () { 
     public void myMethod () 
     { 
      // NOOP 
     } 

     public int myFunction () 
     { 
      return -1 ; 
     } 
    } 

    // Proceed with the test case using mockObject 
} 
+0

Является ли создание внутреннего класса хорошей практикой, просто любопытно? – sriram

+2

Это зависит от того, повторите ли вы повторное использование этой конкретной реализации класса. В моем случае многие макетные объекты запускались как анонимные внутренние классы, и, когда я начал их повторно использовать, они стали популярными. –

+0

Hagger. Большое спасибо! – sriram

0

Вы не можете создать экземпляр интерфейса, вы должны работать с одним из ее реализации. Поскольку вы решили отказаться от EasyMock (не знаете почему), вам нужно либо создать экземпляр одной из существующих реализаций интерфейсов, либо создать новую для тестирования.

0

Вы можете создать и Anoymous класса, например

MyInterface myMock = new MyInterface() { 
           ... methods implemented here 
          }; 
0

Если вам нужно проверить количество раз, когда вы вызываете метод, вы можете добавить простой счетчик для каждого метода.

например.

public void testMethod () 
{ 
    MyInterface mockObject = new MyInterface () { 
     public int MyMethodCount = 0; 
     public int MyFunctionCount = 0; 

     public void myMethod () 
     { 
      MyMethodCount++; 
      // NOOP 
     } 

     public int myFunction () 
     { 
      MyFunctionCount++; 
      return -1 ; 
     } 
    } 

    // Proceed with the test case using mockObject 
} 
0

В отсутствие фальшивой структуры, java.lang.reflect.Proxy - ваш лучший выбор. Если вы никогда не использовали его раньше, вы можете создать динамический объект, который реализует набор интерфейсов, и вы используете InvocationHandler для проверки каждого вызова метода и решения, что делать. Это очень мощный метод (и не ограничиваясь тестированием), поскольку вы можете делегировать вызовы методов другим объектам и т. Д. Он также изолирует вас от определенных изменений интерфейса, когда вы выполняете такое делегирование, поскольку вы не объявить каждый метод. Он адаптируется к интерфейсу в runtine.

public static interface MyIntf { 
    String foo(String arg1); 
} 

InvocationHandler invocationHandler = new InvocationHandler() { 
    @Override 
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { 
     if (method.getName().equals("foo") && 
      method.getParameterTypes().length == 1 && 
      method.getParameterTypes()[0] == String.class) { 
      // do your mocking here. For now i'll just return the input 
      return args[0]; 
     } 
     else { 
      return null; 
     } 
    } 
}; 

MyIntf myintf = (MyIntf) Proxy.newProxyInstance(getClass().getClassLoader(), 
      new Class[] { MyIntf.class }, 
      invocationHandler); 

System.out.println(myintf.foo("abc")); 
Смежные вопросы