2009-11-03 18 views
9

Làm thế nào để một đơn vị kiểm tra rằng một luồng mới được sinh ra cho một nhiệm vụ Runnable khi sử dụng một ExecutorService?Làm thế nào để kiểm tra đơn vị rằng ExecutorService sinh ra chuỗi mới cho công việc?

Về cơ bản, tôi có một nhóm luồng tĩnh cho ứng dụng của mình.

public static final ExecutorService executorService = Executors.newCachedThreadPool(); 

Tôi muốn sử dụng nhóm chủ đề này cho các bài kiểm tra đơn vị của mình, thay vì chế nhạo hoặc thêm một nhóm chủ đề mới. được lưu trong bộ nhớ cache so với lịch biểu, v.v.); Tôi muốn đảm bảo rằng tôi kiểm tra hành vi của ứng dụng với nhóm luồng thời gian chạy của nó.

Hồ sơ chuỗi được lưu trong bộ nhớ cache có vẻ phù hợp nhất với tôi. Vấn đề là vì nó tĩnh và các luồng được lưu trữ trong 60 giây, chỉ thử nghiệm đầu tiên mới thực sự tạo ra một luồng mới trong nhóm, trong khi các phép kiểm tra tiếp theo sử dụng lại luồng đó. mã kiểm tra

Đơn vị:

public void testDoCallExecutesTaskInAnotherThread() {  
    final Client client = this.createClient(); 
    final ThreadPoolExecutor threadPoolExecutor = (ThreadPoolExecutor) client.getExecutorService(); // gets the static thread pool 
    final int initPoolSize = threadPoolExecutor.getPoolSize(); 
    final Response response = client.doCall(); 
    Assert.assertEquals(initPoolSize + 1, threadPoolExecutor.getPoolSize()); 
} 

Tư vấn về làm thế nào để làm việc này, hoặc cách tiếp cận khác hoàn toàn sẽ được đánh giá.

+0

Tại sao bạn quan tâm nếu khách hàng thực hiện cuộc gọi trong một chuỗi riêng biệt? Tôi có thể thấy quan tâm đến những thứ như, "mất bao lâu?" hoặc "hoạt động này phản hồi chính xác với gián đoạn". Nhưng khi nó đứng, điều này có vẻ là một ứng dụng kém của thử nghiệm đơn vị. – erickson

+0

Câu hỏi hay. Ứng dụng khách cụ thể này phải thực hiện cuộc gọi dịch vụ web không đồng bộ để nó không giữ đối tượng sử dụng nó - một vấn đề hiệu suất trong ứng dụng của tôi. Tôi không chờ đợi xung quanh cho một phản ứng, tôi chỉ muốn đảm bảo rằng nhiệm vụ mà làm cho một cuộc gọi dịch vụ web được sinh ra không đồng bộ. –

+0

Đó là những gì tôi nghĩ. Vì vậy, những gì bạn nên thực sự thử nghiệm cho dù là "giữ [s] lên đối tượng trong đó sử dụng nó". Đó là, phải mất bao lâu? Tôi có thể thực hiện doCall theo cách mà phải mất hai ngày để trả về, nhưng vẫn khiến cho người thực thi tạo ra một luồng khác; kiểm tra đơn vị của bạn sẽ vẫn vượt qua, mặc dù tiêu chí của bạn bị vi phạm. – erickson

Trả lời

19

Mock các ThreadFactory:

ThreadFactory mock = new CustomObservableThreadFactory(); 
    ExecutorService executorService = Executors.newCachedThreadPool(mock); 
  1. Chích ExecutorService vào lớp dưới kiểm tra như thường lệ
  2. Nhưng sử dụng một tùy chỉnh ThreadFactory để tạo ThreadPool cache: Các ThreadFactory sẽ được gọi bất cứ khi nào một Thread mới sẽ được gọi. Sau đó, bạn có thể theo dõi các cảnh báo này theo ý muốn, ví dụ: với trình nghe hoặc bộ đếm.
Các vấn đề liên quan