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.
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
İ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. –
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