如何对 WorkManager Worker 进行单元测试?
这里是一个示例 Worker:
public class SampleWorker extends Worker {
private static final String TAG = "SampleWorker";
private static final String WORKER_TAG = "SAMPLE";
static final String KEY_DATA_1 = "KEY_DATA_1";
static final String KEY_DATA_2 = "KEY_DATA_2";
public SampleWorker(@NonNull Context context, @NonNull WorkerParameters workerParams) {
super(context, workerParams);
}
public static WorkRequest createWorkRequest(String data1, String data2) {
Constraints constraints = new Constraints.Builder()
.setRequiredNetworkType(NetworkType.CONNECTED)
.build();
Data inputData = createData(data1, data2);
return new OneTimeWorkRequest.Builder(SampleWorker.class)
.setConstraints(constraints)
.setInputData(inputData)
.addTag(WORKER_TAG)
.build();
}
static Data createData(String data1, String data2) {
return new Data.Builder()
.putString(KEY_DATA_1, data1)
.putString(KEY_DATA_2, data2)
.build();
}
@NonNull
@Override
public Result doWork() {
try {
Data inputData = getInputData();
businessLogicHere(inputData.getString(KEY_DATA_1), inputData.getString(KEY_DATA_2));
return Result.SUCCESS;
} catch (Exception e) {
Log.e(TAG, "doWork failed", e);
return Result.FAILURE;
}
}
private void businessLogicHere(String data1, String data2) {
// no-op
}
}
androidx.work.testing
库。从 2.1 版本开始,你可以创建一个TestWorkerBuilder<SampleWorker>
或者TestListenableWorkerBuilder<SampleWorker>
(如果你正在使用 CoroutineWorker/RxWorkers)。然后你可以传递构造函数参数,例如runAttemptCount
、inputData
等,并调用startWork()
来启动你的 worker 的doWork()
方法。 这里的示例应该有助于澄清问题:https://codelabs.developers.google.com/codelabs/kotlin-coroutines/#11 - dgelormini