У одного из моих классов есть зависимость типа Context.Прежде чем добавить Koin в свой проект, я инициализировал это жесткой зависимостью от моего класса Application:
class ProfileRepository(
private var _context: Context? = null,
private var _profileRestService: IProfileRestService? = null
) : IProfileRepository {
init {
if (_context == null) {
_context = MyApplication.getInstance().applicationContext
}
}
Теперь я хочу использовать Koin для внедрения этой зависимости.Вот как я определил модуль:
object AppModule {
@JvmField
val appModule = module {
single<IProfileRestService> { ProfileRestService() }
single<IProfileRepository> { ProfileRepository(androidContext(), get()) }
}
}
Я запускаю Koin в методе onCreate
моего класса Application (который написан на Java):
startKoin(singletonList(AppModule.appModule));
Я хочу протестировать этот класс с помощью инструментального теста, а не модульного теста, потому что я хочу использовать реальный контекст, а не макет.Это мой тест:
@RunWith(AndroidJUnit4::class)
class MyTest : KoinTest {
private val _profileRepository by inject<IProfileRepository>()
@Test
fun testSomething() {
assertNotNull(_profileRepository)
}
Тест не пройден с исключением:
org.koin.error.BeanInstanceCreationException: Can't create definition for 'Single [name='IProfileRepository',class='com.my.app.data.profile.IProfileRepository']' due to error :
No compatible definition found. Check your module definition
Я могу заставить его работать с модульным тестом, если я поиграю в контексте следующим образом:
class MyTest : KoinTest {
private val _profileRepository by inject<IProfileRepository>()
@Before
fun before() {
startKoin(listOf(AppModule.appModule)) with mock(Context::class.java)
}
@After
fun after() {
stopKoin()
}
@Test
fun testSomething() {
assertNotNull(_profileRepository)
}
Как я могу заставить его работать в качестве инструментального теста в реальном контексте?