简体   繁体   中英

How to inject a mocked ViewModel in a RoboElectric test using Koin

I'm pretty new in Android development and currently, I'm testing a basic activity with Roboelectric and Koin.

Code:

class SplashActivity : AppCompatActivity() {
    private val viewModel: LoginViewModel by viewModel()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_splash)

        Stetho.initializeWithDefaults(this)

        val user = viewModel.getPersistedUser()

        if (user != null) {
            viewModel.setUser(user)
            startActivity(HomeActivity.getStartIntent(this))
        } else {
            startActivity(LoginActivity.getStartIntent(this))
        }
    }
}

val appModule = module(override = true) {
    ...

    viewModel<LoginViewModel>()
}

Now all I want to do in the test is to inject a mocked version of the viewModel to simulate the response of the method getPersistedUser.

How can I do that with Roboelectric and Koin?

First, if you want to write UI test for SplashActivity . Better to use Expresso testing framework ( https://developer.android.com/training/testing/espresso )

Second, if you want to mock your viewmodel with Koin in your test, you can load your Koin modules then declare your viewmodel mock, code will be similar like this

class SplashActivityTest : AutoCloseKoinTest() {

    private val viewModel: LoginViewModel by inject()

    @Before
    fun before() {
        koinApplication {
            loadModules(appModule)
        }
        declareMock<LoginViewModel> {
            given(getPersistedUser()).willReturn { User(username, password) }
        }
    }

    @Test
    fun loadCurrentUserWhenActivityInit() {
        // verify your test here 
    }
}

More details here https://start.insert-koin.io/#/getting-started/testing

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM