Hi all, i have a strange issue when running `verif...
# koin
m
Hi all, i have a strange issue when running
verify
, it complains that the Context is not supplied, the DI is setup using annotations, any ideas what might cause it? i had the assumption that it’s supplied/considered present by default. the stacktrace is:
Copy code
Missing definition for '[field:'context' - type:'android.content.Context']' in definition '[Singleton: 'com.example.model.repositories.ContextInteractorImpl',binds:com.example.model.repositories.ContextInteractor]'.
org.koin.test.verify.MissingKoinDefinitionException: Missing definition for '[field:'context' - type:'android.content.Context']' in definition '[Singleton: 'com.example.model.repositories.ContextInteractorImpl',binds:com.example.model.repositories.ContextInteractor]'.
	at app//org.koin.test.verify.Verification.verifyFactory(Verification.kt:82)
	at app//org.koin.test.verify.Verification.verify(Verification.kt:46)
	at app//org.koin.test.verify.Verify.verify(VerifyModule.kt:81)
	at app//org.koin.test.verify.VerifyModuleKt.verify(VerifyModule.kt:30)
	at app//org.koin.test.verify.VerifyModuleKt.verify$default(VerifyModule.kt:30)
	at app//com.example.koin.KoinDefinitionsTest.test if koin definitions are complete(KoinDefinitionsTest.kt:17)
	at java.base@17.0.13/java.lang.reflect.Method.invoke(Method.java:569)
	at java.base@17.0.13/java.util.ArrayList.forEach(ArrayList.java:1511)
	at java.base@17.0.13/java.util.ArrayList.forEach(ArrayList.java:1511)
👀 1
1
a
Did you used the koin-android-test version? it brings builtin recognition of Android types
m
@arnaud.giuliani many thanks for the pointer! switching to
androidVerify()
fixed the part about context resolving. I have one behaviour that looks like a bug in
androidVerify()
, the injection of a
List
cannot be properly verified. the setup looks like this:
Copy code
@Single
internal class WorManagerImpl(
    private val workUnits: List<WorkUnit>,
) : StartupManager {

    override fun doWork() {
        workUnits.sortedBy { it.priority }.forEach { it.doWork() }
    }
}

@Single
class WorkUnit1() : WorkUnit {
    override val priority: WorkPriority = RegularPriority

    override fun doWork() {
        // do some work
    }
}

@Single
class WorkUnit2() : WorkUnit {
    override val priority: WorkPriority = RegularPriority

    override fun doWork() {
        // do some work
    }
}
Everything works well at runtime, but when running the test with
androidVerify()
it fails with:
Copy code
Missing definition for '[field:'workUnits' - type:'kotlin.collections.List']' in definition '[Singleton: 'com.example.model.managers.WorManagerImpl',binds:com.example.model.managers.WorManager]'.
- Fix your Koin configuration -
1- add missing definition for type 'kotlin.collections.List'. like: singleOf(::kotlin.collections.List)
or
2- else define injection for 'com.example.model.startup.WorManagerImpl' with:
module.verify(
    injections = injectedParameters(
        definition<com.example.model.managers.WorManagerImpl>(kotlin.collections.List::class)
    )
)
a
I will need to double-check, but injecting list of elements we loose types. That could be save later when JB will help make typeOf() work with good perfs
m
i see, thanks for the insight!