【问题标题】:declareMock<> not working with mockk in android unit testdeclareMock<> 在 android 单元测试中不能与 mockk 一起使用
【发布时间】:2020-06-28 16:39:52
【问题描述】:

我正在尝试使用 declareMockmockk 模拟存储库类,但它似乎无法正常工作,因为我正在从真实存储库获取数据。

版本

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

代码

我的应用程序类(仅相关部分):

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

    override fun onCreate() {
        super.onCreate()

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

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

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

【问题讨论】:

    标签: android unit-testing koin mockk


    【解决方案1】:

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

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

    【讨论】:

    • 这不是mockk的语法
    • 我相信这就是重点。 Koin 使用 mockProvider you 提供并为您模拟它。因此,在declareMock 内部,您需要使用 koin 模拟函数。
    • 我得到 io.mockk.MockKException: no answer found for: RepositoryUserLists(#1).getAllLists()
    • 我不确定它是否有帮助,但在我的项目中而不是我使用startKoin 的规则中。也许这样的工作? startKoin { modules(MyApplication.appModule) }
    • 感谢您的评论,但现在我只使用我设法注入的假存储库。当我想再试一次时,我会试试这个
    【解决方案2】:

    刚刚为那些迁移到 2.2.2 等较新版本的 koin 的人发布了它, 并且依赖项测试失败并出现错误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()
    

    【讨论】:

      猜你喜欢
      • 2020-01-29
      • 1970-01-01
      • 2021-10-31
      • 1970-01-01
      • 2011-01-14
      • 1970-01-01
      • 2022-10-17
      • 1970-01-01
      • 2023-03-11
      相关资源
      最近更新 更多