2010-01-30 32 views
24

Tôi đang viết các bài kiểm tra tích hợp bằng JUnit để tự động kiểm tra ứng dụng dựa trên bảng điều khiển. Ứng dụng này là bài tập về nhà nhưng phần này không phải là bài tập về nhà. Tôi muốn tự động hóa các bài kiểm tra này để có hiệu quả hơn - tôi không muốn phải quay lại và kiểm tra lại các phần đã được kiểm tra của ứng dụng. (Các lý do tiêu chuẩn để sử dụng các bài kiểm tra Đơn vị)Java, Junit - Nắm bắt đầu vào/đầu ra tiêu chuẩn để sử dụng trong một bài kiểm tra đơn vị

Dù sao, tôi không thể tìm ra hoặc tìm một bài viết về việc chụp đầu ra để tôi có thể làm assertEquals trên đó hoặc không cung cấp đầu vào tự động. Tôi không quan tâm nếu đầu ra/đầu vào đi vào bảng điều khiển/đầu ra. Tôi chỉ cần thực hiện kiểm tra và xác minh đầu ra là những gì được mong đợi cho đầu vào.

Bất kỳ ai có bài viết hoặc mã để trợ giúp về điều này.

+0

@dfa, tôi không đồng ý. Nó thực sự tương tự nhưng đủ khác nhau. –

+0

... được cấp câu trả lời giống nhau ... –

+1

Chủ đề khác hiện có câu trả lời tốt hơn. Nó liên quan đến việc sử dụng quy tắc hệ thống jUnit StandardOutputStreamLog. Ngoài ra còn có các quy tắc hệ thống cho stderr và stdin. –

Trả lời

38

Sử dụng System.setOut() (và System.setErr()) để chuyển hướng đầu ra đến một dòng in tùy ý - có thể là một trong những bạn đọc từ chương trình.

Ví dụ:

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

// test stuff here... 

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

Vì vậy, chỉ cần đi 'PrintStream _out = System.out;' Sẽ không hoạt động? –

+0

Nó sẽ - tức là bạn có tham chiếu đến luồng đầu ra hiện tại - nhưng bạn không thể * đọc * bất kỳ thứ gì từ nó vì không có phương thức thích hợp để làm như vậy trên giao diện 'PrintStream' chung. Kỹ thuật này liên quan đến việc thiết lập đầu ra cho một dòng in cụ thể mà bạn biết cách đọc từ đó. –

7

Lớp System có phương pháp setIn(), setOut()setErr() cho phép bạn thiết lập các đầu vào, đầu ra và báo lỗi dòng tiêu chuẩn, ví dụ đến một số ByteArrayOutputStream mà bạn có thể kiểm tra theo ý muốn.

1

Đây là giải pháp thay cho ByteArrayOutputStream. Nó không thêm bất cứ điều gì vào ý tưởng của System.setOut. Thay vào đó, tôi muốn chia sẻ việc thực hiện tốt hơn là bắt mọi thứ vào ByteArrayOutputStream. Tôi chỉ muốn nắm bắt thông tin được chọn và cho phép tất cả các thông điệp tường trình xuất hiện trong bảng điều khiển khi chúng được ghi lại thay vì chụp tất cả mọi thứ vào một balckbox (kích thước nào?) Để xử lý sau.

/** 
* 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 
    } 
}; 

Dưới đây là một ví dụ của việc sử dụng các lớp:

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 
Các vấn đề liên quan