2010-06-24 28 views
13

Làm cách nào để đợi diễn viên Scala thoát()? Tôi đã thiết lập hai diễn viên trong một bài kiểm tra đơn vị và gửi một vài thông điệp để bắt đầu. Họ gửi một vài thông điệp qua lại và cuối cùng cả hai đều gọi exit(). Làm thế nào để kiểm tra đơn vị của tôi chờ cho cả hai diễn viên kết thúc trước khi vượt qua?Đợi diễn viên xuất cảnh()

Trả lời

7

Nếu bạn biết trước số lượng tin nhắn được trao đổi giữa các diễn viên, bạn có thể sử dụng java.util.concurrent.CountDownLatch để theo dõi số lượng tin nhắn. Trong các diễn viên, sau mỗi lần xử lý các tin nhắn, làm

latch.countDown() 

và trong chủ đề chính của bạn làm

latch.await() 

này sẽ làm cho chính chủ đề chờ đợi của bạn cho đến khi đếm chốt là xuống không.

Nếu bạn không biết số lượng thư trước, nhưng có điều kiện cho biết kết thúc, thì bạn có thể sử dụng java.util.concurrent.locks.Condition. Trong các diễn viên, khi điều kiện của bạn được thỏa mãn, làm

if (conditionSatisfied) 
    condition.signal() 

và trong chủ đề chính của bạn làm

while (!conditionSatisfied) 
condition.await() 

để làm cho nó chờ đợi cho đến khi điều kiện được thỏa mãn.

Xem javadocs của CountDownLatchCondition để biết chi tiết.

Xem this Gist ví dụ sử dụng Condition.

+1

Tôi có thể countDown() ngay trước exit() và chỉ đếm đến 1. Điều đó có vẻ dư thừa vì hai phương thức sẽ luôn được gọi cùng nhau. –

+0

Tôi không hiểu. Bạn muốn các chủ đề chính để chờ đợi cho đến khi các diễn viên được hoàn thành, phải không? Đó là những gì các cuộc gọi 'await()' sẽ thực hiện. –

+0

Nó có nghĩa là tôi phải thêm một chốt hoặc điều kiện vào mã sản xuất (các diễn viên) hoàn toàn cho một thử nghiệm JUnit (chờ đợi trên các diễn viên). –

2

Trong thông số kỹ thuật, bạn có thể sử dụng Eventually Matchers. Nếu bạn biết trạng thái cuối cùng của diễn viên hoặc bất kỳ thực thể nào (nói, lưu giữ lâu dài) nó sửa đổi, bạn có thể buộc thử nghiệm phải đợi, cho đến khi chuyển sang trạng thái này sẽ xảy ra:

<entity state> must eventually(10, 1.second)(be(<state>)) // there will be 10 retires every second, and if the state will be different, exception is thrown 
+1

Điều đó sẽ làm cho các bài kiểm tra đơn vị mất khoảng một phần mười của một giây để chạy đó là cách quá chậm. –

Các vấn đề liên quan