簡體   English   中英

如何使用 Koin 對 MVVM 進行單元測試?

[英]How to Unit Test MVVM with Koin?

如何使用 Koin 對 MVVM 進行單元測試?

我嘗試測試: 鏈接

但是,我不知道為什么error("No Data in ViewModel") fun getLookUpLeagueList()

存儲庫

class LookUpLeagueRepository {

    fun getLookUpLeague(idLeague: String): MutableLiveData<LookUpLeague> {
        val lookUpLeague = MutableLiveData<LookUpLeague>()
        APIService().getLookUpLeague(idLeague).enqueue(object : Callback<LookUpLeague> {
            override fun onFailure(call: Call<LookUpLeague>, t: Throwable) {
                d("TAG", "lookUpLeagueOnFailure ${t.localizedMessage}")
            }

            override fun onResponse(call: Call<LookUpLeague>, response: Response<LookUpLeague>) {
                lookUpLeague.value = response.body()
            }
        })
        return lookUpLeague
    }
}

視圖模型

class LookUpLeagueViewModel(private val lookUpLeagueRepository: LookUpLeagueRepository) :
    ViewModel() {

    var lookUpLeagueList = MutableLiveData<LookUpLeague>()

    fun getLookUpLeagueList(idLeague: String) {
        lookUpLeagueList = lookUpLeagueRepository.getLookUpLeague(idLeague)
    }
}

模塊

val lookUpLeagueModule = module {
    single { LookUpLeagueRepository() }
    viewModel { LookUpLeagueViewModel(get()) }
}

視圖模型測試

class LookUpLeagueViewModelTest : KoinTest {

    val lookUpLeagueViewModel: LookUpLeagueViewModel by inject()

    val idLeague = "4328"

    @get:Rule
    val rule = InstantTaskExecutorRule()

    @Mock
    lateinit var observerData: Observer<LookUpLeague>

    @Before
    fun before() {
        MockitoAnnotations.initMocks(this)
        startKoin {
            modules(lookUpLeagueModule)
        }
    }

    @After
    fun after() {
        stopKoin()
    }

    @Test
    fun getLookUpLeagueList() {
        lookUpLeagueViewModel.lookUpLeagueList.observeForever(observerData)

        lookUpLeagueViewModel.getLookUpLeagueList(idLeague)

        val value = lookUpLeagueViewModel.lookUpLeagueList.value ?: error("No Data in ViewModel")

        Mockito.verify(observerData).onChanged(value)
    }
}
@Test
fun getLookUpLeagueList() {
    lookUpLeagueViewModel.lookUpLeagueList.observeForever(observerData)
    ...
}

這時lookUpLeagueList是實例MutableLiveData 假設這是MutableLiveData #1

lookUpLeagueViewModel.getLookUpLeagueList(idLeague)

執行上面的行將調用LookUpLeagueViewModel.getLookUpLeagueList函數。 讓我們來看看它的內部。

lookUpLeagueList = lookUpLeagueRepository.getLookUpLeague(idLeague)

MutableLiveData中創建了一個全新的LookUpLeagueRepository 這與observerData正在觀察的一個不同。 此時lookUpLeagueViewModel.lookUpLeagueList指的是新的MutableLiveData #2因為您將它重新分配給var lookUpLeagueList

val value = lookUpLeagueViewModel.lookUpLeagueList.value ?: error("No Data in ViewModel")

因此,您實際上是在查詢新的、未觀察到的、空的MutableLiveData #2 這就是valuenull的原因。 與其聲明為var ,不如將其聲明為val 不要重新分配變量、 setValuepostValue以傳播更改。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM