2013-05-20 11 views
5

में easymock का उपयोग करके मैं परीक्षण करना चाहता हूं कि कुछ विधि विफल होने पर याद की जाएगी। कॉलिंग अलग थ्रेड में निष्पादित। तो मैं इसमल्टीथ्रेडिंग

final Foo mock = createStrictMock(Foo.class); 

mock.bar(); 
expectLastCall().andThrow(new RuntimeException("TEST EXCEPTION")); 
mock.bar(); 
replay(mock); 

doStuff(); 
sleepSomeTime(); //Pretty dirty. But I need to test it in multithreading. 
verify(mock); 

और कोड उत्तीर्ण की तरह कोड लिखता हूं। लेकिन मैंने अभी तक याद नहीं किया है।

परीक्षण असफल बनाने के लिए, मैं

mock.bar(); 
expectLastCall().andThrow(new RuntimeException("TEST EXCEPTION")); 

प्रतिस्थापित

mock.bar(); 
expectLastCall().andAnswer(new IAnswer<Void>() { 
     @Override 
     public Void answer() throws Throwable { 
      sleepSomeTime(); 
      throw new RuntimeException("TEST EXCEPTION"); 
     } 
    }); 

साथ लेकिन मैं मेरे सभी परीक्षण के आसपास sleepSomeTime जोड़ने पसंद नहीं है। इसके अलावा, मैं वास्तव में समझ नहीं पा रहा हूं, जबकि यह इस विशेष मामले में मदद करता है। तो,

देरी जोड़ने में मदद क्यों हुई?

ऐसी चीजें करने का सही तरीका क्या है?

उत्तर

5

मेरा दृष्टिकोण ताले का उपयोग करना है। वहाँ कुछ निश्चित दिखाने के लिए अपने पोस्ट में काफी पर्याप्त जानकारी नहीं है, लेकिन यह शायद कुछ इस तरह दिखाई चाहते हैं:

final Lock lock = new Lock(); 
lock.lock(); 
expectLastCall().andAnswer(new IAnswer<Void>() { 
    @Override public Void answer() throws Throwable { 
     lock.unlock(); 
     throw new RuntimeException("TEST EXCEPTION"); 
    } 
});  
doStuff(); 
lock.lock(); 
verify(mock); 

सार यहाँ है दूसरा ताला() मंगलाचरण अपने नकली में अनलॉक जब तक अवरुद्ध है ताला मुक्त करता है।

+1

यह सबसे अच्छा जवाब है। लेकिन मेरा मानना ​​है कि यह ताले के बिना किया जाना चाहिए। –

+0

अपने कोड के आधार पर, आप कॉलबैक में हुक कर सकते हैं ताकि आपकी सत्यापन विधियां कॉलबैक में की जा सकें जो आप अपने नकली आखिरी पंक्ति में उलझ जाते हैं। –

-1

क्या आपने स्विंग श्रमिकों का उपयोग करके कार्यान्वित करने की कोशिश की है?

इसके अलावा आप जो भी प्रयास करना चाहते हैं वह यह है कि यदि आप प्रतीक्षा कर रहे हैं तो आप notify का उपयोग कर सकते हैं या synchronized कक्षा का उपयोग कर सकते हैं।

0

बहु-थ्रेड संदर्भ में यूनिट परीक्षण करने का कोई आसान तरीका नहीं है।

लेकिन मैं आपको यह answer to another similar question पढ़ने का सुझाव देता हूं। DRTestUtilsThread.sleep को विधि कॉल के पीछे Thread.sleep पर कुछ सुविधाजनक तरीके प्रदान करता है।

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