WorkManager:出于测试目的立即调用doWork()

时间:2018-11-05 17:25:55

标签: android android-architecture-components android-workmanager

如果我有一个PeriodicWorkRequest,我可以设置一个时间间隔l-最小为15分钟。 但是,如何在不等待15分钟的情况下测试我的doWork()方法是否有效?

是否可能将OneTimeWorkRequest用于测试?

预先感谢

2 个答案:

答案 0 :(得分:1)

是的,没有什么可以阻止您使用OneTimeWorkRequest

val work = OneTimeWorkRequest.Builder(MyWorker::class.java).build()
WorkManager.getInstance().enqueue(work)

请记住,这不允许您测试Worker在设定的分钟数后会触发,例如使用PeriodicWorkRequest时。但是,它将使您无需等待就可以测试代码是否正常工作。

答案 1 :(得分:1)

是的,PeriodicWorkRequest的最短时间间隔为15分钟,并且由于已在PeriodicWorkRequest.MIN_PERIODIC_INTERVAL_MILLIS中进行了硬编码,因此无法更改。

但是,出于测试目的,您可以在WorkManagerTestInitHelper中可用的androidx.work.testing的帮助下随时调用PeriodicWorkRequest的doWork()方法。

在build.gradle文件中为您的应用或模块添加以下依赖项:

//Current stable release is 2.3.4
androidTestImplementation "androidx.work:work-testing:2.3.4"

接下来,您需要使用TestDriver可用的setPeriodDelayMet方法,该方法可以用来指示一个间隔已完成,并且比MIN_PERIODIC_INTERVAL_MILLIS(15分钟)要早执行PeriodicWorkRequest。 示例代码:

@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());

}

PeriodicWorkRequest上了解有关测试Testing Periodic Work的更多信息