में चलाने के हैंडलर के looper मैं, एक बहुत ही सरल वर्ग है जो एक Handler
है है यह नया संदेश फिर से भेजता है जब यह संदेश संभालता है:Robolectric: मेरे मामले
public class MyRepeatTask{
…
public void startTask() {
// send message with delay 5 sec
handler.sendMessageDelayed(handler.obtainMessage(…), 5000);
}
Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
// I put a log for unit test
System.out.println(“handling message …”);
// send message with delay again
handler.sendMessageDelayed(handler.obtainMessage(…), 5000);
}
}
}
ऊपर दिखने के रूप में, जब startTask()
कहा जाता है, हैंडलर 5 सेकंड में एक संदेश भेजना शुरू करता है। फिर, handleMessage()
कॉलबैक में, handler
फिर से 5 सेकंड देरी के साथ एक संदेश भेजें। इसका उद्देश्य बार-बार कुछ कार्य करना है (जैसे System.out.println()
)।
मैं Robolectric साथ ऊपर वर्ग का परीक्षण:
@RunWith(RobolectricTestRunner.class)
public class MyRepeatTaskTest {
@Test
public void testStartTask() {
MyRepeatTask task = new MyRepeatTask();
task.startTask();
// run looper of ‘handler’ in task
ShadowLooper shadowLooper = Shadows.shadowOf(task.handler.getLooper());
shadowLooper.runToEndOfTasks();
// sleep for 30 seconds
Thread.sleep(30 * 1000);
}
}
मैं System.out.println()
संदेश "handling message …
" हर 5 सेकंड देखने की उम्मीद। हालांकि, जब मैं अपना परीक्षण चलाता हूं, तो मुझे केवल संदेश टर्मिनल में दिखाई देता है।
ऐसा लगता है कि handler
के Looper
के लिए ही एक कार्य समाप्त हो गया है लग रहा है, तो यह बंद कर दिया।
अगर मैं सही हूँ, कैसे Robolectric में हर समय चल रहा looper रखने के लिए? अगर मैं गलत हूं, तो मुझे केवल एक लॉग संदेश क्यों दिखाई देता है?
========== अद्यतन ===========
मैंने कोशिश की @rds के जवाब, मैं द्वारा Thread.sleep(30 * 1000);
लाए गए:
for (int i = 0; i < N; i++){
shadowLooper.runToEndOfTasks();
}
अब मैं एन बार देख सकता हूं "handling message …
"। लेकिन, पूरा परीक्षण देरी अनुकरण नहीं कर रहा है। handler.sendMessageDelayed(handler.obtainMessage(…), 5000)
के साथ संदेश भेजते समय मेरे पास 5 सेकंड की देरी है, क्या यह है कि रोबोलेक्ट्रिक फ्रेमवर्क इस तरह के देरी संदेश को अनुकरण नहीं करता है ??? मेरे परीक्षण में देरी कैसे हो सकती है?
यह भी एक और अधिक मजबूत परीक्षण है, और यही कारण है कि Robolectric इस तरह काम करता है। आपके कोड को निष्पादित करने के समय के आधार पर, आप नहीं जानते कि 30 सेकंड में कितने पुनरावृत्तियों को निष्पादित किया जाएगा, लेकिन परीक्षणों को पता है कि कितनी बार 'runToEndOfTasks() 'कहा जाता था। – rds
धन्यवाद। क्या आपका मतलब है कि मुझे थ्रेड नींद को एक लूप द्वारा प्रतिस्थापित करना चाहिए जो RunToEndOfTasks() एन बार कॉल करता है? 'के लिए (int i = 0; i <एन -1, i ++) {shadowLooper.runToEndOfTasks();}' – user842225
कृपया मेरे पोस्ट में अपने को अपडेट हुआ। – user842225