2009-11-03 9 views
9

Bir birim, ExecutorService kullanıldığında Runnable görevi için yeni bir iş parçacığının nasıl üretildiğini sınar?ExecutorService'in görev için yeni iş parçacığı nasıl üretildiğini nasıl test edebilirim?

Temel olarak, uygulamam için statik bir iş parçacığı havuzum var.

public static final ExecutorService executorService = Executors.newCachedThreadPool(); 
Farklı iplik havuzları dramatik başvurumun davranışını değiştirebilir, çünkü doğrusu bir dışarı alay veya yeni iş parçacığı havuzu enjekte daha birliğim testler için bu iş parçacığı havuzu kullanmak istiyorum

(sabit vs önbelleğe alınmış vs planlanmış, vb); Uygulamanın davranışını çalışma zamanı iş parçacığı havuzuyla test ettiğimden emin olmak istiyorum.

Önbelleğe alınmış iş parçacığı havuzu benim için en iyi şekilde görünüyor. Sorun şu ki, statik ve iplikler 60 saniye önbelleklendiğinde, sadece ilk test havuzda yeni bir iplik üretecek ve sonraki testler bu dişi tekrar kullanacak.

Birim test kodu: bu çalışma almak için, ya da başka bir yaklaşım tamamen mutluluk duyacağız nasıl

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()); 
} 

Önerileri.

+0

Neden istemci ayrı bir konu çağrıyı gerçekleştirir eğer önemsiyorsun? "Bu ne kadar sürer?" Gibi şeyler hakkında bir şeyler görebiliyorum. veya "bu işlem bir kesintiye doğru yanıt veriyor." Ancak, bu, ünite testinin zayıf bir uygulaması gibi görünüyor. – erickson

+0

İyi soru. Bu belirli istemci eşzamansız olarak bir web hizmeti çağrısı yürütmelidir, böylece onu kullanan nesneyi tutmaz - uygulamada bir performans sorunu. Yanıt beklemiyordum, sadece bir web servis çağrısı yapan görevin senkronize olmayan bir şekilde ortaya çıktığından emin olmak istiyorum. –

+0

Ben de öyle düşündüm. Yani gerçekten sınamanız gereken şey, "onu kullanan nesneyi [s] tutmak" olup olmadığıdır. Bu ne kadar sürer? DoCall'ı, geri dönmesi iki gün sürecek şekilde uygulayabilirim, ancak yine de yürütücünün başka bir iş parçacığı oluşturmasına neden olur; Ölçütünüz ihlal edilmiş olsa bile birim testiniz yine de geçer. – erickson

cevap

19

Mock ThreadFactory:

ThreadFactory mock = new CustomObservableThreadFactory(); 
    ExecutorService executorService = Executors.newCachedThreadPool(mock); 
  1. zamanki
  2. olarak test altında sınıfa ExecutorService enjekte Ama önbelleğe ThreadPool'da oluşturmak için bir özel ThreadFactory kullanın: ThreadFactory zaman adı verilecek Yeni bir Konu çağrılacak. Daha sonra, bu örneklemeleri istediğiniz gibi, örneğin bir dinleyici veya sayaç ile izleyebilirsiniz.
İlgili konular