我有一个视图模型,当我在活动中订阅它时,它仅会发出repo的值。我正在尝试对viewmodel进行单元测试(请参见下面的代码),但是由于repo为null,所以我正在获取NPE。如何进行单元测试?有可能吗?
class MainViewModel @ViewModelInject constructor(mainRepository: MainRepository) : ViewModel() {
val repo: LiveData<Resource<List<Repository>>> = mainRepository.getRepositories()
}
@RunWith(JUnit4::class)
class MainViewModelTest {
@Rule
@JvmField
val instantTaskExecutorRule = InstantTaskExecutorRule()
private val mainRepository = mock(MainRepository::class.java)
private lateinit var mainViewModel: MainViewModel
@Before
fun init() {
mainViewModel = MainViewModel(mainRepository)
}
@Test
fun testGetRepos() {
mainViewModel.repo.observeForever(mock()) /* NPE at this point as repo is null*/
verify(mainRepository).getRepositories()
}
}
答案 0 :(得分:0)
创建类似IMainRepository
的接口,让您的实际存储库类实现该接口
class MainRepository : IMainRepository
然后更改您的ViewModel构造函数以接受接口
class MainViewModel @ViewModelInject constructor(mainRepository: IMainRepository) : ViewModel()
然后创建一个实现接口以及应该执行的操作的Mock类
class MockMainRepository : IMainRepository
在测试中创建一个模拟类的新实例,并将其传递给ViewModel进行测试
private val mockMainRepository = MockMainRepository()
@Before
fun init() {
mainViewModel = MainViewModel(mainRepository)
}