WorkManager Worker
, ListenableWorker
, এবং ListenableWorker
ভেরিয়েন্ট ( CoroutineWorker
এবং RxWorker
) পরীক্ষার জন্য API প্রদান করে।
পরীক্ষামূলক কর্মীরা
ধরা যাক আমাদের একজন 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() } }
জাভা
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 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())) } }
জাভা
@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
একটি ঘুমের সময়কালকে কর্মীতে সংজ্ঞায়িত করার পরিবর্তে ইনপুট ডেটা হিসাবে নেয়:
কোটলিন
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" } }
জাভা
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
এ, আপনি SleepWorker
এর চাহিদা মেটাতে আপনার TestWorkerBuilder
কে সেই ইনপুট ডেটা প্রদান করতে পারেন।
কোটলিন
// 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())) } }
জাভা
@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
আপনাকে 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) } }
জাভা
public class SleepWorker extends RxWorker { public SleepWorker(@NonNull Context appContext, @NonNull WorkerParameters workerParams) { super(appContext, workerParams); } @NonNull @Override public Single<Result> createWork() { 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())) } } }
জাভা
@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()))); } }