I wonder if the code that I’ve written reflects proper way of testing WorkManager
with use of Hilt
.
Details
My worker is initialized in Application class:
@HiltAndroidApp
class ExpenseTrackerApp : Application(), Configuration.Provider {
@Inject
lateinit var workerFactory: HiltWorkerFactory
override val workManagerConfiguration: Configuration
get() =
Configuration.Builder()
.setWorkerFactory(workerFactory)
.build()
override fun onCreate() {
super.onCreate()
schedulePaymentsWork()
}
private fun schedulePaymentsWork() {
// logic for determining initial delay..
val workRequest =
PeriodicWorkRequestBuilder<ScheduledPaymentsWorker>(1, TimeUnit.DAYS)
.setInitialDelay(initialDelay, TimeUnit.MILLISECONDS)
.build()
WorkManager.getInstance(this).enqueueUniquePeriodicWork(
"ScheduledPaymentsWorker",
ExistingPeriodicWorkPolicy.KEEP,
workRequest
)
}
What I want to test here is delay, so I created following tests:
@HiltAndroidTest
class ScheduledPaymentsWorkerTest {
@get:Rule
var hiltRule = HiltAndroidRule(this)
@Inject
lateinit var workerFactory: HiltWorkerFactory
@Before
fun setUp() {
hiltRule.inject()
val context = InstrumentationRegistry.getInstrumentation().targetContext
val config = Configuration.Builder()
.setMinimumLoggingLevel(Log.DEBUG)
.setExecutor(SynchronousExecutor())
.setWorkerFactory(workerFactory)
.build()
WorkManagerTestInitHelper.initializeTestWorkManager(context, config)
}
@Test
@Throws(Exception::class)
fun testInitialDelay() {
// same logic for determining delay as in production code ..
val request = PeriodicWorkRequestBuilder<ScheduledPaymentsWorker>(1, TimeUnit.DAYS)
.setInitialDelay(initialDelay, TimeUnit.MILLISECONDS)
.build()
val workManager = WorkManager.getInstance(ApplicationProvider.getApplicationContext())
val testDriver = WorkManagerTestInitHelper.getTestDriver(ApplicationProvider.getApplicationContext())
workManager.enqueue(request).result.get()
testDriver!!.setPeriodDelayMet(request.id)
val workInfo = workManager.getWorkInfoById(request.id).get()
assertThat(workInfo.state, `is`(WorkInfo.State.ENQUEUED))
}
}
Questions
Is that a proper way of integration tests of WorkManager
?
Where I’ve my doubts is the place where initial delay is set. Should I really write the logic twice? In production and in test code?
Or should I use custom application class? Similar question was posted here