在 SleepyProxy 中包装服务以模拟延迟

Wrapping a service in a SleepyProxy to simulate lag

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

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

来自我的测试class:

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

产生以下错误:

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

请注意:

为什么我在投射到 MyService 时遇到问题?调试时所有对象值似乎都对齐。有没有更好的方法可以模拟我的服务延迟? (除了为每个制作一个 'test service')。

感谢您的帮助!

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

class MyService implements ServiceInterface

然后像这样使用您的代理:

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

Proxy.newProxyInstanceMyService class 无关,它只会创建将 运行 InvocationHandler.invoke 调用方法的对象.