Возможно, это не полный ответ, потому что в вашем вопросе так много всего. Начните с попытки использовать CoroutineTestRule:
@ExperimentalCoroutinesApi
class CoroutineTestRule(
private val testDispatcher: TestCoroutineDispatcher = TestCoroutineDispatcher()
) : TestWatcher() {
override fun starting(description: Description?) {
Dispatchers.setMain(testDispatcher)
}
override fun finished(description: Description?) {
Dispatchers.resetMain()
testDispatcher.cleanupTestCoroutines()
}
}
Ваш тест будет выглядеть примерно так:
class PaymentViewModelTest : KoinTest {
private val paymentViewModel : PaymentViewModel by inject()
@get:Rule
val coroutineTestRule = CoroutineTestRule()
@Before
fun setup(){
startKoin {
androidContext(mock(Application::class.java))
modules(
modules.repositoryModule,
modules.businessModule,
modules.utilsModule
)
}
declareMock<AnalyticsHelper>()
declareMock<Printer>()
}
@After
fun after(){
stopKoin()
}
// Other methods are the same.
}
Вы можете использовать AutoCloseKoinTest для удаления этого метода after ().
Вы говорите, что тест проходит, когда вы запускаете его изолированно, поэтому, возможно, этого достаточно. Но есть еще кое-что, если это не сработает. Например, мне кажется странным, что вы используете runBlockingTest внутри макета, а assert находится за пределами этого блока. Обычно я использую MockK для имитации приостановленных функций, а также для проверки и утверждения любой из них внутри runBlockingTest.