Test Çalışanı uygulaması

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 = TestWorkerBuilderS<leepWorker(>
            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 = TestWorkerBuilderS<leepWorker(>
            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(): SingleR<esult >{
        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 SingleR<esult >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 = TestListenableWorkerBuilderS<leepWorker(>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())));
        }
}