2012-03-14 15 views
22

का उपयोग करके स्थिर स्थिर चर का नकल कैसे करें I JUnit, EasyMock या PowerMock का उपयोग करके एक स्थिर अंतिम चर के साथ-साथ i18n क्लास को नकल करना चाहते हैं। मैं उसको कैसे करू?JUnit, EasyMock या PowerMock

+0

संभावित डुप्लिकेट [नकली निजी स्थिर अंतिम mockito या JMockit का उपयोग कर क्षेत्र] (http://stackoverflow.com/questions/30703149/mock-private-static-final-field-using-mockito-or-jmockit) – kecso

उत्तर

36

क्या मॉकिंग एक चर है? मैं फिर से असाइन करना चाहता हूँ। मुझे नहीं लगता कि EasyMock या PowerMock आपको static final फ़ील्ड को फिर से असाइन करने का एक आसान तरीका देगा (यह एक अजीब उपयोग-मामले की तरह लगता है)।

यदि आप ऐसा करना चाहते हैं तो शायद आपके डिजाइन में कुछ गड़बड़ है: static final (या अधिक सामान्य ग्लोबल स्थिरांक) से बचें यदि आप जानते हैं कि एक चर के पास एक और मूल्य हो सकता है, यहां तक ​​कि परीक्षण उद्देश्य के लिए भी।

फिर भी, आप प्राप्त कर सकते हैं कि (से: Using reflection to change static final File.separatorChar for unit testing?): प्रतिबिंब का उपयोग

static void setFinalStatic(Field field, Object newValue) throws Exception { 
    field.setAccessible(true); 

    // remove final modifier from field 
    Field modifiersField = Field.class.getDeclaredField("modifiers"); 
    modifiersField.setAccessible(true); 
    modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL); 

    field.set(null, newValue); 
} 

इसका इस्तेमाल इस प्रकार है:

setFinalStatic(MyClass.class.getField("myField"), "newValue"); // For a String 

मत भूलना अपने मूल मूल्य जब करने के लिए क्षेत्र पुनर्स्थापित करने के लिए फाड़ रहा है।

+4

इसका उपयोग करने वाले किसी भी व्यक्ति को यह ध्यान में रखना चाहिए कि जावा कंपाइलर स्थिरांक को रेखांकित कर सकता है और इस प्रकार कोड वास्तव में अन्य अंतिम फ़ील्ड तक नहीं पहुंच सकता है (फ़ाइल.सेपरेटर कैर के लिए काम करना चाहिए क्योंकि स्थिर होने पर निरंतर बेकार होगा)। यह [इस प्रश्न] में वर्णित है (http://stackoverflow.com/questions/5173372/java-static-final-values-replaced-in-code-when-compiling) –

+0

यदि मुझे पता है कि चर के दौरान केवल एक और मूल्य है इकाई परीक्षण, सुझाए गए दृष्टिकोण क्या होगा? – Sharif

5

यह PowerMock सुविधाओं के संयोजन का उपयोग करके किया जा सकता है। @PrepareForTest({...}) एनोटेशन का उपयोग करके स्टेटिक मॉकिंग, अपने क्षेत्र का मज़ाक उड़ाते हुए (मैं Mockito.mock(...) का उपयोग कर रहा हूं, लेकिन आप समतुल्य EasyMock निर्माण का उपयोग कर सकते हैं) और फिर WhiteBox.setInternalState(...) विधि का उपयोग करके अपना मान सेट कर सकते हैं। ध्यान दें कि यह तब भी काम करेगा जब आपका चर private है।

एक विस्तारित उदाहरण के लिए इस लिंक देखें: http://codyaray.com/2012/05/mocking-static-java-util-logger-with-easymocks-powermock-extension

+1

नोट - "विस्तारित उदाहरण के लिए लिंक" एक ** स्थिर ** फ़ील्ड का मज़ाक उड़ाता है, प्रश्न में उल्लिखित ** स्थिर अंतिम ** फ़ील्ड नहीं। –

-1

https://github.com/zhangyanwei/staticmock

  1. StaticMockito.enhanceClass ("xxx.Utility");
  2. StaticMockito.initMock (Utility.class);
  3. जब (Utility.toClientId (क्लाइंटनाम))। फिर वापसी ("नाम"); सत्यापित करें (मॉकर (उपयोगिता.क्लास))। ToClientId (क्लाइंटनाम);
की