简体   繁体   English

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

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

i am trying to mock a repository class using declareMock and mockk but it doesn't seem to be working as i am getting the data from the real repository.我正在尝试使用declareMockmockk但它似乎不起作用,因为我从真实存储库获取数据。

Version版本

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

Code代码

My application class (only relevant parts):我的申请 class (仅相关部分):

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

    override fun onCreate() {
        super.onCreate()

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

My test class (only relevant parts)我的测试 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 issue: https://github.com/InsertKoinIO/koin/issues/841 github 问题: https://github.com/InsertKoinIO/koin/issues/841

I think you need to use the given/will syntax inside the declareMock block我认为您需要在declareMock块中使用given/will语法

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

Just posted it here for those migrating to a newer version of the koin like 2.2.2, and the dependency test was failed with an error Missing MockProvider. Please use MockProvider.register() to register a new mock provider刚刚为那些迁移到 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 . 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