JMock с использованием издевательских объектов с конкретным классом

У меня есть объект без интерфейса (я не могу это изменить), я смог издеваться над ним, используя

Mock mockedClass = mock(ObjectExample.class, "returnObject",
            new Class[ ]{java.lang.Integer, java.lang.Integer},
            new Object[ ]{1,9001});

Этот объект успешно издевался, и при отладке я вижу, что параметры успешно устанавливаются, мой вопрос в том, как я могу использовать этот издевательский объект; например, как мне вернуть объект returnOnject для дальнейшего использования в коде и смоделировать вызовы этого объекта?

Изменить: я использую JMock с CGLIB


person Matt C    schedule 21.06.2013    source источник
comment
где этот объект будет использоваться? Можете ли вы показать нам тест?   -  person Steve Freeman    schedule 26.06.2013


Ответы (1)


На вашем месте я бы не использовал jMock вне модульного теста, а использовал бы напрямую прокси-фреймворк, такой как cglib или javassist. Вы можете создать прокси ObjectExample, который в основном представляет собой подкласс этого класса mocked. Затем вы можете использовать этот объект подкласса по типу ObjectExample.

Вот пример того, как вы можете создать прокси с помощью cglib:

@Test
public void testMethodInterceptor() throws Exception {
  Enhancer enhancer = new Enhancer();
  enhancer.setSuperclass(ObjectExample.class);
  enhancer.setCallback(new MethodInterceptor() {
    @Override
    public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy)
        throws Throwable {
      if(method.getName().equals("returnObject")) {
        // Add your proxy logic here.
      } else {
        proxy.invokeSuper(obj, args);
      }
    }
  });
  ObjectExample proxy = (ObjectExample) enhancer.create();
}
person Rafael Winterhalter    schedule 02.12.2013