我一直在尝试使用Espresso
作为DI工具进行简单的Koin
单元测试。这是我在build.gradle
// testing with Koin
// because of this
// https://github.com/InsertKoinIO/koin/pull/604/commits/69391bc378bbb9007b9d82c46537e7d753be7ea3
androidTestImplementation 'org.mockito:mockito-android:3.1.0'
androidTestImplementation ("org.koin:koin-test:$koin_version") {
exclude group: 'org.mockito'
}
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
// stuff like ActivityTestRule
androidTestImplementation 'androidx.test:rules:1.2.0'
// AndroidJUnit4
androidTestImplementation 'androidx.test.ext:junit:1.1.1'
// test runner
androidTestImplementation 'androidx.test:runner:1.2.0'
我的ViewModel
声明
open class LoginViewModel(private val apiService: MockApiService) : ViewModel() {
..
..
}
这里是它如何注入到Activity中的>>
private val loginViewModel: LoginViewModel by viewModel()
我的自定义
TestRunner
,以便实例化自定义TestApplication
class MyTestRunner : AndroidJUnitRunner() { override fun newApplication(cl: ClassLoader?, className: String?, context: Context?): Application { return super.newApplication(cl, TestApplication::class.java.name, context) } }
TestApplication
类。我已经验证了调用测试时该测试类是否已初始化]
class TestApplication : Application() { override fun onCreate() { super.onCreate() startKoin { androidLogger() androidContext(this@TestApplication) modules(emptyList()) } } }
这里是我实际的
androidTest
。一旦通过NoBeanDefFoundException
开始活动,此操作将失败未找到'com.abhishek.mvvmdemo.onboarding.LoginViewModel'的定义。
@RunWith(AndroidJUnit4::class) @LargeTest class LoginActivityTest : KoinTest { private lateinit var loginViewModel: LoginViewModel @get:Rule val activityRule = ActivityTestRule(LoginActivity::class.java) @Before fun beforeTest() { loginViewModel = declareMock() loadKoinModules( module { // single { ApiModule.providesApiService() } viewModel { loginViewModel } } ) } @Test fun testProgress() { activityRule.launchActivity(null) onView(withId(R.id.emailEt)) .perform(ViewActions.typeText("abhishek")) } @After fun afterTest() { stopKoin() } }
我尝试了很多排列和组合,但是没有运气。我的gradle中也碰巧有以下配置
testOptions { animationsDisabled = true } packagingOptions { pickFirst 'mockito-extensions/org.mockito.plugins.MockMaker' }
和
testInstrumentationRunner "com.abhishek.mvvmdemo.MyTestRunner"
TL; DR
这里是复制问题的github sample
我一直在尝试使用Koin作为DI工具来进行简单的Espresso单元测试。这就是我在build.gradle中使用的依赖项//为此进行了测试// // https:...
这里发生的是ActivityTestRule
在您的@Before
方法之前启动了活动,因此模拟没有机会被初始化。
来自官方documentation,