在 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;
请注意:
- 我正在使用 Spring Framework 和 JUnit4
- 用@RunWith(SpringJUnit4ClassRunner.class)注释的测试class
- 我在学习Spring;我不确定我是否需要使用 Spring InvocationHandler / Proxy 服务
为什么我在投射到 MyService 时遇到问题?调试时所有对象值似乎都对齐。有没有更好的方法可以模拟我的服务延迟? (除了为每个制作一个 'test service')。
感谢您的帮助!
问题是 MyService
是一个 class,而 Proxy.newProxyInstance
创建的对象实现了您在第二个参数中提供的接口。要让它工作 MyService
需要实现接口所以:
class MyService implements ServiceInterface
然后像这样使用您的代理:
ServiceInterface service = SleepyProxy.createProxy(ServiceProvider.getMyService());
Proxy.newProxyInstance
与 MyService
class 无关,它只会创建将 运行 InvocationHandler.invoke
调用方法的对象.
我正在尝试将服务包装在代理中以模拟测试期间的延迟。以下 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;
请注意:
- 我正在使用 Spring Framework 和 JUnit4
- 用@RunWith(SpringJUnit4ClassRunner.class)注释的测试class
- 我在学习Spring;我不确定我是否需要使用 Spring InvocationHandler / Proxy 服务
为什么我在投射到 MyService 时遇到问题?调试时所有对象值似乎都对齐。有没有更好的方法可以模拟我的服务延迟? (除了为每个制作一个 'test service')。
感谢您的帮助!
问题是 MyService
是一个 class,而 Proxy.newProxyInstance
创建的对象实现了您在第二个参数中提供的接口。要让它工作 MyService
需要实现接口所以:
class MyService implements ServiceInterface
然后像这样使用您的代理:
ServiceInterface service = SleepyProxy.createProxy(ServiceProvider.getMyService());
Proxy.newProxyInstance
与 MyService
class 无关,它只会创建将 运行 InvocationHandler.invoke
调用方法的对象.