首页 > 解决方案 > 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 的正确方法是什么?

标签: androiddesign-patternsmvvmjunitviewmodel

解决方案


推荐阅读