In order to test the recurring work, I need to wait for a whole 15 minutes (reference) to test the recurrence and this is really not efficient. Is there a better and quicker way for developers to test this sooner?
You can test PeriodicWorkRequest sooner than MIN_PERIODIC_INTERVAL_MILLIS which is 15 minutes.
For this, you need WorkManagerTestInitHelper
available in androidx.work.testing
.
First of all add the following dependency in the build.gradle file for your app or module:
//Current stable release is 2.3.4
androidTestImplementation "androidx.work:work-testing:2.3.4
Next, you need to use setPeriodDelayMet
method available with TestDriver
which can be used to indicate that an interval is complete and executes PeriodicWorkRequest sooner than MIN_PERIODIC_INTERVAL_MILLIS (15 minutes).
Sample code:
@Test
public void testPeriodicWork(Context context) throws Exception {
// Setup input data
Data input = new Data.Builder().put(KEY_1, 1).put(KEY_2, 2).build();
// Create periodic work request
PeriodicWorkRequest request = new PeriodicWorkRequest.Builder(MyWorker.class, 15, TimeUnit.MINUTES)
.setInputData(input)
.build();
// Enqueue periodic request
WorkManager.getInstance(context).enqueueUniquePeriodicWork(WORKER_TAG, ExistingPeriodicWorkPolicy.REPLACE, request);
// Initialize testDriver
TestDriver testDriver = WorkManagerTestInitHelper.getTestDriver();
// Tells the testing framework the period delay is met, this will execute your code in doWork() in MyWorker class
testDriver.setPeriodDelayMet(request.getId());
}
You can find more information about testing PeriodicWorkRequest at https://developer.android.com/topic/libraries/architecture/workmanager/how-to/integration-testing#periodic-work
Learn more about testing WorkManager at https://developer.android.com/reference/androidx/work/testing/WorkManagerTestInitHelper and https://developer.android.com/reference/androidx/work/testing/TestDriver
androidx.work.impl.WorkManagerImpl cannot be cast to androidx.work.testing.TestWorkManagerImpl
crash –
Become If I'm understanding well your problem, you need to test your Woker's work, no whether it's or not periodic, then you can use a OneTimeWorkRequest
val work = OneTimeWorkRequest.Builder(TheWorker::class.java).build()
WorkManager.getInstance().enqueue(work)
© 2022 - 2024 — McMap. All rights reserved.
WorkManager
-related classes. Write unit test cases or instrumentation test cases for that code. – Wag