WorkManager; Worker
, ListenableWorker
ve ListenableWorker
varyantlarını (CoroutineWorker
ve RxWorker
) test etmek için API'ler sağlar.
Test Çalışanları
Aşağıdaki gibi görünen bir Worker
öğemiz 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
öğesini test etmek için
TestWorkerBuilder
kullanabilirsiniz. Bu oluşturucu, iş mantığını test etmek amacıyla kullanılabilecek Worker
örneklerinin oluşturulmasına yardımcı olur.
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
, inputData
veya runAttemptCount
gibi etiketleri ayarlamak için de kullanılabilir. Böylece çalışan durumunu tek başına doğrulayabilirsiniz. SleepWorker
öğesinin, çalışanda sabit bir değer olarak tanımlanmak yerine uyku süresini giriş verisi olarak aldığı bir örneği düşünün:
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
bölgesinde, SleepWorker
cihazının ihtiyaçlarını karşılamak için bu giriş verilerini TestWorkerBuilder
cihazınıza sağlayabilirsiniz.
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 TestWorkerBuilder
üst sınıfı olan TestListenableWorkerBuilder
referans sayfasını inceleyin.
ListenableWorker'ı ve varyantlarını test etme
ListenableWorker
veya varyantlarını (CoroutineWorker
ve RxWorker
) test etmek için TestListenableWorkerBuilder
ifadesini kullanın.
TestWorkerBuilder
ile TestListenableWorkerBuilder
arasındaki temel fark, TestWorkerBuilder
öğesinin Worker
çalıştırmak için kullanılan Executor
arka planını belirtmenize olanak tanımasıdır; TestListenableWorkerBuilder
ise ListenableWorker
uygulamasının iş parçacığı mantığına dayanır.
Örneğin, aşağıdaki gibi 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
hizmetini test etmek için önce TestListenableWorkerBuilder
kullanarak Çalışanı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 anlamlıdır. Bu sayede, eşzamansız olarak çalışan tüm kodlar paralel olarak çalıştırılır.
TestListenableWorkerBuilder
, tüm ListenableWorker
alt sınıflarını işleyebildiğinden RxWorker
uygulamasını test etmek CoroutineWorker
testine benzer.
Coroutin'ler 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 edilen SleepWorkerTest
sürümü, CoroutineWorker
test edilen sürüme benzer görünebilir. Aynı TestListenableWorkerBuilder
işlevini kullanıyorsunuz, ancak şimdi RxWorker
createWork
işlevini çağırıyorsunuz. 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.
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()))); } }