TDD 和资源释放
TDD and resources freeing
我尝试使用 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
class。经过大量谷歌搜索后,我没有找到任何关于在 TDD 实践中验证内存释放的线索。对于这种情况,有人可以指出一些 "best practices" 吗?
maybe you have some example of proper mvvm testing
这就是我使用 Mockito 所做的(只是我的偏好,任何其他 Mocking Framework 都可以...):
public class ViewModelTest {
@Rule
public MockitoRule rule = MockitoJUnit.rule();
@Mock
BehaviorSubject<List<Data>> observable;
@Mock
Subscription subscription;
List<Data> data = Collections.emptyList();
@Test
public void Constructor_CalledWithObservable_subcribesSetDataMethod() {
// prepare
when(model.subscribe()).thenRetun(subscription);
// act
ViewModel viewModel = new ViewModel(observable);
// assert
verify(observable).subscribe(ViewModel::setData);
}
@Test
public void destroy_unsubscribes() {
// prepare
when(model.subscribe()).thenRetun(subscription);
ViewModel viewModel = new ViewModel(observable);
// act
viewModel.destroy();
// assert
verify(subscription).unsubscribe();
}
}
我尝试使用 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
class。经过大量谷歌搜索后,我没有找到任何关于在 TDD 实践中验证内存释放的线索。对于这种情况,有人可以指出一些 "best practices" 吗?
maybe you have some example of proper mvvm testing
这就是我使用 Mockito 所做的(只是我的偏好,任何其他 Mocking Framework 都可以...):
public class ViewModelTest {
@Rule
public MockitoRule rule = MockitoJUnit.rule();
@Mock
BehaviorSubject<List<Data>> observable;
@Mock
Subscription subscription;
List<Data> data = Collections.emptyList();
@Test
public void Constructor_CalledWithObservable_subcribesSetDataMethod() {
// prepare
when(model.subscribe()).thenRetun(subscription);
// act
ViewModel viewModel = new ViewModel(observable);
// assert
verify(observable).subscribe(ViewModel::setData);
}
@Test
public void destroy_unsubscribes() {
// prepare
when(model.subscribe()).thenRetun(subscription);
ViewModel viewModel = new ViewModel(observable);
// act
viewModel.destroy();
// assert
verify(subscription).unsubscribe();
}
}