【发布时间】:2018-06-24 14:55:03
【问题描述】:
我正在为一个安卓应用程序编写一个 ViewModel,它应该实现并启动一个 CountDownTimer 以便不时更新一些 UI。
我最近开始练习 TDD,我想知道我应该做出哪些架构决策才能使 ViewModel 可测试(我希望测试能够快速运行,而不依赖于真正的计时机制)。 我无法将 CountDownTimer 作为依赖项提供,因为它是在 ViewModel 本身中实现的抽象类,所以我“不知道”要给出什么实现。
一般来说,在使用具有严格约束的框架和不可测试的框架代码时,编写测试的最佳实践是什么?
这是我目前拥有的代码。如何让它可测试?
import android.arch.lifecycle.ViewModel;
import android.os.CountDownTimer;
class MyViewModel extends ViewModel {
private MyView myView;
public void init(MyView myView) {
this.myView = myView;
new CountDownTimer(0, 1000) {
@Override
public void onTick(long l) {
myView.updateUi(l);
}
@Override
public void onFinish() {
myView.updateUiFinished();
}
}.start();
}
public interface MyView {
void updateUi(long l);
void updateUiFinished();
}
}
【问题讨论】:
-
不要模拟/测试你不拥有的代码。将它们视为应封装在您控制的抽象后面的第 3 方依赖项。在可测试性方面,这将具有更大的灵活性。您当前的代码与
CountDownTimer紧密耦合,因此在测试时更难以控制所需的行为。
标签: android unit-testing testing dependencies tdd