![](/img/trans.png)
[英]How to create a Worker with parameters for in WorkManager for Android?
[英]How to unit test WorkManager Worker
如何對 WorkManager 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
}
}
在 Work Manager alpha10 版本中,添加了一個帶有WorkerParameters
的構造函數,因此可以更輕松地傳遞輸入Data
注意:我在 Worker 類中創建了工廠方法,因此更容易讀取在 Worker 中傳遞和使用的輸入數據。
這是示例單元測試:
@RunWith(PowerMockRunner.class)
@PrepareForTest({WorkerParameters.class})
public class SampleWorkerTest {
@Mock
Context context;
WorkerParameters workerParams;
Data inputData;
SampleWorker worker;
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
workerParams = PowerMockito.mock(WorkerParameters.class);
inputData = SampleWorker.createData("data one", "data two");
when(workerParams.getInputData()).thenReturn(inputData);
worker = new SampleWorker(context, workerParams);
}
@Test
public void testCreateWorkRequestFactoryMethod() {
WorkRequest workRequest = SampleWorker.createWorkRequest("data one", "data two");
WorkSpec workSpec = workRequest.getWorkSpec();
// verify constraints
assertThat(workSpec.constraints.getRequiredNetworkType(), is(equalTo(NetworkType.CONNECTED)));
// verify input data
assertThat(workSpec.input.getString(SampleWorker.KEY_DATA_1), is(equalTo("data one")));
assertThat(workSpec.input.getString(SampleWorker.KEY_DATA_2), is(equalTo("data two")));
}
@Test
public void testDoWorkSuccess() {
Worker.Result result = worker.doWork();
// verify business logic here
assertThat(result, is(equalTo(Worker.Result.SUCCESS)));
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.