Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何测试注入Koin的viewModel?_Java_Android_Kotlin_Android Viewmodel_Koin - Fatal编程技术网

Java 如何测试注入Koin的viewModel?

Java 如何测试注入Koin的viewModel?,java,android,kotlin,android-viewmodel,koin,Java,Android,Kotlin,Android Viewmodel,Koin,我有一个模型。它调用我的数据repo中的函数,并返回dog对象的列表 class MainViewModel() : ViewModel() { private val dataRepo: DataRepo by inject(DataRepo::class.java) //dataRepo private var limit = 10 private val _dogListLiveData = MutableLiveData<List<Dog>>

我有一个模型。它调用我的数据repo中的函数,并返回dog对象的列表

class MainViewModel() : ViewModel() {
    private val dataRepo: DataRepo by inject(DataRepo::class.java) //dataRepo
    private var limit = 10
    private val _dogListLiveData = MutableLiveData<List<Dog>>()
    private var dogList = mutableListOf<Dog>()

    val dogListLiveData: MutableLiveData<List<Dog>>
        get() = _dogListLiveData

    fun searchByBreed(queryText: String) {
        dataRepo.searchByBreed(
            queryText,
            object : DataSource.OnResponseCallback<List<Dog>, String> {
                override fun onSuccess(obj: List<Dog>?) {
                    dogList = mutableListOf()
                    if(!obj.isNullOrEmpty()){
                    dogList.addAll(obj)
                    dogListLiveData.value = dogList.take(limit)
                    }

                }

                override fun onError(error: String) {
                    Log.i("Calling Network Service", error)
                }
            })

    }

    fun loadPaginateBreed() : Boolean{
        return if ((limit+10) < dogList.size) {
            limit += 10
            Log.i("Pagination new Limit", limit.toString())
            dogListLiveData.value = dogList.take(limit)
            false
        }else{
            limit += dogList.size%limit
            dogListLiveData.value = dogList.take(limit)
            true
        }
    }
}
class MainViewModel():ViewModel(){
private val dataRepo:dataRepo by inject(dataRepo::class.java)//dataRepo
私人风险价值限额=10
private val_dogListLiveData=MutableLiveData()
私有变量dogList=mutableListOf()
val dogListLiveData:MutableLiveData
get()=\u dogListLiveData
有趣的SearchBybride(queryText:String){
dataRepo.searchbybride(
queryText,
对象:DataSource.OnResponseCallback{
成功时覆盖乐趣(对象:列表?){
dogList=mutableListOf()
如果(!obj.isNullOrEmpty()){
dogList.addAll(obj)
dogListLiveData.value=dogList.take(限制)
}
}
重写错误(错误:字符串){
Log.i(“呼叫网络服务”,错误)
}
})
}
fun loadpaginatebride():布尔值{
如果((限制+10)
我需要为它编写一个简单的单元测试。我写了这篇文章,并尝试了许多其他的迭代。但似乎什么都不管用

package com.example.koinapplication.ui.main

import androidx.lifecycle.Observer
import com.example.koinapplication.custom.adpaters.GranularErrorCallAdapterFactory
import com.example.koinapplication.models.Dog
import com.example.koinapplication.models.Height
import com.example.koinapplication.models.Weight
import com.example.koinapplication.repo.*
import org.junit.After
import org.junit.Before
import org.junit.Test

import org.junit.Assert.*
import org.koin.android.ext.koin.androidContext
import org.koin.androidx.viewmodel.dsl.viewModel
import org.koin.core.context.startKoin
import org.koin.core.context.stopKoin
import org.koin.dsl.module
import org.koin.java.KoinJavaComponent.inject
import org.mockito.Mock
import org.mockito.Mockito
import org.mockito.MockitoAnnotations
import java.util.*

class MainViewModelTest {


    private val mainViewModel: MainViewModel by inject(MainViewModel::class.java)

    lateinit var obserserData : Observer<List<Dog>>

    private val networkModule = module {
        factory { AuthInterceptor() }
        factory { provideOkHttpClient(get()) }
        factory { GranularErrorCallAdapterFactory<Any>() }
        single { providesNetworkClient(get(), get()) }
        single { DataRepo(get()) }
        single { NetworkRepo(get()) }
    }


    @Before
    fun setUp() {
        MockitoAnnotations.initMocks(this)
        startKoin {
            modules(arrayListOf(networkModule))
        }
    }

    @After
    fun tearDown() {
        stopKoin()
    }

    @Test
    fun searchByBreed() {
        mainViewModel.dogListLiveData.observeForever { obserserData }
        mainViewModel.searchByBreed("dal")
        Mockito.verify(obserserData).onChanged(mainViewModel.dogListLiveData.value)
    }
}
package com.example.koinapplication.ui.main
导入androidx.lifecycle.Observer
导入com.example.koinapplication.custom.adpaters.GranularErrorCallAdapterFactory
导入com.example.koinapplication.models.Dog
导入com.example.koinapplication.models.Height
导入com.example.koinapplication.models.Weight
导入com.example.koinapplication.repo*
导入org.junit.After
导入org.junit.Before
导入org.junit.Test
导入org.junit.Assert*
导入org.koin.android.ext.koin.android上下文
导入org.koin.androidx.viewmodel.dsl.viewmodel
导入org.koin.core.context.startKoin
导入org.koin.core.context.stopKoin
导入org.koin.dsl.module
导入org.koin.java.KoinJavaComponent.inject
导入org.mockito.Mock
导入org.mockito.mockito
导入org.mockito.mockito注释
导入java.util*
类MainViewModelTest{
私有val mainViewModel:mainViewModel by inject(mainViewModel::class.java)
lateinit var obserData:观察者
专用val网络模块=模块{
工厂{AuthInterceptor()}
工厂{provideOkHttpClient(get())}
工厂{GranularErrorCallAdapterFactory()}
单个{ProvideNetworkClient(get(),get())}
单个{DataRepo(get())}
单个{NetworkRepo(get())}
}
@以前
趣味设置(){
initMocks(this)
斯塔特科因{
模块(arrayListOf(网络模块))
}
}
@之后
有趣的撕裂{
stopKoin()
}
@试验
有趣的猎犬{
mainViewModel.dogListLiveData.ObserveForRever{ObserverData}
mainViewModel.searchByBreed(“dal”)
Mockito.verify(obserdata).onChanged(mainViewModel.dogListLiveData.value)
}
}

请帮助我编写一个简单的测试来测试viewModel中的数据。非常感谢您的帮助。

将所有依赖项注入(DI)框架排除在您的ViewModel之外是一种很好的做法。这使得ViewModel独立,并简化了单元测试

视图模型

因此,您可以通过构造函数传递依赖项,而不是在ViewModel中注入依赖项:

class MainViewModel(
    private val dataRepo: dataRepo
) : ViewModel() {
    // ...
}
Koin模块

在Koin模块中,您可以定义依赖项并提供ViewModel的实例:

module {
  single { DataRepo(get()) }
  factory { MainViewModel(dataRepo = get())}
}
在活动或片段中,可以像往常一样注入ViewModel

单元测试

在您的
MainViewModelTest
中,Koin不需要任何代码:

class MainViewModelTest {
    private val dataRepo: DataRepo = mockk() // I used Mockk for mocking, but you can use any other mocking framework

    private val mainViewModel = MainViewModel(dataRepo) // your class under test

    @Test
    fun yourTest() {
        // prepare
        every { dataRepo.searchByBreed(...)} returns ...

        mainViewModel.searchByBreed(queryText = "...")

        // do assertions
    }
}
有了它,编写单元测试就简化了很多。您可以在以后与任何其他DI框架交换Koin,而无需接触ViewModel和测试


我希望这能对您有所帮助。

将所有依赖注入(DI)框架排除在ViewModel之外是一个很好的做法。这使得ViewModel独立,并简化了单元测试

视图模型

因此,您可以通过构造函数传递依赖项,而不是在ViewModel中注入依赖项:

class MainViewModel(
    private val dataRepo: dataRepo
) : ViewModel() {
    // ...
}
Koin模块

在Koin模块中,您可以定义依赖项并提供ViewModel的实例:

module {
  single { DataRepo(get()) }
  factory { MainViewModel(dataRepo = get())}
}
在活动或片段中,可以像往常一样注入ViewModel

单元测试

在您的
MainViewModelTest
中,Koin不需要任何代码:

class MainViewModelTest {
    private val dataRepo: DataRepo = mockk() // I used Mockk for mocking, but you can use any other mocking framework

    private val mainViewModel = MainViewModel(dataRepo) // your class under test

    @Test
    fun yourTest() {
        // prepare
        every { dataRepo.searchByBreed(...)} returns ...

        mainViewModel.searchByBreed(queryText = "...")

        // do assertions
    }
}
有了它,编写单元测试就简化了很多。您可以在以后与任何其他DI框架交换Koin,而无需接触ViewModel和测试

我希望这对你有点帮助