ViewModel 是 Android Jetpack 库中的一个组件,它的主要目的是以生命周期感知的方式存储和管理 UI 相关的数据。ViewModel 的设计使得数据可以在配置更改(如屏幕旋转)时保持不变,并且它的生命周期比 Activity 或 Fragment 更长。
ViewModel
类。单元测试 ViewModel 主要是为了确保其逻辑的正确性。以下是进行 ViewModel 单元测试的一些步骤和示例代码:
首先,确保你的项目中已经添加了必要的测试依赖,例如 JUnit 和 Mockito。
dependencies {
testImplementation 'junit:junit:4.13.2'
testImplementation 'org.mockito:mockito-core:3.12.4'
}
假设我们有一个简单的 ViewModel,它负责处理用户登录逻辑。
public class LoginViewModel extends ViewModel {
private MutableLiveData<Boolean> loginResult = new MutableLiveData<>();
public LiveData<Boolean> getLoginResult() {
return loginResult;
}
public void login(String username, String password) {
// 模拟登录逻辑
boolean success = "admin".equals(username) && "password".equals(password);
loginResult.postValue(success);
}
}
使用 JUnit 和 Mockito 来编写单元测试。
import static org.mockito.Mockito.*;
import static org.junit.Assert.*;
import androidx.arch.core.executor.testing.InstantTaskExecutorRule;
import androidx.lifecycle.Observer;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
@RunWith(MockitoJUnitRunner.class)
public class LoginViewModelTest {
@Rule
public InstantTaskExecutorRule instantTaskExecutorRule = new InstantTaskExecutorRule();
private LoginViewModel viewModel;
@Mock
private Observer<Boolean> observer;
@Before
public void setUp() {
viewModel = new LoginViewModel();
viewModel.getLoginResult().observeForever(observer);
}
@Test
public void testLoginSuccess() {
viewModel.login("admin", "password");
verify(observer).onChanged(true);
}
@Test
public void testLoginFailure() {
viewModel.login("wrongUser", "wrongPass");
verify(observer).onChanged(false);
}
}
如果在单元测试中遇到问题,比如 ViewModel 中的数据没有按预期更新,可能的原因包括:
解决方法:
InstantTaskExecutorRule
确保 LiveData 的更新在主线程上执行。通过以上步骤和方法,可以有效地对 ViewModel 进行单元测试,确保其功能的正确性和稳定性。