英文:
Creating ViewModel doubles in android for testing fragments in isolation with espresso
问题
我在使用Java开发Android应用。
我们的目标是在隔离环境中测试我们应用的一个片段(Fragment)。
我们的问题是,我们需要设置一个视图模型(view-model)的双重实例,以便创建有意义且值得测试的片段状态。
特别地,模拟我们的片段的模型视图(model-view)依赖于另一个视图模型。
在我们的研究中,我们了解到视图模型存储在特定的视图模型存储对象中,是否有一种通过Espresso在常规方式而非繁琐方式来操纵此存储位置的方法?也许可以通过与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 root;
}
/*...*/
}
还有视图模型工厂的代码:
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)
);
}
}
}
谢谢。
英文:
I'm working with android in Java.
Our goal is to test a fragment of our app in isolation.
Our problem is that we need to setup a view-model double to in order to create meaningful and test worthy fragment state.
In particular, the model-view that models our fragment depends on another view model.
In our research, we learned that view-models are stored in some specific view-model-store object, is there a way to manipulate this storage location from espresso in a conventional not to hacky way? via maybe some interaction with a FragmentScenrario object?
The figure ilustrates our situation.
I'm appending my fragment code to clarify the way I'm injecting the view-model:
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);
}
/*...*/
}
And also the code of the view-model factory:
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)
);
}
}
}
Thanks.
专注分享java语言的经验与见解,让所有开发者获益!
评论