Android 视图模型单元测试

Android 视图模型单元测试,android,kotlin,junit,Android,Kotlin,Junit,我有一个viewmodel,当我在活动中订阅它时,它只会发出回购的值。我试图对viewmodel进行单元测试(见下面的代码),但我得到了NPE,因为repo为null。如何进行单元测试?可能吗 class MainViewModel @ViewModelInject constructor(mainRepository: MainRepository) : ViewModel() { val repo: LiveData<Resource<List<Repositor

我有一个viewmodel,当我在活动中订阅它时,它只会发出回购的值。我试图对viewmodel进行单元测试(见下面的代码),但我得到了NPE,因为repo为null。如何进行单元测试?可能吗

class MainViewModel @ViewModelInject constructor(mainRepository: MainRepository) : ViewModel() {

    val repo: LiveData<Resource<List<Repository>>> = mainRepository.getRepositories()
    
}

创建一个类似于
IMainRepository
的接口,让您的实际存储库类实现它

class MainRepository : IMainRepository
然后更改ViewModel构造函数以接受该接口

class MainViewModel @ViewModelInject constructor(mainRepository: IMainRepository) : ViewModel()
然后创建一个实现接口的模拟类,以及它应该做什么

class MockMainRepository : IMainRepository
在测试中,创建模拟类的新实例,并将其传递给ViewModel进行测试

private val mockMainRepository = MockMainRepository()

@Before
fun init() {
   mainViewModel = MainViewModel(mainRepository)
}

谢谢你的回答。我不确定MockMain存储库应该做什么。我的意思是,我的MainRepository类只有一个方法getRepositories,它使用NetworkBoundResource类返回LiveData。我是否必须创建一个方法,在不使用NetworkBoundResource所有逻辑的情况下返回LiveData?是的,模拟类只是将虚拟数据返回到ViewModel,而ViewModel会将其视为来自real RepositoryOK的实际数据,现在我得到org.mockito.exceptions.misusing.NotAMockException:传递给verify()的参数的类型是MockMainRepository,而不是mock!
private val mockMainRepository = MockMainRepository()

@Before
fun init() {
   mainViewModel = MainViewModel(mainRepository)
}