2013-03-01 9 views
6

मैं मॉकिटो और पावरमोकिटो के लिए भी नया हूं। मुझे पता चला कि मैं शुद्ध मॉकिटो के साथ स्थिर तरीकों का परीक्षण नहीं कर सकता, इसलिए मुझे PowerMockito (दाएं?) उपयोगकर्ता की आवश्यकता है।किस कारण से मुझे नकल करना चाहिए?

1) जब मैं फोन है कि रिक्त संदेश तर्क पर स्थिर विधि, IllegalArgumentException कहा जाता है:

मैं यह बहुत ही आसान तरीका

public class Validate { 
     public final static void stateNotNull(
      final Object object, 
      final String message) { 
    if (message == null) { 
     throw new IllegalArgumentException("Exception message is a null object!"); 
    } 
    if (object == null) { 
     throw new IllegalStateException(message); 
    } 
} 

तो मुझे लगता है कि सत्यापित करने की आवश्यकता के साथ मान्य कहा जाता है बहुत ही सरल वर्ग है
2) जब मैं फोन है कि रिक्त वस्तु तर्क पर स्थिर विधि, IllegalStateException

कहा जाता है मैं अब तक क्या मिला है से, मैं इस परीक्षण ने लिखा है:

import static org.mockito.Matchers.anyString; 
import static org.mockito.Matchers.isNull; 

import org.junit.Before; 
import org.junit.runner.RunWith; 
import org.powermock.api.mockito.PowerMockito; 
import org.powermock.core.classloader.annotations.PrepareForTest; 
import org.powermock.modules.junit4.PowerMockRunner; 
import org.testng.annotations.Test; 

@RunWith(PowerMockRunner.class) 
@PrepareForTest(Validate.class) 
public class ValidateTestCase { 

    @Test(expectedExceptions = { IllegalStateException.class }) 
    public void stateNotNullTest() throws Exception { 
     PowerMockito.mockStatic(Validate.class); 
     Validate mock = PowerMockito.mock(Validate.class); 
     PowerMockito.doThrow(new IllegalStateException()) 
      .when(mock) 
      .stateNotNull(isNull(), anyString()); 
     Validate.stateNotNull(null, null); 
    } 
} 

तो यह दर्शाता है कि मैं मान्य वर्ग नकली और मैं जाँच कर रहा हूँ कि जब नकली एक वस्तु और एक संदेश के रूप में किसी भी स्ट्रिंग के रूप में शून्य तर्क के साथ कि विधि पर कहा जाता है, एक IllegalStateException फेंक दिया है।

अब, मुझे वास्तव में यह नहीं मिलता है। मैं उस विधि को सीधे क्यों नहीं बुला सकता, उस स्थिर वर्ग का मज़ाक उड़ाते हुए पूरे वूडू जादू को छोड़ रहा हूं? ऐसा लगता है कि जब तक मैं Validate.stateNotNull को कॉल नहीं करता हूं कि परीक्षण किसी भी तरह से गुजरता है ... किस कारण से मुझे इसका मज़ाक उड़ाया जाना चाहिए?

उत्तर

8

सबसे पहले, यह तय करें कि अपने उद्देश्य है और क्या आप परीक्षण करना चाहते। आपका परीक्षण आपकी मान्य श्रेणी विधि का परीक्षण नहीं कर रहा है, यह एक नकली बना रहा है जो उस विधि की तरह व्यवहार करता है, Fortega points out के रूप में। पहचानें कि आप परीक्षण कर रहे हैं (परीक्षण के तहत वस्तु) और परीक्षण (सहयोगी) करने के लिए आपको क्या चाहिए, फिर सहयोगियों को देखें और यह तय करें कि वे ऐसी चीजें हैं जो बनाने में आसान हैं या यदि आपको आवश्यकता है उन्हें नकल करने के लिए।

इस वर्ग जो कुछ भी पर कोई निर्भरता है की तरह कुछ के लिए, मैं पूरी तरह से mocks के बिना कर की सिफारिश करेंगे। यहां कुछ भी नहीं है कि मजाक की जरूरत है, परीक्षण इस तरह लिखा जा सकता है नहीं है:

import static org.junit.Assert.*; 

public class ValidateTestCase { 

    @Test 
    public void testHappyPath() throws Exception { 
     Validate.stateNotNull("", ""); 
    } 

    @Test 
    public void testNullMessage() throws Exception { 
     try { 
      Validate.stateNotNull(null, null); 
      fail(); 
     } 
     catch (IllegalStateException e) { 
      String expected = "Exception message is a null object!" 
      assertEquals(expected, e.getMessage()); 
     } 
    } 

    @Test(expected=IllegalStateException.class) 
    public void testNullObject() throws Exception { 
     Validate.stateNotNull(null, "test"); 
    } 
} 

और जो आपको बताता कोड क्या आप इसे करना चाहते हैं करता है या नहीं।

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

11

आपको उन कक्षाओं और विधियों का नकल नहीं करना चाहिए जिन्हें आप परीक्षण कर रहे हैं। आपको केवल परीक्षण करने के लिए जरूरी विधियों की नकल करना चाहिए।

उदाहरण के लिए, यदि आप एक वेब सेवा से कुछ वस्तुओं की जरूरत है एक परीक्षण करने के लिए, आप वेब सेवा कॉल नकली सका, इसलिए आप वास्तव में वेब सेवा को कॉल की जरूरत नहीं है।

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