我一直在网上搜索,但是找不到如何通过MVVM改进测试的方法。我知道有一个ViewModel与视图进行交互的想法,但我不知道如何使用MVVM编写良好的测试用例。我已经在Android中拥有以下ViewModel:
public class ViewModel extends BaseObservable {
private long countDownTime;
private MyCountDownTimer mCountDownTimer;
private final String TAG = getClass().getSimpleName();
@Bindable
public long getCountDownTime() {
return countDownTime;
}
public void setCountDownTime(long countDownTime) {
this.countDownTime = countDownTime;
notifyPropertyChanged((int) BR.countDownTime);
Log.d(TAG,"prime tick:"+countDownTime);
}
public void startCounting(Long milli){
mCountDownTimer.restartTimer(milli);
}
}
然后我有一个使用它的XML视图。我还有一个活动,实际上将XML绑定到该视图。这个活动看起来像这样:
public class MainActivity extends FragmentActivity {
CountdownBinder mCountdownBinder;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//setContentView(R.layout.activity_main);
mCountdownBinder = DataBindingUtil.setContentView(this, R.layout.activity_main);
//Lets reference our textview just for fun
mCountdownBinder.tvGreen.setText("initial text");
ViewModel viewModel = ViewModel.instance();
//now tell databinding about your viewModel below
mCountdownBinder.setViewModel(viewModel);
viewModel.startCounting(200000L);
}
}
现在我很困惑如何使测试变得更好。我已经阅读了相关资料,但我需要一个真实世界的例子。如果有必要,这段代码来自这篇博客。
显然,我可以更轻松地测试我的单元测试,对吗?在MVVM中,我只需要测试viewModel吗?主要需要测试什么?
CountDownTimerInterface
。它被模拟了。我正在测试 ViewModel 的行为(因为在这个例子中没有数据需要测试)。在你的例子中,你使用了MyCountDownTimer
,但是无法隔离地测试你的ViewModel
,因为每当你调用this.mCountDownTimer.something
时,你将会测试计数器而不是你的视图模型。我通过用接口替换具体的计数器实现来消除这种耦合,并且在测试期间将模拟这个接口(不使用真正的MyCountDownTimer
类)。 - Tseng