在SleepyProxy中包装服务以模拟滞后

时间:2017-04-12 19:37:51

标签: java spring junit dynamic-proxy

我试图在代理中包装服务以模拟测试期间的延迟。以下类用于包装对象并为任何调用的方法将线程休眠100ms。

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class SleepyProxy<T> implements InvocationHandler {

  private T wrapped;

  private SleepyProxy(T toWrap) {
    this.wrapped = toWrap;
  }

  @SuppressWarnings({"unchecked", "rawtypes"})
  public static <T> T createProxy(T toWrap) {

    Object proxy = Proxy.newProxyInstance(
         toWrap.getClass().getClassLoader(), 
         toWrap.getClass().getInterfaces(), 
         new SleepyProxy(toWrap));

    return (T) proxy;
  }

  @Override
  public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

    Object result = method.invoke(wrapped, args);

    nap();

    return result;
  }

  private void nap() {
    try {
     Thread.sleep(100);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
  }
}

从我的测试班:

private MyService service = SleepyProxy.createProxy(ServiceProvider.getMyService());

产生以下错误:

java.lang.ClassCastException: com.sun.proxy.$Proxy33 cannot be cast to com.example.service.MyService;

请注意:

  • 我正在使用Spring Framework和JUnit4
  • 使用@RunWith注释的测试类(SpringJUnit4ClassRunner.class)
  • 我学习春天;我不确定是否需要使用Spring InvocationHandler / Proxy服务

为什么我有问题转换为MyService?调试时,所有对象值似乎都排成一行。有没有更好的方法来模拟我的服务滞后? (除了为每个人提供“测试服务”之外)。

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

问题是MyService是一个类,而Proxy.newProxyInstance创建的对象实现了您在第二个参数中提供的接口。让它工作MyService需要实现接口,所以:

class MyService implements ServiceInterface

以后使用你的代理:

 ServiceInterface service = SleepyProxy.createProxy(ServiceProvider.getMyService());

Proxy.newProxyInstanceMyService类无关,它只会在您调用方法时创建将运行InvocationHandler.invoke的对象。