首页 > 解决方案 > 在 android 中创建 ViewModel doubles 以使用 espresso 单独测试片段

问题描述

我正在使用 Java 中的 android。

我们的目标是单独测试我们应用程序的一个片段。

我们的问题是我们需要设置一个视图模型 double 来创建有意义和值得测试的片段状态。

特别是,为我们的片段建模的模型视图依赖于另一个视图模型。

在我们的研究中,我们了解到视图模型存储在一些特定的视图模型存储对象中,有没有办法以传统的方式从 espresso 操作这个存储位置而不是 hacky 方式?也许通过与 FragmentScenario 对象的一些交互?

该图说明了我们的情况。

在此处输入图像描述

我正在附加我的片段代码以阐明我注入视图模型的方式:

public class CornerDetectionFragment extends Fragment {
    private CornerDetectionViewModel cornerDetectionViewModel;
    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        cornerDetectionViewModel =
                ViewModelProviders.of(
                        this,
                        new CornerDetectionViewModelFactory(getActivity())
                ).get(CornerDetectionViewModel.class);
        View root =inflater.inflate(R.layout.fragment_corner_detection, container, false);
        ((TextView)root.findViewById(R.id.textView_relative_cirrent_location)).setText(
                "1/"+cornerDetectionViewModel.getNumberOfCornerDetectedCaptures().getValue()
        );
        return inflater.inflate(R.layout.fragment_corner_detection, container, false);
    }
/*...*/
}

还有视图模型工厂的代码:

public class CornerDetectionViewModelFactory implements ViewModelProvider.Factory {
    FragmentActivity activity;

    public CornerDetectionViewModelFactory(FragmentActivity activity) {
        this.activity = activity;
    }

    @NonNull
    @Override
    public <T extends ViewModel> T create(@NonNull Class<T> modelClass) {
        return (T) ViewModelProviders.of(
                activity,
                new InitialFactory())
                .get(CornerDetectionViewModel.class
                );
    }

    private class InitialFactory implements ViewModelProvider.Factory{
        @NonNull
        @Override
        public <T extends ViewModel> T create(@NonNull Class<T> modelClass) {
            return (T)new CornerDetectionViewModel(
                    new ImageProcessingFactory().create(),
                    new ResolveAnswersViewModelFactory(activity)
                            .create(ResolveAnswersViewModel.class)
            );
        }
    }
}

谢谢。

标签: javaandroidandroid-espressoandroid-viewmodel

解决方案


推荐阅读