如何测试RxJava中map操作符回调内的transform方法调用?
验证RxJava map操作符中transform方法调用的解决方案
问题背景
有开发者需要验证以下业务代码中,RxJava map操作符回调里的userEntityDataMapper.transform()方法是否被正确调用:
@Override public Observable<List<User>> getUsers() { UserDataStore userDataStore = userDataStoreFactory.createCloudDataStore(); return userDataStore.getUsers().map(userEntityDataMapper::transform); }
他最初编写的测试代码无法完成验证,代码如下:
@Test public void testGetUsersHappyCase() { List<UserEntity> userEntityList = new ArrayList<>(); userEntityList.add(new UserEntity()); given(mockUserDataStore.getUsers()).willReturn(Observable.just(userEntityList)); List<User> userList = new ArrayList<>(); given(mockUserEntityDataMapper.transform(userEntityList)).willReturn(userList); given(mockUserDataStoreFactory.createCloudDataStore()).willReturn(mockUserDataStore); Observable observable = userDataRepository.getUsers(); verify(mockUserDataStoreFactory).createCloudDataStore(); verify(mockUserDataStore).getUsers(); TestObserver<List<UserEntity>> testObserver = new TestObserver<>(); TestScheduler testScheduler = new TestScheduler(); observable.subscribeOn(testScheduler).observeOn(testScheduler).subscribeWith(testObserver); verify(mockUserEntityDataMapper).transform(any(List.class)); }
该开发者在Stack Overflow及相关论坛查找了诸多类似问题,但未找到适配的解决方案。
解决方案
通过调整测试代码,使用RxJava内置的test()方法来订阅Observable,即可确保数据流被完整触发,从而正确验证transform方法的调用。修正后的测试代码如下:
@Test public void testGetUsersHappyCase() { List<UserEntity> userEntityList = new ArrayList<>(); userEntityList.add(new UserEntity()); given(mockUserDataStore.getUsers()).willReturn(Observable.just(userEntityList)); List<User> userList = new ArrayList<>(); given(mockUserEntityDataMapper.transform(userEntityList)).willReturn(userList); userDataRepository.getUsers().test().assertNoErrors(); verify(mockUserDataStoreFactory).createCloudDataStore(); verify(mockUserDataStore).getUsers(); verify(mockUserEntityDataMapper).transform(userEntityList); }
关键说明
- 原测试代码的问题在于使用了
TestScheduler但未触发调度(比如调用testScheduler.triggerActions()),导致Observable的数据流没有实际执行,map操作符中的transform方法自然不会被调用,最终断言失败。 - 使用
test()方法会自动创建TestObserver并完成订阅,同时直接触发Observable的数据流执行,确保所有操作符的回调逻辑都被执行,后续的verify断言就能正确验证方法调用情况。
内容的提问来源于stack exchange,提问作者Dharmendra
相关产品推荐
相关产品推荐

