2011-04-14 11 views
6

से नहीं है मुझे Easymock 3.0 और JUnit 4.8.2 के साथ एक अजीब समस्या है। समस्या तब होती है जब मैवेन से परीक्षण निष्पादित करते हैं और ग्रहण से नहीं।अपेक्षित से अधिक मैचर्स रिकॉर्ड किए गए - Easymock मैवेन से विफल रहता है और ग्रहण

इस इकाई परीक्षण (बहुत सरल) है:

... 
protected ValueExtractorRetriever mockedRetriever; 
... 

@Before 
public void before() { 
    mockedRetriever = createStrictMock(ValueExtractorRetriever.class); 
} 

@After 
public void after() { 
    reset(mockedRetriever); 
} 

@Test 
public void testNullValueExtractor() { 
    expect(mockedRetriever.retrieve("PROP")).andReturn(null).once(); 
    replay(mockedRetriever); 

    ValueExtractor retriever = mockedRetriever.retrieve("PROP"); 
    assertNull(retriever); 

    assertTrue(true); 
} 

और मैं मिलता है:

java.lang.IllegalStateException: 1 matchers की उम्मीद, 2 दर्ज की गई।

अजीब बात यह है कि मैं एक तर्क मैचर का उपयोग भी नहीं कर रहा हूं। और यह परीक्षण का एकमात्र तरीका है! और इसे सबसे खराब बनाने के लिए यह ग्रहण से काम करता है और मेवेन से विफल रहता है!

मैं कुछ लिंक जो मुझे एक जवाब के साथ प्रदान किया नहीं मिला:

मैं इकाई परीक्षण को बदलते हैं और एक और विधि जोड़ने (जो करता है एक तर्क matcher का उपयोग करें):

@Test 
public void testIsBeforeDateOk() { 
    expect(mockedRetriever.retrieve((String)anyObject())).andReturn(new PofExtractor()).anyTimes(); 
    replay(this.mockedRetriever); 

    FilterBuilder fb = new FilterBuilder(); 
    assertNotNull(fb); 

    CriteriaFilter cf = new CriteriaFilter(); 
    assertNotNull(cf); 
    cf.getValues().add("2010-12-29T14:45:23"); 
    cf.setType(CriteriaType.DATE); 
    cf.setClause(Clause.IS_BEFORE_THE_DATE); 

    CriteriaQueryClause clause = CriteriaQueryClause.fromValue(cf.getClause()); 
    assertNotNull(clause); 
    assertEquals(CriteriaQueryClause.IS_BEFORE_THE_DATE, clause); 

    clause.buildFilter(fb, cf, mockedRetriever); 
    assertNotNull(fb); 

    Filter[] filters = fb.getFilters(); 
    assertNotNull(filters); 
    assertEquals(filters.length, 1); 

    verify(mockedRetriever); 

    logger.info("OK"); 
} 

यह लास टी विधि परीक्षण पास करती है लेकिन दूसरी नहीं। यह कैसे संभव है!?!?!

सादर, निको

अधिक लिंक:

"bartling.blogspot.com/2009/11/using-argument-matchers-in-easymock-and.html"

"www .springone2gx.com/ब्लॉग/scott_leberknight/2008/09/the_n_matchers_expected_m_recorded_problem_in_easymock "

" stackoverflow.com/questions/4605997/3-matchers-expected-4-recorded "

+0

क्या आप m2eclipse का उपयोग कर रहे हैं? आपका पोम कैसा दिखता है? – khmarbaise

+0

मैं हूं। दुर्भाग्य से पोम काफी बड़ा है क्योंकि यह कई परीक्षणों का एक परीक्षण है जो काम करता है (जो इसे और भी अजीब बनाता है) कई मैवेन मॉड्यूल में से एक से। सबसे अजीब चीज यह है कि अगर मैं मेवेन-सिक्योरफायर-रिपोर्ट सक्षम करता हूं और थ्रेड को समानांतर में चलाता हूं, तो यह काम करता है! लेकिन यह पर्यावरण पर निर्भर करता है (हडसन विफल रहता है लेकिन यह मेरे देव बॉक्स में काम करता है) – Nico

+0

क्या आपने अपना पूरा स्थानीय मैवेन भंडार हटा दिया है और इसे अपने देव-बॉक्स पर खरोंच से परीक्षण किया है? – khmarbaise

उत्तर

5

मुझे एक बहुत ही समस्या थी और नीचे दिए गए लिंक में मेरे निष्कर्ष लिखे। http://www.flyingtomoon.com/2011/04/unclosed-record-state-problem-in.html (अभी अपडेट किया गया)

मुझे लगता है कि आपके वर्तमान परीक्षण को प्रभावित करने वाले किसी अन्य परीक्षण में समस्या है। समस्या एक और टेस्ट क्लास पर है और यह आपको परीक्षण को प्रभावित करती है। वास्तविक समस्या की जगह खोजने के लिए, मैं समस्याग्रस्त परीक्षणों को एक-एक करके अक्षम करने की सलाह देता हूं जब तक कि आप असफल परीक्षण को सूचित न करें।

असल में मैंने यही किया। मैंने असफल परीक्षणों को एक-एक करके अक्षम कर दिया जब तक मुझे समस्याग्रस्त परीक्षण नहीं मिला। मुझे एक परीक्षण मिला जो रिकॉर्डिंग को रोकने के बिना "@extected" एनोटेशन द्वारा अपवाद और पकड़ता है।

+0

> बहुत कुछ !!! मैंने अपने सभी परीक्षणों को अक्षम कर दिया और उन सभी के माध्यम से चला गया जब तक कि मुझे ऐसा कोई नहीं मिला और वह मुझे एक और गलत परीक्षण कक्षा में ले जाता है जिसे मैंने तय किया और अब सबकुछ काम करता है। अद्यतन पोस्ट के लिए Thx :) – Nico

0

मैं पहली बार त्रुटि संदेश का मानना ​​है

java.lang.IllegalStateException: 1 matchers की उम्मीद, 2 दर्ज की गई।

का मतलब है कि mockedRetriever विधियों को दो बार बुलाया जाता है लेकिन परीक्षण अपेक्षा करता है कि इसे एक बार बुलाया जाए। तो आपका ग्रहण और मेवेन की कॉन्फ़िगरेशन अलग-अलग है।

और मेरे पास परीक्षण के बाद नकली रीसेट करने का कोई कारण नहीं है। बस ध्यान रखें कि जुनीट प्रत्येक एकल विधि विधि के लिए नए वर्ग का उदाहरण बनाता है।

संपादित:

क्या कारण है कि अंतिम परीक्षण विधि जवाब पारित कर दिया है के बारे में:

expect(mockedRetriever.retrieve((String)anyObject())).andReturn(new PofExtractor()).anyTimes(); 

लेकिन अपनी पहली परीक्षा पद्धति में यह है:

expect(mockedRetriever.retrieve("PROP")).andReturn(null).once(); 

के रूप में के बराबर:

expect(mockedRetriever.retrieve("PROP")).andReturn(null); 
+0

@ कॉन्स्टेंटिनर 1-> 'mockedRetriever' को केवल एक बार कहा जाता है जैसा कि आप विधि में देख सकते हैं:' testNullValueExtractor'। मैं नहीं देख सकता कि 2 "व्यवहार" रिकॉर्ड किए गए हैं ... 2-> रीसेट वहां है क्योंकि मूल रूप से मेरे पास एक से अधिक परीक्षण थे और मैंने एक ही नकली का पुन: उपयोग किया और ईमानदार होने के लिए मुझे नहीं पता था कि एक से अधिक थे उदाहरण तत्काल हो रहा है। जानकार अच्छा लगा! 3-> मैं समझ नहीं पा रहा हूं कि आप क्या कहते हैं। समस्या यह है कि अगर मैं केवल छोड़ देता हूं (और दूसरे को हटा देता हूं) विधि: 'testIsBeforeDateOk' यह विफल रहता है !! यही दिक्कत है!!!! 4-> अंत में, मैवेन ने मेरी ग्रहण परियोजना बनाई और मुझे नहीं। – Nico

+0

आह क्षमा करें! मैंने यह नहीं देखा कि आपके पहले कोड में कोई कक्षा नहीं है और आप सीधे मॉक ऑब्जेक्ट को कॉल कर रहे हैं। क्या होगा यदि आप अपने पहले कोड नमूने में 'testNullValueExtractor()' विधि के अंत में 'सत्यापित (mockedRetriever); 'जोड़ते हैं? – Constantiner

+0

@ कॉन्स्टेंटिनर मैंने इसे जोड़ा और फिर भी यह "रिकॉर्ड मोड" में विफल रहता है। मुझे पूरा यकीन है कि यह टेस्ट के साथ कोई समस्या नहीं है लेकिन कुछ और के साथ।मैं अन्य परीक्षणों को अक्षम करने की कोशिश करूंगा और देख सकता हूं कि यह काम करता है या नहीं, वास्तव में कोई समझ नहीं आता है, है ना? – Nico

0

हमें हाल ही में यह समस्या थी, और जब हमने पूरे टेस्ट सूट (1100+ टेस्ट केस) चलाए तो यह केवल उसके सिर पर निर्भर था। आखिरकार, मैंने पाया कि मैं उस परीक्षण पर ब्रेकपॉइंट डाल सकता था जो उड़ रहा था, और फिर परीक्षणों की सूची में वापस कदम उठाया गया था जो ग्रहण पहले ही निष्पादित कर चुका था, पिछले परीक्षण मामले की तलाश में, जिसने गलत तरीके से नकली स्थापना की थी।

हमारी समस्या का उपयोग EasyMock.expect(...) कथन के बाहर किसी के रूप में हुई। निश्चित रूप से, यह असफल होने से पहले दो परीक्षण किए गए थे।

तो अनिवार्य रूप से, क्या हो रहा था यह है कि एक उम्मीदवार के बाहर एक मैचर का दुरुपयोग ईज़ीमोक के राज्य को जहर कर रहा था, और अगली बार जब हमने एक नकली बनाने की कोशिश की, तो EasyMock उड़ाएगा।

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