关于rxJava单元测试的一些疑问

yangTal09 2016-11-08 11:07:17
最近在学习单元测试,再看别人代码对rxJava进行单元测试时有一些问题想不通,想问问这里的大神。
首先先上代码:
public class UseCaseTest {

private UseCaseTestClass useCase;

@Mock private ThreadExecutor mockThreadExecutor;
@Mock private PostExecutionThread mockPostExecutionThread;

@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
this.useCase = new UseCaseTestClass(mockThreadExecutor, mockPostExecutionThread);
}

@Test
@SuppressWarnings("unchecked")
public void testBuildUseCaseObservableReturnCorrectResult() {
TestSubscriber<Integer> testSubscriber = new TestSubscriber<>();
TestScheduler testScheduler = new TestScheduler();
given(mockPostExecutionThread.getScheduler()).willReturn(testScheduler);

useCase.execute(testSubscriber);

assertThat(testSubscriber.getOnNextEvents().size(), is(0));
}

@Test
public void testSubscriptionWhenExecutingUseCase() {
TestSubscriber<Integer> testSubscriber = new TestSubscriber<>();

useCase.execute(testSubscriber);
useCase.unsubscribe();

assertThat(testSubscriber.isUnsubscribed(), is(true));
}

private static class UseCaseTestClass extends UseCase {

protected UseCaseTestClass(
ThreadExecutor threadExecutor,
PostExecutionThread postExecutionThread) {
super(threadExecutor, postExecutionThread);
}

@Override protected Observable buildUseCaseObservable() {
return Observable.empty();
}

@Override public void execute(Subscriber UseCaseSubscriber) {
super.execute(UseCaseSubscriber);
}
}
}

这个是android-CleanArchitecture里面对useCase的单元测试,标红的地方是不太理解的:
1、测试的observable是empty()返回的,也就是说只会发送onCompleted()事件,因此assertThat(testSubscriber.getOnNextEvents().size(), is(0));我可以理解,但后来我测试了一下,将observable改成Observable.just(1,2,3),发现测试仍然通过....那么这样测试有什么意义呢?
2、UseCase的构造函数需要传入两个与线程相关的类,一个是ThreadExecutor ,另一个是PostExecutionThread ,这两个都由mockito mock出来了,那为什么只需要对PostExecutionThread进行特殊处理,使之由TestScheduler 代替?而且,我试着重写了TestSubscriber的onNext()方法,并没有执行。
所以我的猜想是,由于给observable配置的线程都是mock或者测试的,所以,实际上observable并没有将item发送出去,这也就是为什么不管observable是空还是just(1,2,3),assertThat(testSubscriber.getOnNextEvents().size(), is(0))通过,testSubscriber.assertCompleted();不通过的原因,那这样的话,搞这个单元测试到底有什么意义呢?而且我后来测试过了,即便不调用given(mockPostExecutionThread.getScheduler()).willReturn(testScheduler);测试仍然可以通过,那为啥还要这样写呢?
求大神赐教,不胜感激!
...全文
111 回复 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

80,471

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧