WorkManager มี API สำหรับการทดสอบ Worker
ListenableWorker
และ
ตัวแปร ListenableWorker
ตัว
(CoroutineWorker
และ RxWorker
)
ผู้ปฏิบัติงานทดสอบ
สมมติว่าเรามี Worker
ซึ่งมีลักษณะดังนี้
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(); } } }
หากต้องการทดสอบ Worker
นี้ คุณสามารถใช้
TestWorkerBuilder
ช่วงเวลานี้
เครื่องมือสร้างช่วยสร้างอินสแตนซ์ของ Worker
ที่ใช้เพื่อวัตถุประสงค์
การทดสอบตรรกะทางธุรกิจ
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
เพื่อตั้งค่าแท็ก เช่น inputData
หรือ
runAttemptCount
เพื่อให้คุณยืนยันสถานะของผู้ปฏิบัติงานแยกต่างหากได้ พิจารณา
ตัวอย่างที่ SleepWorker
ใช้ระยะเวลาสลีปเป็นข้อมูลอินพุต
แทนที่จะเป็นการเจาะจงที่ตัวพนักงานเอง:
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
คุณสามารถระบุข้อมูลที่ป้อนไปยัง
TestWorkerBuilder
เพื่อตอบสนองความต้องการของ SleepWorker
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 โปรดดูหน้าข้อมูลอ้างอิงสำหรับ
TestListenableWorkerBuilder
,
คลาสซูเปอร์ของ TestWorkerBuilder
การทดสอบ ListenableWorker และตัวแปร
หากต้องการทดสอบ ListenableWorker
หรือ
ตัวแปร (CoroutineWorker
และ RxWorker
) ให้ใช้
TestListenableWorkerBuilder
ความแตกต่างหลักระหว่าง TestWorkerBuilder
และ
TestListenableWorkerBuilder
TestWorkerBuilder
ช่วยให้คุณระบุพื้นหลัง Executor
เพื่อ
เรียกใช้ Worker
ในขณะที่ TestListenableWorkerBuilder
จะใช้
ตรรกะการแยกชุดข้อความของการใช้งาน ListenableWorker
ตัวอย่างเช่น สมมติว่าเราต้องทดสอบ CoroutineWorker
ซึ่งมีลักษณะดังนี้
class SleepWorker(context: Context, parameters: WorkerParameters) :
CoroutineWorker(context, parameters) {
override suspend fun doWork(): Result {
delay(1000L) // milliseconds
return Result.success()
}
}
ในการทดสอบ SleepWorker
ก่อนอื่น เราจะสร้างอินสแตนซ์ของผู้ปฏิบัติงานโดยใช้
TestListenableWorkerBuilder
แล้วเรียกใช้ฟังก์ชัน doWork
ภายใน
โครูทีน
@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
เหมาะที่จะใช้เป็นเครื่องมือสร้างโครูทีนสำหรับการทดสอบของคุณ ดังนั้นโค้ด
ที่จะทำงานแบบไม่พร้อมกันจะเรียกใช้พร้อมกันแทน
การทดสอบการใช้งาน RxWorker
คล้ายกับการทดสอบ CoroutineWorker
เนื่องจาก
TestListenableWorkerBuilder
สามารถจัดการคลาสย่อยของ ListenableWorker
ได้
ลองใช้ SleepWorker
เวอร์ชันที่ใช้ RxJava แทนโครูทีน
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); } }
เวอร์ชันของ SleepWorkerTest
ที่ทดสอบ RxWorker
อาจมีลักษณะคล้ายกับ
เวอร์ชันที่ทดสอบ CoroutineWorker
คุณใช้เหมือนเดิม
TestListenableWorkerBuilder
แต่ตอนนี้ได้โทรเข้าไปที่ createWork
ของ RxWorker
createWork
จะแสดงผล Single
ที่ใช้ยืนยัน
พฤติกรรมของพนักงาน TestListenableWorkerBuilder
จัดการชุดข้อความทั้งหมด
มีความซับซ้อนและเรียกใช้โค้ดผู้ปฏิบัติงานควบคู่กัน
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()))); } }