2010-09-28 25 views
8

Trong ứng dụng của chúng tôi, chúng tôi mong đợi đầu vào người dùng trong một Thread như sau:dữ liệu Viết để System.in

BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 

Tôi muốn vượt qua phần đó trong bài kiểm tra đơn vị của tôi để tôi có thể tiếp tục các chủ đề để thực hiện phần còn lại của mã. Làm thế nào tôi có thể viết một cái gì đó vào System.in từ junit?

+1

Tôi không nghĩ rằng bạn có thể, nhưng dường như bạn có thể theo Justin. Tuy nhiên, nó sẽ không được tốt hơn để cấu trúc lại mã kiểm tra để có được inputstream chèn từ bên ngoài? –

+0

@Bart, nếu bạn đang thử nghiệm một ứng dụng lấy đầu vào từ 'System.in', cuối cùng bạn sẽ muốn thử nghiệm mô-đun lấy dữ liệu từ' System.in'. – jjnguy

+2

@Justin Không phải là thử nghiệm Java này chứ không phải mã của bạn? Nếu bạn thực hiện InputStream được tiêm, bạn vẫn đang kiểm tra tất cả mã của bạn và tùy thuộc vào Java để cung cấp System.in đúng. –

Trả lời

20

Những gì bạn muốn làm là sử dụng phương pháp setIn() từ System. Điều này sẽ cho phép bạn chuyển dữ liệu vào System.in từ junit.

+0

Điều này hoạt động khi tôi chạy các bài kiểm tra JUnit riêng lẻ, nhưng khi tôi chạy toàn bộ lớp, chương trình của tôi có vẻ như bị trì hoãn tại các điểm mà setIn() sẽ hoạt động. Có ai khác có vấn đề này, và nếu như vậy bất kỳ ý tưởng về làm thế nào để có được xung quanh nó? – decal

+0

@ bạn có thể gặp sự cố khi thiết lập không chính xác() & tearDown() sửa đổi các giá trị đó System.in() và System.out(). Có một số tham chiếu khác cho vấn đề đó ở nơi khác trên SE. Nếu có ai khác nhìn thấy chú thích này, tôi sẽ tìm kiếm và thay thế .. – Crowie

9

Thay thế nó trong suốt thời gian thử nghiệm của bạn:

String data = "the text you want to send"; 
InputStream testInput = new ByteArrayInputStream(data.getBytes("UTF-8")); 
InputStream old = System.in; 
try { 
    System.setIn(testInput); 

    ... 
} finally { 
    System.setIn(old); 
} 
+0

Chi tiết nhỏ: vì bộ đệm được xây dựng không có bộ mã, bạn không nên gọi 'getBytes()' mà không có bộ ký tự (hoặc, tất nhiên, thêm charset để bufferedreader)? –

5

Thay vì những gợi ý ở trên (chỉnh sửa: Tôi nhận thấy rằng Bart trái ý tưởng này trong một chú thích cũng), tôi sẽ đề nghị làm cho lớp học của bạn nhiều đơn vị có thể kiểm chứng bằng cách làm cho lớp chấp nhận nguồn đầu vào như một tham số hàm tạo hoặc tương tự (chèn phụ thuộc). Một lớp học không nên được so sánh với System.in anyway.

Nếu lớp học của bạn được xây dựng từ một Reader, bạn chỉ có thể làm điều này:

class SomeUnit { 
    private final BufferedReader br; 
    public SomeUnit(Reader r) { 
     br = new BufferedReader(r); 
    } 
    //... 
} 

//in your real code: 
SomeUnit unit = new SomeUnit(new InputStreamReader(System.in)); 

//in your JUnit test (e.g.): 
SomeUnit unit = new SomeUnit(new StringReader("here's the input\nline 2")); 
Các vấn đề liên quan