Кодеин переопределить привязку для AndroidTest - PullRequest
0 голосов
/ 12 марта 2020

Я хочу переопределить привязку Кодеина с помощью макета перед тестированием моего класса.

Есть мой кодеин Код:

val kodein = Kodein {
    bind<MyRepository>() with provider { MyRepository() }
}

Затем мой класс для тестирования:

class MyClass {
    private val mMyRepository: MyRepository by kodein.instance()

    suspend fun sendData() = mMyRepository.sendData()
}

И мой тестовый класс:

@RunWith(AndroidJUnit4::class)
class MyClassTest {

    @MockK
    lateinit var mMyRepositoryMock: MyRepository

    val mMyClass = MyClass()

    @Before
    fun setUp() {
        MockKAnnotations.init(this, relaxUnitFun = true)
    }

    @Test
    fun testSendData() {
        coEvery { mMyRepositoryMock.sendData() } returns Unit

        runBlocking {
            mMyClass.sendData()
                .collect {
                    assertTrue(true)
                }
        }
    }
}

Я хочу переопределить mMyRepository значение в MyClass во время моего теста на mMyRepositoryMock.

Может ли кто-нибудь помочь мне сделать это

1 Ответ

0 голосов
/ 12 марта 2020

Именно поэтому мы не рекомендуем использовать глобальный экземпляр Kodein.

Лучший способ обеспечить тестируемость класса - это удалить его контекстную зависимость.

Рассмотрим следующий класс:

class MyClass(override val kodein: Kodein) {
    private val mMyRepository: MyRepository by kodein.instance()

    suspend fun sendData() = mMyRepository.sendData()
}

Теперь используемый им kodein передается в качестве параметра и поэтому может быть правильно настроен для тестов:

@RunWith(AndroidJUnit4::class)
class MyClassTest {

    @MockK
    lateinit var mMyRepositoryMock: MyRepository

    val kodein by Kodein.lazy {
        bind<MyRepository>() with provider { mMyRepositoryMock }
    }

    val mMyClass by lazy { MyClass(kodein) }

    @Before
    fun setUp() {
        MockKAnnotations.init(this, relaxUnitFun = true)
    }

    @Test
    fun testSendData() {
        coEvery { mMyRepositoryMock.sendData() } returns Unit

        runBlocking {
            mMyClass.sendData()
                .collect {
                    assertTrue(true)
                }
        }
    }
}
...