2010-01-30 14 views
24

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

वैसे भी, मैं आउटपुट को कैप्चर करने पर कोई लेख नहीं ढूंढ सकता या नहीं ढूंढ सकता ताकि मैं assertEquals पर न कर सकूं और न ही स्वचालित इनपुट प्रदान कर सकूं। मुझे कोई परवाह नहीं है कि आउटपुट/इनपुट कंसोल/आउटपुट फलक पर जाता है। मुझे केवल परीक्षण निष्पादित करने की आवश्यकता है और आउटपुट को आउटपुट की अपेक्षा की जाती है।

किसी के पास इस के लिए सहायता करने के लिए कोई लेख या कोड है।

+0

@dfa, मैं सहमत नहीं हूँ। यह वास्तव में समान है लेकिन काफी अलग है। –

+0

... उत्तर दिया गया वही है ... –

+1

अन्य धागे का अब बेहतर जवाब है। इसमें जुनीट मानकऑटपुटस्ट्रीम लॉग सिस्टम नियम का उपयोग शामिल है। Stderr और stdin के लिए सिस्टम नियम भी हैं। –

उत्तर

38

आउटपुट को मनमाने ढंग से प्रिंटस्ट्रीम पर रीडायरेक्ट करने के लिए System.setOut() (और System.setErr()) का उपयोग करें - जो प्रोग्रामेटिक रूप से पढ़ा जा सकता है।

उदाहरण के लिए:

final ByteArrayOutputStream myOut = new ByteArrayOutputStream(); 
System.setOut(new PrintStream(myOut)); 

// test stuff here... 

final String standardOutput = myOut.toString(); 
+1

तो बस 'प्रिंटस्ट्रीम _out = System.out' जा रहा है, 'काम नहीं करेगा? –

+0

यह होगा - यानी आप मौजूदा आउटपुट स्ट्रीम का संदर्भ लेंगे - लेकिन आप इसे * कुछ भी नहीं पढ़ सकते हैं क्योंकि सामान्य 'प्रिंटस्ट्रीम' इंटरफ़ेस पर ऐसा करने के लिए कोई उचित तरीका नहीं है। इस तकनीक में आउटपुट को एक विशिष्ट प्रिंटस्ट्रीम पर सेट करना शामिल है जिसे आप जानते हैं कि कैसे पढ़ा जाए। –

7

System वर्ग तरीकों setIn(), setOut() और setErr() है कि आप मानक इनपुट, आउटपुट और त्रुटि धाराओं निर्धारित करने की अनुमति है, उदा है ByteArrayOutputStream पर आप इच्छानुसार निरीक्षण कर सकते हैं।

1

यहां ByteArrayOutputStream के स्थान पर समाधान है। यह System.setOut के विचार में कुछ भी नहीं जोड़ता है। इसके बजाय, मैं कार्यान्वयन को साझा करना चाहता हूं जो बाइटएरे ऑटपुटस्ट्रीम में सब कुछ कैप्चर करने से बेहतर है। मैं केवल चयनित जानकारी को कैप्चर करना पसंद करता हूं और बाद में प्रसंस्करण के लिए सभी लॉग संदेशों को कंसोल में दिखने के लिए लॉग इन करता हूं क्योंकि वे सबकुछ बैलेंबॉक्स (किस आकार के?) में कैप्चर करने के बजाय लॉग होते हैं।

/** 
* Once started, std output is redirected to this thread. 
* Thread redirects all data to the former system.out and 
* captures some strings.*/ 
static abstract class OutputCaputre extends Thread { 

    // overrdie these methods for System.err 
    PrintStream getDownstream() { return System.out;} 
    void restoreDownstream() { System.setOut(downstream);} 

    // will be called for every line in the log 
    protected abstract void userFilter(String line); 

    final PrintStream downstream; 
    public final PipedInputStream pis; 
    private final PipedOutputStream pos; 
    OutputCaputre() throws IOException { 
     downstream = getDownstream(); 

     pos = new PipedOutputStream(); 
     pis = new PipedInputStream(pos); 
     System.setOut(new PrintStream(pos)); 

     start(); 
    } 

    public void run() { 
     try { 
      BufferedReader br = new BufferedReader(new InputStreamReader(pis)); 

      // once output is resotred, we must terminate 
      while (true) { 
       String line = br.readLine(); 
       if (line == null) { 
        return; 
       } 
       downstream.println(line); 
       userFilter(line); 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

    public void terminate() throws InterruptedException, IOException { 
     restoreDownstream(); // switch back to std 
     pos.close(); // there will be no more data - signal that 
     join(); // and wait until capture completes 
    } 
}; 

यहाँ वर्ग का उपयोग करने का एक उदाहरण है:

OutputCaputre outputCapture = new OutputCaputre() { 
    protected void userFilter(String line) { 
     downstream.println("Capture: " + line); 
    }  
}; 
System.out.println("do you see me captured?"); 
// here is your test  
outputCapture.terminate(); // finally, stop capturing 
संबंधित मुद्दे