2011-07-03 10 views
10

पुस्तक ग्रोइंग ऑब्जेक्ट ओरिएंटेड सॉफ्टवेयर जेएमॉक में कई उदाहरण देता है जहां राज्य को एपीआई के माध्यम से इसे उजागर किए बिना स्पष्ट किया जाता है। मुझे सचमुच यह विचार पसंद है। क्या मॉकिटो में ऐसा करने का कोई तरीका है?क्या मॉकिटो के पास जेमॉक के राज्यों के बराबर मुहावरे है?

यहाँ पुस्तक

public class SniperLauncherTest { 
    private final States auctionState = context.states("auction state") 
               .startsAs("not joined"); 

    @Test public void addsNewSniperToCollectorAndThenJoinsAuction() { 
    final String itemId = "item 123"; 
    context.checking(new Expectations() {{ 
     allowing(auctionHouse).auctionFor(itemId); will(returnValue(auction)); 

     oneOf(sniperCollector).addSniper(with(sniperForItem(item))); 
            when(auctionState.is("not joined"));  
     oneOf(auction).addAuctionEventListener(with(sniperForItem(itemId))); 
            when(auctionState.is("not joined")); 
     one(auction).join(); then(auctionState.is("joined")); 
    }}); 

    launcher.joinAuction(itemId); 
    } 
} 

उत्तर

7

मैं स्वयं ही अभ्यास के लिए एक जासूस का प्रयोग किया:

http://docs.mockito.googlecode.com/hg/latest/org/mockito/Mockito.html#13

मैं एक जासूस इस प्रकार में मेरी SniperListener नकली बदल दिया है:

private final SniperListener sniperListenerSpy = spy(new SniperListenerStub()); 
private final AuctionSniper sniper = new AuctionSniper(auction, sniperListenerSpy); 

और यह भी SniperListener के टोंटदार कार्यान्वयन बनाया:

private class SniperListenerStub implements SniperListener { 
    @Override 
    public void sniperLost() { 
    } 

    @Override 
    public void sniperBidding() { 
     sniperState = SniperState.bidding; 
    } 

    @Override 
    public void sniperWinning() { 
    } 
} 

पुस्तक जेएमॉक के "राज्यों" का उपयोग करती है , लेकिन मैं एक नेस्टेड enum बजाय प्रयोग किया:

private SniperState sniperState = SniperState.idle; 

private enum SniperState { 
    idle, winning, bidding 
} 

इसके बाद आप नियमित रूप से JUnit उपयोग करने के लिए राज्य के लिए परीक्षण करने के लिए दावा करता है:

@Test 
public void reportsLostIfAuctionClosesWhenBidding() { 
    sniper.currentPrice(123, 45, PriceSource.FromOtherBidder); 
    sniper.auctionClosed(); 
    verify(sniperListenerSpy, atLeastOnce()).sniperLost(); 
    assertEquals(SniperState.bidding, sniperState); 
} 
+1

इस तरह अन्य जवाब से क्लीनर है। +1 –

+1

पुस्तक में उपयोग किए जाने वाले जेएमॉक से बहुत बेहतर (जो बहुत अच्छा है, लेकिन इसमें कुछ त्रुटियां हैं)। वे लगातार टेस्ट कोड को समझने में आसान बनाने की आवश्यकता पर बल देते हैं, लेकिन उस दृष्टिकोण से, मेरी नौसिखिया के नजरिए से निर्णय लेते हुए, मॉकिटो बहुत बेहतर लगता है। –

+1

हालांकि, 'स्निपरस्टेट' नाम की दुर्भाग्यपूर्ण पसंद है ... क्योंकि पुस्तक पी पर अपनी 'स्निपरस्टेट' कक्षा पेश करती है। 154 (और यह एक सरल 'enum' नहीं है) ... –

7

ऐसा नहीं है कि मैं के बारे में पता कर रहा हूँ से एक उदाहरण है। मैंने मॉकिटो को बहुत दूर राशि का उपयोग किया है और डॉको में कुछ भी नहीं है जो मैंने जेएमॉक साइट पर राज्यों के बारे में पढ़ा है। यदि मेरे पास यह सही है तो वे मूल रूप से उस समय को सीमित करते हैं जिस पर किसी अन्य ऑब्जेक्ट की विशिष्ट स्थिति की अवधि में एक निष्पादन हो सकता है। यह एक दिलचस्प विचार है, लेकिन मैं इसके लिए आवेदन देखने के लिए संघर्ष कर रहा हूं।

मॉकिटो में आप एक ही काम करने के लिए Stubbing with callbacks का उपयोग करके कोड निष्पादित कर सकते हैं। कॉलबैक विधि में आप राज्य के और सत्यापन निष्पादित कर सकते हैं। वैकल्पिक रूप से आप Custom argument matcher को नियोजित कर सकते हैं क्योंकि उन्हें कॉल के समय भी निष्पादित किया जाता है।

इनमें से दोनों आपको निष्पादन समय पर कोड तक पहुंच प्रदान करते हैं, जिस समय आप राज्य की जांच करना चाहते हैं।