android - MVVM Android 应用中的 JUnit 测试 ViewModel
问题描述
我正在开发一个遵循 MVVM 模式的 Android 应用程序以从 API 下载数据。数据作为 Json 数组返回并显示在 RecyclerView 中。我想为 ViewModel 编写一个 JUnit 测试,其代码如下。ItemResponse
是一个包含 API 接收到的 Json 对象列表的类,每个对象由名为 Item 的类(模型)的对象表示。
public class ItemViewModel extends AndroidViewModel {
private LiveData<ItemResponse> itemsResponseLiveData;
public ItemViewModel(@NonNull Application application) {
super(application);
}
public void init() {
ItemsRepository itemsRepository = new ItemsRepository();
itemsResponseLiveData = itemsRepository.getItemsResponseLiveData();
}
public LiveData<ItemResponse> getItemsResponseLiveData() {
return itemsResponseLiveData;
}
public void setItemsResponseLiveData(LiveData<ItemResponse> itemsResponseLiveData) {
this.itemsResponseLiveData = itemsResponseLiveData;
}
}
这是项目响应代码:
public class ItemResponse {
ArrayList<Item> items = null;
public ItemResponse(ArrayList<Item> items) {
setItems(items);
}
public ArrayList<Item> getItems() {
return items;
}
public void setItems(ArrayList<Item> items) {
this.items = items;
}
}
该视图由一个片段管理,该片段使用以下代码将自己注册为观察者。
ItemViewModel viewModel = new ViewModelProvider(this).get(ItemViewModel.class);
viewModel.init();
viewModel.getItemsResponseLiveData().observe(this, new Observer<ItemResponse>() {
@Override
public void onChanged(ItemResponse itemResponse) {
if (itemResponse != null) {
// An adapter is updated
}
}
});
我想通过实例化 ViewHolder、注册观察者并提供一些虚拟数据来测试 ViewHolder,通过将通知项与添加到 LiveData 中的项进行比较来检查通知是否有效。我写了下面的类,但是当我运行它时,我viewModel = new ViewModelProvider
在行中得到一个 NullPointerException attempt to invoke virtual method 'androidx.lifecycle.ViewModel androidx.lifecycle.ViewModelStore.get(java.lang.String)' on a null object reference
。
@RunWith(AndroidJUnit4.class)
public class ServiceAvailabilityTest extends TestCase implements ViewModelStoreOwner, LifecycleOwner {
private ItemViewModel viewModel;
@Before
@Override
public void setUp() throws Exception {
super.setUp();
viewModel = new ViewModelProvider(this).get(ItemViewModel.class);
viewModel.init();
viewModel.getItemsResponseLiveData().observe(this, new Observer<ItemResponse>() {
@Override
public void onChanged(ItemResponse itemResponse) {
if (itemResponse != null) {
assertEquals(itemResponse.getItems().get(0).getName(), name);
}
}
});
}
@Test
public void testItemViewModel() {
Item item = new Item("name", "description", "test1", "test1", "test3");
ArrayList<Item> listItems = new ArrayList<>();
listItems.add(item);
ItemResponse itemResponse = new ItemResponse(listItems);
MutableLiveData<ItemResponse> itemsResponseMutableLiveData = new MutableLiveData<>();
itemsResponseMutableLiveData.postValue(itemResponse);
viewModel.setItemsResponseLiveData(itemsResponseMutableLiveData);
}
@NonNull
@Override
public ViewModelStore getViewModelStore() {
return null;
}
@NonNull
@Override
public Lifecycle getLifecycle() {
return null;
}
}
测试 ViewModel 的正确方法是什么?
解决方案
推荐阅读
- java - 如何将此 CSV 文件的内容存储到对象数组中
- javascript - 想要指定列中的每三张图片都有特定的大小
- node.js - 在 IIS 服务器上发布反应网站时出错 [在本地工作]
- list - Flutter / Dart:地图列表与小部件列表?哪个更好?
- c - K&R c书练习5-10
- html - 在 json 数组上切换过滤器的正确方法是什么?
- java - @Configuration @AutoConfigureAfter @Autowired
- python - 参数转换错误无法正常输出解析
- apache-kafka - 安装 CMAK 的问题 - kafka manager
- firebase - 以编程方式获取 Firebase Admin SDK 私钥