পরীক্ষা কর্মী বাস্তবায়ন

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())));
        }
}