繁体   English   中英

declareMock<> 在 android 单元测试中不能使用 mockk

[英]declareMock<> not working with mockk in android unit test

我正在尝试使用declareMockmockk但它似乎不起作用,因为我从真实存储库获取数据。

版本

implementation "org.koin:koin-androidx-viewmodel:2.1.6"
testImplementation "org.koin:koin-test:2.1.6"

代码

我的申请 class (仅相关部分):

class MyApplication : Application() {
    companion object {
        val appModule = module {
            single<RepositoryUserLists> { RepositoryUserListsImpl() }
        }
    }

    override fun onCreate() {
        super.onCreate()

        startKoin {
            androidLogger()
            androidContext(this@MyApplication)
            modules(appModule)
        }
    }
}

我的测试 class (仅相关部分)

class TestRepositoryUserLists : KoinTest {
    @get:Rule
    val koinTestRule = KoinTestRule.create {
        modules(MyApplication.appModule)
    }

    @get:Rule
    val mockProvider = MockProviderRule.create { clazz ->
        mockkClass(clazz.java.kotlin)
    }

    @Rule
    @JvmField
    val instantExecutorRule = InstantTaskExecutorRule()

    private val repo: RepositoryUserLists by inject()

    @Before
    fun before() {
        declareMock<RepositoryUserLists> {
            every { getAllLists() } returns MutableLiveData(listOf(MyList("test list")))
        }
    
        //PROBLEM IS HERE
        //Expected: a list containing one item names "test list".
        //Actual: empty list (like in real repository).
        repo.getAllLists().value 
    }
}

github 问题: https://github.com/InsertKoinIO/koin/issues/841

我认为您需要在declareMock块中使用given/will语法

    declareMock<RepositoryUserLists> {
        given(getAllLists()).willReturn(MutableLiveData(listOf(MyList("test list"))))
    }

刚刚为那些迁移到 2.2.2 等新版本的 koin 的人发布了它,并且依赖项测试失败并出现错误Missing MockProvider. Please use MockProvider.register() to register a new mock provider Missing MockProvider. Please use MockProvider.register() to register a new mock provider

import io.mockk.every
import io.mockk.mockkClass
...

val app = koinApplication {
    printLogger(Level.DEBUG)
    modules(...)
}

MockProvider.register { mockkClass(it) }

with(app.koin) {
    declareMock<MyService> {
        every { someAction() } returns "some answer"
        ...
    }
}

app.checkModules()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM