ViewModel单元测试

时间:2020-10-22 18:23:37

标签: android kotlin junit

我有一个视图模型,当我在活动中订阅它时,它仅会发出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()
    }
}

1 个答案:

答案 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)
}