2011-12-11 36 views
8

Tôi muốn kiểm tra một số mã dựa trên truyền dẫn mạng. Mã tạo một yêu cầu và cung cấp một cuộc gọi lại - khi yêu cầu hoàn tất, cuộc gọi lại được kích hoạt. Tôi muốn thử truyền dẫn mạng, và sử dụng Thread.sleep để mô phỏng độ trễ một số ... nhưng tất nhiên điều đó sẽ làm cho toàn bộ thử nghiệm tạm dừng.Kiểm tra mã không đồng bộ với JUnit

Cho đến nay tôi đã tạo các chuỗi mới và sử dụng CountDownLatch es trong suốt quá trình kiểm tra để dừng thử nghiệm kết thúc trước khi cuộc gọi lại được kích hoạt. Đối tượng mạng giả của tôi tạo một luồng mới, ngủ trên luồng đó và sau đó kích hoạt cuộc gọi lại. Đó là thực sự làm việc khá tốt, nhưng vấn đề là bất kỳ lỗi xác nhận trong callback không được báo cáo cho thread junit ban đầu - thay vào đó, tôi nhận được văn bản ngoại lệ trên bàn điều khiển, nơi nó khó hiểu hơn và sử dụng.

Tôi hy vọng có một trong hai:

  1. Một cách để ống assertEquals đầu ra từ đề sinh ra vào thu sản lượng JUnit chính, hoặc
  2. Một cách hoàn toàn khác biệt và tốt hơn để kiểm tra mã luồng trong JUnit, hoặc
  3. một số cách để mô phỏng mã không đồng bộ trong một chủ đề duy nhất

Thanks cho bất kỳ ý tưởng!

+0

Tại sao không kiểm tra QUnit: http://docs.jquery.com/QUnit –

Trả lời

4

Khi tôi phải triển khai cơ chế không đồng bộ tương tự như của bạn, tôi đã tạo lớp trừu tượng AsyncTestCase có lỗi kiểm tra và cung cấp phương thức đặc biệt waitForCallback(). Khi tác vụ không đồng bộ tìm lỗi trong kết quả mong đợi, nó sẽ đưa lỗi vào biến này. Setter gọi notify() trên đối tượng được sử dụng bởi waitForCallback(). Vì vậy, khi gọi lại đến nó ngay lập tức gây ra kiểm tra để tỉnh táo. Sau đó, tôi có thể gọi tất cả các xác nhận bao gồm cả xác nhận được lưu trữ bởi tác vụ không đồng bộ.

Và đừng quên để đặt thời gian chờ các bài kiểm tra của bạn để ngăn chặn chúng từ ngủ mãi mãi:

@Test(timeout=10000) 
public void mytest() { 
    callAsyncTask(); 
    waitForAsyncTask();  // from base class 
    assertAsyncTaskResult(); // from base class 
} 
+0

Ah, ý tưởng thông minh. Cảm ơn! –

0

Những gì bạn đang mô tả là ConcurrentUnit. Dưới đây là một ví dụ:

final Waiter waiter = new Waiter(); 

    new Thread(() -> { 
    doSomeWork(); 
    waiter.assertTrue(true); 
    waiter.resume(); 
    }).start(); 

    // Wait for resume() to be called 
    waiter.await(1000); 
Các vấn đề liên quan