第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在多線程環(huán)境中使用模擬對象

在多線程環(huán)境中使用模擬對象

www說 2021-08-06 10:09:18
從jMock 2.6開始,我可以確保通過多個線程一致地看到我的模擬對象final Mockery mockery = new Mockery();mockery.setThreadingPolicy(new Synchroniser());使用jMock 2.5時,我有哪些選擇(我遇到間歇性測試“碎片”)?特別是,使用?包裝所有模擬對象方法調(diào)用是否足夠(更新:不,不符合預(yù)期)synchronized?<T> T synchronizedMock(final T mock,        final Class<T> clazz) {    return (T) Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(),            new Class[] {clazz, CaptureControl.class},            (proxy, method, args) -> {                synchronized (mock) {                    return method.invoke(mock, args);                }            });}使用上述方法時,我遇到任何死鎖的機(jī)會有多大?
查看完整描述

1 回答

?
叮當(dāng)貓咪

TA貢獻(xiàn)1776條經(jīng)驗(yàn) 獲得超12個贊

您是否考慮過使用 CGLib + ObjenesisHelper?CGLib 將允許您代理類和接口,而不僅僅是像 那樣的接口java.lang.reflect.Proxy,并且 ObjenesisHelper 將允許您構(gòu)造類的實(shí)例而無需調(diào)用構(gòu)造函數(shù)。請參閱此處的 CGLib 示例和此處的 ObjenesisHelper 示例。


此外,您可以解包InvocationTargetException以確保代理實(shí)例拋出Exception由模擬類定義的預(yù)期。最后, usingregisterStaticCallbacks將確保綁定的方法攔截器存在于所有調(diào)用線程中。


public <T> T createProxy(final Class<? extends T> classToMock, final T mock) {

    final MethodInterceptor interceptor = (object, method, args, proxy) -> {

        synchronized (mock) {

            try {

                return method.invoke(mock, args);

            } catch (final InvocationTargetException e) {

                if (e.getCause() != null) {

                    throw e.getCause();

                }

                throw e;

            }

        }

    };


    final Enhancer enhancer = new Enhancer();

    enhancer.setSuperclass(classToMock);

    final Set<Class<?>> interfaces = new LinkedHashSet<>();

    if (classToMock.isInterface()) {

        interfaces.add(classToMock);

    }

    interfaces.addAll(Arrays.asList(classToMock.getInterfaces()));

    interfaces.add(CaptureControl.class);

    enhancer.setInterfaces(interfaces.toArray(new Class[interfaces.size()]));

    enhancer.setCallbackType(interceptor.getClass());


    final Class<?> proxyClass = enhancer.createClass();

    Enhancer.registerStaticCallbacks(proxyClass, new Callback[] { interceptor });

    return (T) ObjenesisHelper.newInstance(proxyClass);

}

使用上述方法時,我遇到任何死鎖的機(jī)會有多大?


我不相信您提供的解決方案,也不相信上面建議的解決方案會遇到任何死鎖(假設(shè)您的代碼中沒有死鎖)。使用synchronizedwill 確保在任何給定時間只有一個線程可以操作模擬實(shí)例..并且除非 jmock 將方法調(diào)用委托給一個單獨(dú)的線程(據(jù)我所知它沒有),那么代碼應(yīng)該正常執(zhí)行而不是阻塞。如果 jmock 要求您Mockery一次鎖定所有實(shí)例,那么您可以傳入一個專用對象進(jìn)行同步,或者為所有代理攔截器提供可重入鎖以共享。


查看完整回答
反對 回復(fù) 2021-08-06
  • 1 回答
  • 0 關(guān)注
  • 243 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號