2013-06-20 9 views
12

मैं निम्नलिखित की तरह एक विधि,क्या मॉकिटो में विभिन्न धागे में चल रहे एक नकली विधि को सत्यापित करना संभव है?

public void generateCSVFile(final Date billingDate) { 
    asyncTaskExecutor.execute(new Runnable() { 
     public void run() { 
      try { 
       accessService.generateCSVFile(billingDate); 
      } catch (Exception e) { 
       LOG.error(e.getMessage()); 
      } 
     } 
    }); 
} 

मेरी नक़ल किया है:

PowerMockito.doNothing().when(accessService).generateCSVFile(billingDate); 

लेकिन जब इस बात की पुष्टि:

verify(rbmPublicViewAccessService, timeout(100).times(1)).generateCSVFile(billingDate); 

यह मुझे के रूप में लागू नहीं देता है। ऐसा इसलिए है क्योंकि इसे अलग थ्रेड के माध्यम से बुलाया जाता है, और क्या विभिन्न धागे में बुलाए गए तरीकों को सत्यापित करना संभव है?

+1

शायद यह जानकारी मदद करता है: https://code.google.com/p/mockito/wiki/FAQ#Is_Mockito_thread-safe? –

उत्तर

25

यह बहुत संभावना है कि Runnable को asyncTaskExecutor द्वारा निष्पादित नहीं किया गया है जब आप आमंत्रण को सत्यापित करते हैं, जिसके परिणामस्वरूप आपके यूनिट परीक्षण में सत्यापन त्रुटि होती है।

इसे ठीक करने का सबसे अच्छा तरीका जेनरेट किए गए थ्रेड पर शामिल होना और आमंत्रण की पुष्टि करने से पहले निष्पादन की प्रतीक्षा करना है।

यदि आपको धागे का उदाहरण नहीं मिल रहा है, तो asyncTaskExecutor पर नकल करना और इसे कार्यान्वित करना संभव है ताकि यह सीधे चलने योग्य निष्पादित हो सके।

private ExecutorService executor; 

@Before 
public void setup() { 
    executor = mock(ExecutorService.class); 
    implementAsDirectExecutor(executor); 
} 

protected void implementAsDirectExecutor(ExecutorService executor) { 
    doAnswer(new Answer<Object>() { 
     public Object answer(InvocationOnMock invocation) throws Exception { 
      ((Runnable) invocation.getArguments()[0]).run(); 
      return null; 
     } 
    }).when(executor).submit(any(Runnable.class)); 
} 
+0

इस स्निपेट के लिए धन्यवाद! यह पूरी तरह से काम किया! – piper1970

8

मैं एक ही मुद्दा था और की तरह में

verify(someClass, timeout(0)).someMethod(any(someParameter.class)); 

टाइमआउट तर्क http://javadoc.io/page/org.mockito/mockito-core/latest/org/mockito/Mockito.html#22 लेकिन तर्क 0 के साथ के साथ चारों ओर खेला और यह काम करता है। मुझे लगता है कि परीक्षण धागा पैदा करता है, और इसलिए अन्य धागे के पास काम करने का अवसर होता है, जो मोक्स को उचित रूप से बुलाता है। फिर भी यह एक हैक की तरह गंध करता है।

+0

ध्यान दें कि टाइमआउट (0) चाल हमारे बांस पर काम नहीं करती है। –

+1

:(लिंक नहीं खुल रहा है। 404 – Arundev

+0

मॉकिटो को Google कोड संग्रह द्वारा संग्रहीत किया गया है। देखें http://site.mockito.org/mockito/docs/current/org/mockito/verification/VerificationWithTimeout.html –

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