2016-03-10 6 views
6

रोबोटियम में सोलो क्लास पर प्रतीक्षाफॉर कंडीशन() एक स्लीपर ऑब्जेक्ट का उपयोग एक शर्त की जांच के बीच में एक थ्रेड सोने के लिए करता है। स्लीपर क्लास में PAUSE 500 मिलीसेकंड के रूप में परिभाषित किया गया है। मैं इसे कम करना चाहता हूं, आदर्श रूप से रोबोटियम स्रोत कोड डाउनलोड करने, इसे बदलने और रोबोटियम को पुन: संकलित करने के बिना।रोबोटियम - स्लीपर क्लास में PAUSE अवधि को अनुकूलित करें

मैं सोलो वर्ग का विस्तार और अपने ही वेटर वर्ग कि कम नींद के अंतराल के साथ एक कस्टम स्लीपर वस्तु का प्रयोग करेंगे निर्माण कोशिश की, लेकिन वेटर पैकेज स्तर तक पहुँच गया है ताकि इस मार्ग उपलब्ध नहीं है।

अंतिम कीवर्ड एक तरफ, this commit message कि कस्टम विन्यास इंगित करने के लिए किया जाना चाहिए लगता है (या आ रहे हैं), लेकिन मैं Solo.Config class में उन लोगों के स्थिरांक अनुकूलित करने के लिए किसी भी तरह से नहीं दिख रहा।

क्या किसी के पास कोई समाधान है? धन्यवाद!

अद्यतन: @ vRallev का जवाब नीचे काम प्रतिबिंब के साथ किया जाता है। मैंने pull request बनाया जो आज रोबोटियम में विलय हो गया था। अगली रिलीज में, आप कॉन्फ़िगर क्लास के साथ नींद के समय को कॉन्फ़िगर करने में सक्षम होंगे।

+0

आप केवल "waitForCondition" के बजाय सभी का इंतजार functoin के सोने का समय ऊपर लिख करना चाहते हैं, यही कारण है कि तुम सिर्फ अपनी खुद की प्रतीक्षा समारोह का निर्माण नहीं करतीं? –

+0

क्योंकि तब मैं प्रभावी रूप से ऐसा कर रहा था जो मैंने कहा था कि मैं नहीं करना चाहता था: रोबोटियम स्रोत कोड लेना, इसे बदलना, और पुन: सम्मिलित करना। – Mark

+0

मेरा मतलब है कि आप स्रोत कोड को संपादित करने के बजाय एक नई कस्टम कक्षा में एक नया फ़ंक्शन बना सकते हैं। "WaitForCondition" के पीछे तर्क बहुत स्पष्ट और कार्यान्वित करने में आसान है। इसे आपको पुन: संकलित करने की आवश्यकता नहीं होगी। –

उत्तर

5

भले ही Waiter या Sleeper कक्षा सार्वजनिक थी, तो आप मानों को नहीं बदल सके। कारण यह है कि Solo कक्षा में फ़ील्ड अंतिम है और कन्स्ट्रक्टर जहां मूल्य असाइन किया गया है वह निजी है।

इसे हैक करने का एकमात्र तरीका प्रतिबिंब के साथ है। मैंने नीचे दिए गए समाधान की कोशिश की और यह काम करता है। दोनों वर्गों के पैकेज पर ध्यान दें!

package com.robotium.solo; 

import java.lang.reflect.Field; 

public class SoloHack { 

    private final Solo mSolo; 

    public SoloHack(Solo solo) { 
    mSolo = solo; 
    } 

    public void hack() throws NoSuchFieldException, IllegalAccessException { 
    Field field = mSolo.waiter.getClass().getDeclaredField("sleeper"); 
    field.setAccessible(true); 

    // Object value = field.get(mSolo.waiter); 
    // Class<?> aClass = value.getClass(); 

    field.set(mSolo.waiter, new SleeperHack()); 

    // Object newValue = field.get(mSolo.waiter); 
    // Class<?> newClass = newValue.getClass(); 
    } 
} 

और

package com.robotium.solo; 

public class SleeperHack extends Sleeper { 

    @Override 
    public void sleep() { 
    sleep(50); 
    } 
} 
+0

बहुत बढ़िया समाधान! बहुत बहुत धन्यवाद! – Mark

संबंधित मुद्दे