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();
    }
}