NoockDefFoundException with Mock ViewModel,使用Koin,Espresso测试

问题描述 投票:0回答:1

我一直在尝试使用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:...

android android-espresso android-testing androidx koin
1个回答
0
投票

这里发生的是ActivityTestRule在您的@Before方法之前启动了活动,因此模拟没有机会被初始化。

来自官方documentation

© www.soinside.com 2019 - 2024. All rights reserved.