2012-08-13 11 views
33

मैं मॉकिटो के साथ सत्यापित करने का एक तरीका ढूंढ रहा हूं, कि परीक्षण के दौरान दिए गए मॉक के साथ कोई बातचीत नहीं हुई थी। सत्यापन मोड never() के साथ किसी दिए गए विधि के लिए इसे प्राप्त करना आसान है, लेकिन मुझे अभी तक पूर्ण मॉक के लिए समाधान नहीं मिला है।मॉकिटो - यह सत्यापित करने के लिए कि एक नकली को कभी भी नहीं बुलाया गया था

जो मैं वास्तव में प्राप्त करना चाहता हूं: परीक्षणों में सत्यापित करें, कि कंसोल पर कुछ भी मुद्रित नहीं होता है। JUnit साथ सामान्य विचार है कि प्रकार है:

private PrintStream systemOut; 

@Before 
public void setUp() { 
    // spy on System.out 
    systemOut = spy(System.out); 
} 

@After 
public void tearDown() { 
    verify(systemOut, never()); // <-- that doesn't work, just shows the intention 
} 

एक PrintStream तरीकों की टन है और मैं वास्तव में प्रत्येक सत्यापित करने के लिए नहीं करना चाहते हैं और अलग की पुष्टि के साथ हर एक - और System.err के लिए एक ही ...

तो मुझे आशा है कि, यदि कोई आसान समाधान है, तो मैं यह कर सकता हूं कि मेरे पास एक अच्छा परीक्षण कवरेज है, सॉफ़्टवेयर इंजीनियरों (और स्वयं) को अपने (मेरा) डीबग कोड को System.out.println("Breakpoint#1"); या e.printStacktrace(); जैसे परिवर्तन करने से पहले निकालने के लिए मजबूर करें।

उत्तर

37

इस का उपयोग करें:

इस समस्या के हल के लिए
import static org.mockito.Mockito.verifyZeroInteractions; 

// ... 

private PrintStream backup = System.out; 

@Before 
public void setUp() { 
    System.setOut(mock(PrintStream.class)); 
} 

@After 
public void tearDown() { 
    verifyZeroInteractions(System.out); 
    System.setOut(backup); 
} 
+0

ऐसा लगता है कि मैं इस दृष्टिकोण के लिए सबसे अच्छा कर सकता हूं। धन्यवाद! (मैंने वास्तव में एक सहायक वर्ग में अधिकांश तर्क छुपाए हैं और लॉगर को भी चुप करना पड़ा;)) –

6
verifyZeroInteractions(systemOut); 

टिप्पणियों में उल्लेख किया गया है, यह एक जासूसी के साथ काम नहीं करता है।

लगभग बराबर लेकिन अधिक पूर्ण उत्तर के लिए, इस प्रश्न के लिए gontard द्वारा उत्तर देखें।

+0

(फेसपाल्म) - लेकिन यह जासूसी के साथ काम नहीं कर रहा है, मुझे इसके बजाय प्रिंटस्ट्रीम का नकल करना होगा और इसे सिस्टम पर सेट करना होगा ... –

+0

अपना कोड देखे बिना, मुझे लगता है कि यह आपके लिए क्यों विफल रहता है जासूस यह है कि जब आप अपने जासूसों को दबाते हैं, तो स्टब में विधि कॉल वास्तव में सत्यापित होने के लिए गिना जाता है। तीन सुझाव (1) 'सत्यापित करें NoMoreInvocations (ignoreStubs (mockOne, mockTwo));' - यह 'verifyZeroInteractions' की तरह काम करेगा, लेकिन जो आपने पहले ही दबाया है उसे अनदेखा कर रहा है। (2) क्या आप अपने स्टब्स सेट अप करने के लिए 'डूरेटर्न/डू थ्रो/डूएन्सर' विधियों का उपयोग कर रहे हैं? ये आम तौर पर 'कब' से बेहतर काम करते हैं ... 'फिर रीटर्न/फिर थ्रो/फिर', जब जासूसों से निपटने की बात आती है। ... जारी –

+0

सुझाव (3) आपके कुछ कोड पोस्ट करना है ताकि यहां लोग आपकी मदद कर सकें। –

4

आप एक अलग कील की कोशिश कर सकते:

private PrintStream stdout; 

@Before public void before() { 
    stdout = System.out; 
    OutputStream out = new OutputStream() { 
     @Override public void write(int arg0) throws IOException { 
      throw new RuntimeException("Not allowed"); 
     } 
    }; 
    System.setOut(new PrintStream(out)); 
} 

@After public void after() { 
    System.setOut(stdout); 
} 

यदि आप पसंद करते हैं, तो आप एक नकली के लिए अनाम प्रकार स्विच और as Don Roby suggests सत्यापित कर सकता।

+1

निश्चित रूप से एक +1। दुर्भाग्य से मुझे इस बार मॉकिटो के साथ समाधान में दिलचस्पी थी इसलिए मैं एक और जवाब स्वीकार करूंगा। आशा है कि आपको बुरा लगेगा :) –

2

एक तरह से, वर्ग है कि आप परीक्षण कर रहे हैं refactor करने के लिए एक PrintStream कि उत्पादन के लिए इस्तेमाल किया जा सकता का इंजेक्शन के लिए अनुमति देने के लिए है। System कक्षा के व्यवहार पर निर्भर किए बिना, यह आपको यूनिट का परीक्षण करने देगा। आप इस इंजेक्शन के लिए पैकेज-निजी कन्स्ट्रक्टर का उपयोग कर सकते हैं, क्योंकि आप इसे कभी भी इसी टेस्ट क्लास से उपयोग करेंगे। तो यह ऐसा कुछ दिख सकता है।

public class MyClass{ 
    private PrintWriter systemOut; 

    public MyClass(){ 
     this(System.out); 
    } 

    MyClass(PrintWriter systemOut){ 
     this.systemOut = systemOut; 

     // ...any other initialisation processing that you need to do 
    } 
} 

और कक्षा के भीतर, सिस्टम.आउट के बजाय सिस्टमऑट वैरिएबल का उपयोग करें जहां भी आप बाद वाले को कॉल करते हैं।

अब, टेस्ट क्लास के भीतर, एक मॉक PrintStream बनाएं, और उस ऑब्जेक्ट को प्राप्त करने के लिए पैकेज-निजी कन्स्ट्रक्टर को पास करें, जिसे आप परीक्षण करने जा रहे हैं। अब आप अपने परीक्षणों से अपनी पसंद के किसी भी क्रिया को चला सकते हैं, और verify का उपयोग अपने नकली PrintStream पर अपने प्रभावों की जांच के लिए कर सकते हैं।

+0

आह, ठीक है, लेकिन बिल्कुल नहीं जो मैं करना चाहता था: मैंने स्पर्श किए बिना कक्षा का परीक्षण करने का एक तरीका खोजने का प्रयास किया यह, विशेष रूप से कोड जोड़ने के बिना जो परीक्षण के लिए आवश्यक है। लेकिन दूसरी तरफ, यदि हम परीक्षण के तहत कक्षाएं तैयार करने के इच्छुक हैं, तो यह वास्तव में अच्छा दृष्टिकोण है! –