![](/img/trans.png)
[英]NoBeanDefFoundException with Mock ViewModel, testing with Koin, Espresso
[英]Koin - how to provide mock ViewModel for espresso test?
我們如何將模擬的viewModel注入到Activity中以進行濃縮咖啡測試? 使用declareMock
我在Test類中獲得了模擬對象,但Activity接收了常規的viewModel對象。
@RunWith(AndroidJUnit4::class)
class SomeActivityTest : KoinTest {
@Rule
@JvmField
val rule = ActivityTestRule(SomeActivity::class.java, true, true)
val viewModel: MyViewModel by inject()
@Before
fun setup() {
declareMock<MyViewModel>(isFactory = true, binds = listOf(ViewModel::class))
}
@After
fun cleanUp() {
stopKoin()
}
@Test
fun shouldHaveTextViewVisible() {
`when`(viewModel.sayHello())
.thenReturn("hello view-model")
onView(withId(R.id.tv_homescreen_message))
.check(matches(isDisplayed()))
onView(withId(R.id.tv_homescreen_message))
.check(matches(withText("hello view-model")))
}
}
在這種情況下,Espresso測試仍在使用主應用程序類,該類聲明了應用程序所需的所有koin
模塊。
koin
沒有任何模塊的情況下啟動koin
,允許我們在測試期間僅加載所需的模塊。
// application class for espresso tests
class TestApp : Application() {
override fun onCreate() {
super.onCreate()
startKoin(this, emptyList())
}
}
class TestAppJUnitRunner : AndroidJUnitRunner() {
override fun newApplication(cl: ClassLoader?, className: String?, context: Context?): Application {
return super.newApplication(cl, TestApp::class.java.name, context)
}
}
// app module build.gradle
android {
defaultConfig {
testInstrumentationRunner "com.package.TestAppJUnitRunner"
}
}
在開始活動之前聲明模擬方法很重要
@RunWith(AndroidJUnit4::class)
class SomeActivityTest : KoinTest {
@Rule
@JvmField
val rule = ActivityTestRule(SomeActivity::class.java, true, false)
lateinit var mockVm: MyViewModel
@Before
fun setup() {
mockVm = mock(MyViewModel::class.java)
loadKoinModules(module {
viewModel {
mockVm
}
})
}
@After
fun cleanUp() {
stopKoin()
}
@Test
fun shouldHaveTextViewWithMessage() {
// 1. declare mock method
val message = "hello view-model"
Mockito.`when`(mockVm.sayHello())
.thenReturn(message)
// 2. start activity
rule.launchActivity(null)
// 3. test
onView(withId(R.id.tv_message))
.check(matches(isDisplayed()))
onView(withId(R.id.tv_message))
.check(matches(withText(message)))
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.