WorkManager, Worker, ListenableWorker, और ListenableWorker वैरिएंट (CoroutineWorker और RxWorker) की जांच करने के लिए एपीआई उपलब्ध कराता है.
टेस्टिंग वर्कर
मान लें कि हमारे पास एक Worker है, जो इस तरह दिखता है:
class SleepWorker(context: Context, parameters: WorkerParameters) : Worker(context, parameters) { override fun doWork(): Result { // Sleep on a background thread. Thread.sleep(1000) return Result.success() } }
इस Worker को टेस्ट करने के लिए, TestWorkerBuilder का इस्तेमाल किया जा सकता है. इस बिल्डर की मदद से, Worker के इंस्टेंस बनाए जा सकते हैं. इनका इस्तेमाल, कारोबारी नियम की जांच करने के लिए किया जा सकता है.
// 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 = TestWorkerBuilder<SleepWorker>( context = context, executor = executor ).build() val result = worker.doWork() assertThat(result, `is`(Result.success())) } }
TestWorkerBuilder का इस्तेमाल, inputData या runAttemptCount जैसे टैग सेट करने के लिए भी किया जा सकता है. इससे, वर्कर की स्थिति की पुष्टि अलग से की जा सकती है. मान लें कि SleepWorker, इनपुट डेटा के तौर पर नींद की अवधि लेता है, न कि वर्कर में तय किया गया कोई कॉन्सटेंट:
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" } }
SleepWorkerTest में, TestWorkerBuilder को इनपुट डेटा दिया जा सकता है, ताकि SleepWorker की ज़रूरतों को पूरा किया जा सके.
// 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 = TestWorkerBuilder<SleepWorker>( context = context, executor = executor, inputData = workDataOf("SLEEP_DURATION" to 1000L) ).build() val result = worker.doWork() assertThat(result, `is`(Result.success())) } }
TestWorkerBuilder एपीआई के बारे में ज़्यादा जानकारी के लिए, TestWorkerBuilder की सुपरक्लास TestListenableWorkerBuilder का रेफ़रंस पेज देखें.
ListenableWorker और इसके वैरिएंट की जांच करना
ListenableWorker या इसके वैरिएंट (CoroutineWorker और RxWorker) की जांच करने के लिए, TestListenableWorkerBuilder का इस्तेमाल करें.
TestWorkerBuilder और TestListenableWorkerBuilder के बीच मुख्य अंतर यह है कि TestWorkerBuilder की मदद से, Worker को चलाने के लिए इस्तेमाल किए जाने वाले बैकग्राउंड Executor को तय किया जा सकता है. वहीं, 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 का इस्तेमाल करता हो.
class SleepWorker( context: Context, parameters: WorkerParameters ) : RxWorker(context, parameters) { override fun createWork(): Single<Result> { return Single.just(Result.success()) .delay(1000L, TimeUnit.MILLISECONDS) } }
SleepWorkerTest का वह वर्शन जो RxWorker की जांच करता है, उस वर्शन से मिलता-जुलता हो सकता है जिसने CoroutineWorker की जांच की थी. TestListenableWorkerBuilder का इस्तेमाल करें, लेकिन अब RxWorker के createWork फ़ंक्शन को कॉल करें. createWork, Single दिखाता है. इसका इस्तेमाल करके, अपने वर्कर के व्यवहार की पुष्टि की जा सकती है. TestListenableWorkerBuilder, थ्रेडिंग से जुड़ी किसी भी जटिलता को मैनेज करता है और आपके वर्कर कोड को एक साथ चलाता है.
@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() worker.createWork().subscribe { result -> assertThat(result, `is`(Result.success())) } } }