2017-04-12 66 views
0

我試圖在代理中包裝服務以模擬測試期間的滯後。下面的類意味着包裝一個對象,併爲任何被調用的方法睡100ms。在SleepyProxy中包裝服務以模擬滯後

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;我不確定是否需要使用Spring InvocationHandler/Proxy服務

爲什麼我的問題會轉換爲MyService?調試時,所有對象值似乎排列齊全。有沒有更好的方法可以模擬我的服務滯後? (除了爲每個人提供'測試服務')。

感謝您的幫助!

回答

0

問題是MyService是一個類,並且Proxy.newProxyInstance創建實現您在第二個參數中提供的接口的對象。爲了有工作MyService需要實現接口,以便:

class MyService implements ServiceInterface 

後來使用你的代理這樣的:

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

Proxy.newProxyInstance無關與MyService類,它只會創建對象,將運行InvocationHandler.invoke當你會調用它的方法。

+0

非常好,這就是它。謝謝! – Chris