WorkManager, Worker,
ListenableWorker ve
ListenableWorker varyant
(CoroutineWorker)
ve RxWorker).
Test Çalışanları
Aşağıdaki gibi görünen bir Worker olduğunu varsayalım:
Kotlin
class SleepWorker(context: Context, parameters: WorkerParameters) : Worker(context, parameters) { override fun doWork(): Result { // Sleep on a background thread. Thread.sleep(1000) return Result.success() } }
Java
public class SleepWorker extends Worker { public SleepWorker( @NonNull Context context, @NonNull WorkerParameters workerParameters) { super(context, workerParameters); } @NonNull @Override public Result doWork() { try { Thread.sleep(1000); } catch (InterruptedException ignore) { return Result.success(); } } }
Bu Worker aracını test etmek için şunları kullanabilirsiniz:
TestWorkerBuilder Bu
oluşturucu, şu amaçlarla kullanılabilecek Worker örneklerinin derlenmesine yardımcı olur:
iş mantığını test etmektir.
Kotlin
// 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())) } }
Java
@RunWith(AndroidJUnit4.class) public class SleepWorkerJavaTest { private Context context; private Executor executor; @Before public void setUp() { context = ApplicationProvider.getApplicationContext(); executor = Executors.newSingleThreadExecutor(); } @Test public void testSleepWorker() { SleepWorker worker = (SleepWorker) TestWorkerBuilder.from(context, SleepWorker.class, executor) .build(); Result result = worker.doWork(); assertThat(result, is(Result.success())); } }
TestWorkerBuilder, etiketleri ayarlamak için de kullanılabilir. Örneğin, inputData veya
runAttemptCount kullanarak çalışan durumunu tek başına doğrulayabilirsiniz. Dikkatlice
SleepWorker kullanıcısının giriş verisi olarak uyku süresi aldığı bir örnek
bir yanıt vermemiz gerekir:
Kotlin
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" } }
Java
public class SleepWorker extends Worker { public static final String SLEEP_DURATION = "SLEEP_DURATION"; public SleepWorker( @NonNull Context context, @NonNull WorkerParameters workerParameters) { super(context, workerParameters); } @NonNull @Override public Result doWork() { try { long duration = getInputData().getLong(SLEEP_DURATION, 1000); Thread.sleep(duration); } catch (InterruptedException ignore) { return Result.success(); } } }
SleepWorkerTest ürününde bu giriş verilerini şurada sağlayabilirsiniz:
SleepWorker ihtiyaçlarını karşılamak için TestWorkerBuilder.
Kotlin
// 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())) } }
Java
@RunWith(AndroidJUnit4.class) public class SleepWorkerJavaTest { private Context context; private Executor executor; @Before public void setUp() { context = ApplicationProvider.getApplicationContext(); executor = Executors.newSingleThreadExecutor(); } @Test public void testSleepWorker() { Data inputData = new Data.Builder() .putLong("SLEEP_DURATION", 1000L) .build(); SleepWorker worker = (SleepWorker) TestWorkerBuilder.from(context, SleepWorker.class, executor) .setInputData(inputData) .build(); Result result = worker.doWork(); assertThat(result, is(Result.success())); } }
TestWorkerBuilder API hakkında daha fazla bilgi için şu referans sayfasına bakın:
TestListenableWorkerBuilder,
TestWorkerBuilder üst sınıfı.
ListenableWorker ve varyantlarını test etme
Bir ListenableWorker veya
varyantlar (CoroutineWorker
ve RxWorker)
TestListenableWorkerBuilder
TestWorkerBuilder ile
TestListenableWorkerBuilder
TestWorkerBuilder, Executor için kullanılan arka planı belirtmenize olanak tanır.
Worker öğesini çalıştırırken TestListenableWorkerBuilder,
ListenableWorker uygulamasının iş parçacıkları oluşturma mantığına bakın.
Örneğin, aşağıdakine benzer bir CoroutineWorker öğesini 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 testini yapmak için önce aşağıdakini kullanarak Çalışanın bir örneğini oluştururuz:
TestListenableWorkerBuilder ve ardından, şununla doWork işlevini çağırın:
eş yordam.
@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 bir eş yordam oluşturucu olarak mantıklıdır. Bu sayede herhangi bir kod
yerine paralel olarak çalıştırılır.
RxWorker uygulamasını test etmek, CoroutineWorker testine benzer, çünkü
TestListenableWorkerBuilder, ListenableWorker öğesinin tüm alt sınıflarını işleyebilir.
Eş yordamlar yerine RxJava kullanan bir SleepWorker sürümünü düşünün.
Kotlin
class SleepWorker( context: Context, parameters: WorkerParameters ) : RxWorker(context, parameters) { override fun createWork(): Single<Result> { return Single.just(Result.success()) .delay(1000L, TimeUnit.MILLISECONDS) } }
Java
public class SleepWorker extends RxWorker { public SleepWorker(@NonNull Context appContext, @NonNull WorkerParameters workerParams) { super(appContext, workerParams); } @NonNull @Override public Single<Result> createWork() { return Single.just(Result.success()) .delay(1000L, TimeUnit.MILLISECONDS); } }
RxWorker test eden bir SleepWorkerTest sürümü şuna benzer görünebilir:
sürümünü test eden bir CoroutineWorker sürümü bulunur. Aynı
TestListenableWorkerBuilder ancak şimdi RxWorker adlı kişinin createWork telefonunu arayabilirsiniz
işlevini kullanın. createWork, şu değeri doğrulamak için kullanabileceğiniz bir Single döndürür:
hakkında bilgi edindiniz. TestListenableWorkerBuilder tüm mesaj dizilerini işler
ve çalışan kodunuzu paralel olarak yürütür.
Kotlin
@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())) } } }
Java
@RunWith(AndroidJUnit4.class) public class SleepWorkerTest { private Context context; @Before public void setUp() { context = ApplicationProvider.getApplicationContext(); } @Test public void testSleepWorker() { SleepWorker worker = TestListenableWorkerBuilder.from(context, SleepWorker.class) .build(); worker.createWork().subscribe(result -> assertThat(result, is(Result.success()))); } }