【发布时间】:2016-11-20 19:19:10
【问题描述】:
我尝试使用 TDD 并得到以下代码:
public class ViewModel extends BaseObservable {
private final Subscription subscription;
public ReleasesViewModel(Observable<List<Data>> model) {
subscription = model.subscribe(this::setData);
}
public void destroy() { //method is not under test
subscription.unsubscribe();
}
public List<Data> getData() {
return data;
}
public void setData(List<Data> data) {
this.data = data;
}
}
我的测试:
public class ViewModelTest {
@Test
public void getData() {
BehaviorSubject<List<Data>> observable = BehaviorSubject.create();
ViewModel viewModel = new ViewModel(observable);
List<Data> dataList = Arrays.asList(mock(Data.class), mock(Data.class));
observable.onNext(dataList);
assertTrue(viewModel.getData().equals(dataList));
}
}
问题如下:
我应该验证subscription.unsubscribe(); 将被调用以释放资源,我可以将订阅包装在一些包装器中并通过构造函数注入依赖项,但我觉得我可以违反ViewModel 类的封装。经过大量的谷歌搜索,我没有找到任何关于在 TDD 实践中验证内存释放情况的线索。有人能给我指出这个案例的一些“最佳实践”吗?
【问题讨论】:
-
为什么在构造函数中传入
Subscription会违反封装-它已经是您的ViewModel类的成员?如果不是通过构造函数,它是如何被注入到你当前的代码中的? -
对不起,代码中的小错误。我从通过构造函数传递的“模型”获得“订阅”。
-
为什么
Subscription必须进入ViewModel内部? -
Subscription 在 "subscribe" 方法中声明了从 observable 模型中获取数据的逻辑,并通过 setter 将数据放到视图模型中。逻辑不能在视图模型之外实现。
-
assertTrue(viewModel.getData().equals(dataList));你测试你的 viewModel 类的内部数据处理。 this 违反了封装性。
标签: java unit-testing tdd