JMock使用带有具体类的模拟对象

时间:2013-06-21 10:47:00

标签: java unit-testing testing jmock cglib

我有一个没有接口的对象(我不能改变它),我能够使用

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

此对象已成功模拟,并且在调试时我可以看到参数已成功设置,我的问题是如何使用此模拟对象;例如,如何返回对象returnOnject以便稍后在代码中使用,并模拟对该对象的调用?

编辑:我正在使用JMock和CGLIB

1 个答案:

答案 0 :(得分:0)

如果我是你,我不会在单元测试之外使用jMock,而是直接使用代理框架,如cglib或javassist。您可以创建ObjectExample的代理,它基本上代表此模拟类的子类。然后,您可以按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();
}