2012-08-23 15 views
6

के साथ अंतिम विधि का मज़ाक उड़ाते हुए मैं अंतिम विधि ResourceBundle.getString() पर कॉल करने का प्रयास कर रहा हूं। PowerMock 1.4.12 और EasyMock 3.1 के साथ, कॉल का मज़ाक उड़ाया नहीं जा रहा है; इसके बजाय, "असली" विधि कहा जाता है।PowerMock + EasyMock

मेरा परीक्षण वर्ग: BeanBeingTested में

@RunWith(PowerMockRunner.class) 
@PrepareForTest(ResourceBundle.class) 
public class TestSuite { 
    @Before 
    public void setUp() throws Exception { 
     ResourceBundle resourceBundleMock = PowerMock.createNiceMock(ResourceBundle.class); 
     expect(resourceBundleMock.getString(BundleConstants.QUEUE)).andReturn("Queue"); 
     PowerMock.replay(resourceBundleMock); 

     beanBeingTested.setMessages(resourceBundleMock); 
    } 
    ... 
} 

कोड:

private ResourceBundle messages; 
... 
String label = messages.getString(BundleConstants.QUEUE); 

त्रुटि संदेश:

java.util.MissingResourceException: Can't find resource for bundle $java.util.ResourceBundle$$EnhancerByCGLIB$$e4a02557, key Queue 
at java.util.ResourceBundle.getObject(ResourceBundle.java:384) 
at java.util.ResourceBundle.getString(ResourceBundle.java:344) 
at com.yoyodyne.BeanBeingTested.setUpMenus(BeanBeingTested.java:87) 

जब मैं परीक्षण का मामला के माध्यम से कदम, डीबगर के प्रकार से पता चलता beanBeingTested.messages "वर्ग java.util.ResourceBundle के लिए EasyMock" के रूप में, तो नकली corr इंजेक्शन है ectly। (इसके अलावा, पर expect() कॉल के दौरान कॉल के दौरान कॉल पर कोई त्रुटि नहीं है)।

के बजाय एक सादे नकली एक अच्छा नकली के साथ

, मैं निम्नलिखित त्रुटि मिलती है:

java.lang.AssertionError: 
    Unexpected method call handleGetObject("Queue"): 
    getString("Queue"): expected: 1, actual: 0 

किसी भी विचार क्या मैं गलत कर रहा हूँ?

धन्यवाद।

उत्तर

0

संसाधन बंडल को कॉल का मज़ाक उड़ाते हुए परेशान क्यों? आम तौर पर, मैं जावा के नट्स और बोल्ट, जैसे कि ऐरेलिस्ट, डेट इत्यादि का मज़ाक उड़ाने से बचने की कोशिश करता हूं। संसाधन बंडल (और MessageFormat.format()) मेरे लिए एक ही श्रेणी में कम या ज्यादा गिरावट आती है। वे आम तौर पर तारों पर काम करते हैं जो मूलभूत हैं, और यदि ये चीजें टूट जाती हैं या परीक्षण को तोड़ने के लिए पर्याप्त व्यवहार को बदलती हैं तो यह निश्चित रूप से कुछ है जो मैं जानना चाहता हूं :)

बस उन्हें स्ट्रिंग को पकड़ने दें (जो संभवतः होने वाला है यूआई में सेट करें, शायद बाद में। मूल्य वापस करने के लिए परेशान न करें क्योंकि आप अपने परीक्षण को तोड़ने के लिए बंडल में संपादन नहीं चाहते हैं। यदि स्ट्रिंग एक नकली यूआई घटक पर सेट हो जाती है, तो यह किसी भी ऑब्जेक्ट के लिए एक अच्छी जगह है (String.class) जो सही ढंग से व्यक्त करता है कि वास्तव में आपके द्वारा प्रदर्शित विशिष्ट स्ट्रिंग की परवाह नहीं है।

मैं इसे एक लाभ मानता हूं जब एक अनुपलब्ध संदेश कुंजी के कारण परीक्षण विफल रहता है। पता है।

3

आप EasyMock का उपयोग कर उदाहरण बना रहे हैं। इसके बजाय, स्थिर विधियों के साथ काम करते समय, आपको कक्षा (PowerMock का उपयोग करके) का नकल करना होगा।

यह (EasyMock 3.0 और PowerMock 1.5 के साथ परीक्षण किया है, हालांकि) इस तरह काम करना चाहिए:

@RunWith(PowerMockRunner.class) 
@PrepareForTest(ResourceBundle.class) 
public class TestSuite { 
    @Before 
    public void setUp() throws Exception { 
     // mock the class for one method only 
     PowerMock.mockStaticNice(ResourceBundle.class, "getString"); 

     // define mock-behaviour on the class, when calling the static method 
     expect(ResourceBundle.getString(BundleConstants.QUEUE)).andReturn("Queue"); 

     // start the engine 
     PowerMock.replayAll(); 
    } 
} 

(मुझे पता है इस सवाल का कुछ महीने पुरानी है हूँ, लेकिन यह दूसरों, हालांकि मदद कर सकता है)

PrepareForTest में केवल ResourceBundle साथ

@PrepareForTest({ResourceBundle.class, BeanBeingTested.class}) 

नकली जब अपने इकाई परीक्षण विधि से सीधे कहा जाता है काम करेंगे, लेकिन जब BeanBeingTested आप से कहा जाता है जी:

+0

मुझे भी एक ही समस्या का सामना करना पड़ रहा है।लेकिन यह अभी भी मदद नहीं कर रहा है। क्या आप केवल अंतिम विधियों या स्थिर तरीकों का जिक्र कर रहे हैं? – Siddharth

+0

@ सिद्धार्थ {{PowerMock.mockStaticNice()}} एक वर्ग की एक स्थिर विधि को झुकाता है, लेकिन बाकी तरीकों को छूता है। यदि यह धागा आपकी मदद नहीं करता है, तो आपको एक नया प्रश्न बनाना चाहिए, क्योंकि ऐसा लगता है कि आपके पास अलग-अलग मुद्दे हैं। – Andy

+0

आपके उत्तर @ एंडी के लिए धन्यवाद। लेकिन इस धागे का विषय अंतिम विधि के बारे में बात करता है लेकिन आप स्थैतिक विधि के बारे में बात कर रहे हैं। क्या मैं कुछ भूल रहा हूँ? मेरी समस्या यह है कि "सार्वजनिक अंतिम शून्य" विधि है जिसे मैं नकल करने की कोशिश कर रहा हूं और परीक्षण नकली के बजाय वास्तविक विधि को बुला रहा है। क्या उपर्युक्त मुद्दा उस व्यक्ति से अलग है जिसके बारे में मैं बात कर रहा हूं? क्षमा करें अगर मुझे कुछ बिंदु याद आया। – Siddharth

1

उपयोग करने का प्रयास और वास्तविक विधि का उपयोग किया जा रहा है।

इस क्षेत्र में पावरमॉक दस्तावेज़ों की कमी है।

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