首页 > 解决方案 > 是否可以在不添加新方法进行验证的情况下对 onSubscribe 中发生的在 onComplete/onError 中撤消的列表添加/删除进行单元测试?

问题描述

我有一个看起来像下面的完成,我正在尝试用 Mockito 进行测试。

completable
        .doOnSubscribe {
            list.add(item)
        }.doOnError {
            list.remove(item)
            //do other stuff
        }.doOnComplete {
            list.remove(item)
            //do other stuff
        }

该列表管理可能在其他地方(另一个片段或活动)访问的状态,以指示有多少项目仍在处理或它们是否全部完成。

除了创建 add() 和 remove() 方法,然后调用它们并使用 spy 确认它被调用之外,我无法弄清楚如何直接对其进行单元测试,因为订阅它会立即添加和删除它。

这似乎有点矫枉过正,所以我想知道我是否错过了触发 doOnSubscribe 部分的方法?

标签: mockitorx-java2

解决方案


正如 Bob 建议的那样,模拟 ajava.util.List并验证它:

import static org.mockito.Mockito.*;

import java.util.List;

import org.junit.Test;

import io.reactivex.subjects.CompletableSubject;

public class TestMockitoCalls {

    @Test
    public void test() {
        @SuppressWarnings("unchecked")
        List<Integer> list = mock(List.class);

        CompletableSubject source = CompletableSubject.create();

        source.doOnSubscribe(v -> list.add(1))
        .doOnError(e -> list.remove(1))
        .doOnComplete(() -> list.remove(1))
        .subscribe();

        source.onComplete();

        verify(list).add(1);
        verify(list).remove(1);
        verifyNoMoreInteractions(list);
    }
}

推荐阅读