2011-03-12 13 views
11

मैं PowerMock mockito के साथ काम करने के लिए कोशिश कर रहा हूँ, और मैं प्रलेखन यहाँ अनुसरण कर रहा हूँ की पुष्टि करें।PowerMock, mockito, स्थैतिक विधि

थोड़ा आसान बनाने के लिए, मान लीजिए कि मैं एक स्थिर विधि है:

StaticObj.put(String key, String val) { ... } 

और वर्ग परीक्षण किया जाना करता है कुछ इस तरह:

public class ClassToTest { 
    public void doSomething(Params p) { 
     if (StringUtils.isNotBlank(p.getK()) StaticObj.put("k1", p.getK()); 
     if (StringUtils.isNotBlank(p.getX()) StaticObj.put("x1", p.getX()); 
    } 
} 

मेरी इकाई परीक्षण मैं था में यह सत्यापित करने के लिए कि StaticObj.put को के और एक्स के लिए कॉल किया जाता है जब वे रिक्त या शून्य नहीं होते हैं, इसलिए मैं ऐसा कुछ करता हूं:

public void testNormalCase() { 
    // assume that mocking setup for statics already happened in some @Before function.. 
    Params params = new Params("k", "x"); 
    ClassToTest classToTest = new ClassToTest(); 
    classToTest.doSomething(params); 

    // now I want to verify: 
    PowerMockito.verifyStatic(times(1)); 
    StaticObj.put("k1", "k1"); 

    PowerMockito.verifyStatic(times(1)); 
    StaticObj.put("x1", "x"); 
} 

यह काम करता है, और यह वही है जो मैं उम्मीद करता हूं। क्या काम नहीं करता है, अगर मैं के के सत्यापन को टिप्पणी करता हूं, तो एक्स के लिए सत्यापन विफल रहता है! त्रुटि संदेश इंगित करता है कि ("x1", "x") अपेक्षित है लेकिन ("k1", "k") मिला है। ऐसा क्यों है? क्या मैं इसे सही ढंग से कोड नहीं कर रहा हूं?

इसके अलावा यह मुझे विश्वास है कि परीक्षण, जो गुजरता निम्न प्रकार, पूरी तरह से गलत कारण से पारित हो सकता है:

public void testOtherCase() { 
    // assume that mocking setup for statics already happened in some @Before function.. 
    Params params = new Params("k", null); 
    ClassToTest classToTest = new ClassToTest(); 
    classToTest.doSomething(); 

    // now I want to verify: 

    PowerMockito.verifyStatic(never()); 
    StaticObj.put(eq("x1"), anyString()); 
} 

जैसे मुझे आश्चर्य है कि अगर पावरमॉक "के 1" देखता है, तो फैसला करता है कि "x1" कभी नहीं बुलाया गया था, और गुजरता है। (?)

आम तौर पर यह राज्य के लिए, मैं एक स्थिर विधि है कि एन बार कहा जाता है (जहां N इनपुट पैरामीटर के आधार पर परिवर्तन) है। और मैं यह सत्यापित करना चाहता हूं कि इसे सही मामलों में बुलाया गया था (जिसे इनपुट पैरा द्वारा निर्धारित किया जा सकता है)। ऐसा लगता है जैसे पावरमॉक इस अच्छी तरह से संभाल नहीं लेता है, जब तक कि मैं गलत समझ नहीं पाता।

किसी भी विचार के लिए धन्यवाद!

+2

मैं वास्तव में एक मुद्दा मुझे लगता है कि संबंधित हो सकती है पर एक मुद्दा खोल दिया है। http://code.google.com/p/powermock/issues/detail?id=342 –

उत्तर

6

मैं अगर मैं उन्हें स्पष्ट रूप से समझ इस सवाल और इस मुद्दे को ध्यान से नहीं बल्कि यकीन है कि पढ़ा - मेरी समझ से, यह है कि powermock जब आप कश्मीर और एक्स पारित लेकिन केवल कश्मीर की पुष्टि अपवाद उठाना सही है।

क्योंकि आप स्थिर विधि StaticObj.put मजाक कर रहे हैं, जब आप पैरामीटर कश्मीर और एक्स गुजरती हैं और

PowerMockito.verifyStatic(times(1)); 
StaticObj.put("k1", "k1"); 

PowerMockito.verifyStatic(times(1)); 
StaticObj.put("x1", "x"); 

से सत्यापित यह काम करना चाहिए। और जब आप के लिए सत्यापन के साथ पैरामीटर के और एक्स को सत्यापित करते हैं तो टिप्पणी की जाती है।

// PowerMockito.verifyStatic(times(1)); 
// StaticObj.put("k1", "k1"); 

PowerMockito.verifyStatic(times(1)); 
StaticObj.put("x1", "x"); 

Powermock पुट ("k1" ...) पहले जाहिरा तौर पर साथ मंगलाचरण मिल जाएगा, तो एक्स के सत्यापन के एक त्रुटि बढ़ा देंगे। आपकी सत्यापन प्रक्रिया अनुक्रमित है।