WorkManager; Worker, ListenableWorker ve ListenableWorker varyantlarını (CoroutineWorker ve RxWorker) test etmek için API'ler sağlar.
Test Çalışanları
Şuna benzer bir Worker olduğunu varsayalım:
class SleepWorker(context: Context, parameters: WorkerParameters) : Worker(context, parameters) { override fun doWork(): Result { // Sleep on a background thread. Thread.sleep(1000) return Result.success() } }
Bu Worker test etmek için TestWorkerBuilder kullanabilirsiniz. Bu oluşturucu, iş mantığını test etmek amacıyla kullanılabilecek Worker örnekleri oluşturmaya yardımcı olur.
// Kotlin code uses the TestWorkerBuilder extension to build // the Worker @RunWith(AndroidJUnit4::class) class SleepWorkerTest { private lateinit var context: Context private lateinit var executor: Executor @Before fun setUp() { context = ApplicationProvider.getApplicationContext() executor = Executors.newSingleThreadExecutor() } @Test fun testSleepWorker() { val worker = TestWorkerBuilder<SleepWorker>( context = context, executor = executor ).build() val result = worker.doWork() assertThat(result, `is`(Result.success())) } }
TestWorkerBuilder, çalışan durumunu ayrı olarak doğrulayabilmeniz için inputData veya runAttemptCount gibi etiketleri ayarlamak amacıyla da kullanılabilir. SleepWorker işlevinin, çalışan içinde tanımlanan bir sabit yerine giriş verisi olarak uyku süresini aldığı bir örneği ele alalım:
class SleepWorker(context: Context, parameters: WorkerParameters) : Worker(context, parameters) { override fun doWork(): Result { // Sleep on a background thread. val sleepDuration = inputData.getLong(SLEEP_DURATION, 1000) Thread.sleep(sleepDuration) return Result.success() } companion object { const val SLEEP_DURATION = "SLEEP_DURATION" } }
SleepWorkerTest'da, SleepWorker'nin ihtiyaçlarını karşılamak için bu giriş verilerini TestWorkerBuilder'nize sağlayabilirsiniz.
// Kotlin code uses the TestWorkerBuilder extension to build // the Worker @RunWith(AndroidJUnit4::class) class SleepWorkerTest { private lateinit var context: Context private lateinit var executor: Executor @Before fun setUp() { context = ApplicationProvider.getApplicationContext() executor = Executors.newSingleThreadExecutor() } @Test fun testSleepWorker() { val worker = TestWorkerBuilder<SleepWorker>( context = context, executor = executor, inputData = workDataOf("SLEEP_DURATION" to 1000L) ).build() val result = worker.doWork() assertThat(result, `is`(Result.success())) } }
TestWorkerBuilder API'si hakkında daha fazla bilgi için TestWorkerBuilder sınıfının üst sınıfı olan TestListenableWorkerBuilder ile ilgili referans sayfasına bakın.
ListenableWorker ve varyantlarını test etme
ListenableWorker veya varyantlarını (CoroutineWorker ve RxWorker) test etmek için TestListenableWorkerBuilder kullanın.
TestWorkerBuilder ile TestListenableWorkerBuilder arasındaki temel fark, TestWorkerBuilder'ın Worker'i çalıştırmak için kullanılan arka plan Executor'ini belirtmenize olanak tanıması, TestListenableWorkerBuilder'nin ise ListenableWorker uygulamasının iş parçacığı mantığını kullanmasıdır.
Örneğin, aşağıdaki gibi bir CoroutineWorker test etmemiz gerektiğini varsayalım:
class SleepWorker(context: Context, parameters: WorkerParameters) : CoroutineWorker(context, parameters) { override suspend fun doWork(): Result { delay(1000L) // milliseconds return Result.success() } }
SleepWorker sınıfını test etmek için önce TestListenableWorkerBuilder kullanarak Worker sınıfının bir örneğini oluşturur, ardından bir eş yordam içinde doWork işlevini çağırırız.
@RunWith(AndroidJUnit4::class) class SleepWorkerTest { private lateinit var context: Context @Before fun setUp() { context = ApplicationProvider.getApplicationContext() } @Test fun testSleepWorker() { val worker = TestListenableWorkerBuilder<SleepWorker>(context).build() runBlocking { val result = worker.doWork() assertThat(result, `is`(Result.success())) } } }
runBlocking, testleriniz için eş yordam oluşturucu olarak mantıklıdır. Böylece eşzamansız olarak yürütülecek tüm kodlar paralel olarak çalıştırılır.
RxWorker uygulamasını test etmek, CoroutineWorker uygulamasını test etmeye benzer. Çünkü TestListenableWorkerBuilder, ListenableWorker sınıfının tüm alt sınıflarını işleyebilir.
SleepWorker uygulamasının eş yordamlar yerine RxJava kullanan bir sürümünü düşünün.
class SleepWorker( context: Context, parameters: WorkerParameters ) : RxWorker(context, parameters) { override fun createWork(): Single<Result> { return Single.just(Result.success()) .delay(1000L, TimeUnit.MILLISECONDS) } }
SleepWorkerTest'nin RxWorker test eden bir sürümü, CoroutineWorker test eden sürüme benzer görünebilir. Aynı TestListenableWorkerBuilder kullanırsınız ancak artık RxWorker'nin createWork işlevini çağırırsınız. createWork, çalışanınızın davranışını doğrulamak için kullanabileceğiniz bir Single döndürür. TestListenableWorkerBuilder, tüm iş parçacığı karmaşıklıklarını ele alır ve çalışan kodunuzu paralel olarak yürütür.
@RunWith(AndroidJUnit4::class) class SleepWorkerTest { private lateinit var context: Context @Before fun setUp() { context = ApplicationProvider.getApplicationContext() } @Test fun testSleepWorker() { val worker = TestListenableWorkerBuilder<SleepWorker>(context).build() worker.createWork().subscribe { result -> assertThat(result, `is`(Result.success())) } } }