(RxJava2)Single.blockingGet()在单元测试中不起作用

时间:2018-10-17 19:00:30

标签: android unit-testing rx-java2 rx-android

我为返回Rx Single的交互器方法创建了单元测试。 Single必须异步返回用户bean。 我尝试为Single调用blockingGet(),但由于测试不断进行,因此bean不返回。我检查了断点,发现该bean已创建,但没有返回。 我也尝试为Single调用test()。values()。get(0),但其中不包含bean。断点没有调用。

我可以理解这是什么问题。我需要帮助来解决它。

交互器中的方法。

    public Single<UserBean> verifyUser() {
    String jwt = getJWTToken();
    if (TextUtils.isEmpty(jwt)) {
        return Single.error(new EmptyJWTException());
    }
    if (!checkConnectionInfo()) {
        return Single.error(new NotNetworkConnectedException());
    }
    return Single.create((SingleOnSubscribe<UserBean>) emitter -> {
        UserBean resultBean = mAuthenticationRepository.verifyUserByJwt(jwt);
        if (resultBean != null && !TextUtils.isEmpty(resultBean.getId())) {
            emitter.onSuccess(resultBean);
        } else {
            emitter.onError(new RequestToServerException());
        }
    })
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread());
}

单元测试。

@RunWith(MockitoJUnitRunner.class)
public class AuthenticationInteractorTest {

@Mock
private Application mApplication;
@Mock
private IAuthenticationRepository mAuthenticationRepository;
@Mock
private SharedPreferences mSharedPreferences;
@Mock
private ConnectivityManager mConnectivityManager;
@Mock
private NetworkInfo mNetworkInfo;
private AuthenticationInteractor mInteractor;

@Before
public void setUp() {
    mInteractor = new AuthenticationInteractor(mAuthenticationRepository, mApplication);
}

@Test
public void verifyUserTest() {
    String jwt = "jwt";
    UserBean userBean = createUserBean();
    when(mApplication.getSharedPreferences(AuthenticationInteractor.SHARED_PREFS, Context.MODE_PRIVATE)).thenReturn(mSharedPreferences);
    when(mSharedPreferences.getString(AuthenticationInteractor.TOKEN_KEY, null)).thenReturn(jwt);
    when((ConnectivityManager) mApplication.getSystemService(Context.CONNECTIVITY_SERVICE)).thenReturn(mConnectivityManager);
    when(mConnectivityManager.getActiveNetworkInfo()).thenReturn(mNetworkInfo);
    when(mNetworkInfo.isConnected()).thenReturn(true);
    when(mAuthenticationRepository.verifyUserByJwt(jwt)).thenReturn(userBean);
    UserBean bean = mInteractor.verifyUser().blockingGet();
    assertEquals(userBean, bean);
}

private UserBean createUserBean() {
    UserBean userBean = new UserBean();
    userBean.setMetaId("1539762652616:940c29e6d716:15:jmt4z02l:11182");
    userBean.setJWT("eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6Im1hZ2F6b240aWtAeWFuZGV4LnJ1IiwiY3MiOiI1OWEwNDA2MTgzNDAwMDAwIiwiaWF0IjoxNTM5NzYyNjUyLCJhdWQiOiIqLmxvY2FsaG9zdCIsImlzcyI6Im1zLXVzZXJzIn0.2AcuLZjR_-GyWAFen7JczJ5-W37zQWGbnRRErGLqDEY");
    userBean.setId("test@test.test");
    userBean.setType("user");
    userBean.setUserName("test@test.test");
    userBean.setCreated(1535970916310L);
    userBean.setLatestResult("1539676474685");
    userBean.setOnDiet("No");
    return userBean;
}

}

1 个答案:

答案 0 :(得分:0)

似乎您没有覆盖正在使用的调度程序。如果不这样做,几乎可以肯定会在尝试使用AndroidSchedulers.mainThread

进行订阅时收到以下错误
  

方法getMainLooper   android.os.Looper没有被嘲笑

要解决此问题,您可以创建一个TestRule,该规则可让您指定测试的计划程序,例如以下将用Schedulers.io重设AndroidSchedulers.mainThreadSchedulers.trampoline

public class RxSchedulersRule implements TestRule {
    @Override
    public Statement apply(final Statement base, Description description) {
        return new Statement() {
            @Override
            public void evaluate() throws Throwable {
                RxAndroidPlugins.reset();
                RxJavaPlugins.reset();

                RxAndroidPlugins.setInitMainThreadSchedulerHandler(s -> Schedulers.trampoline());
                RxJavaPlugins.setIoSchedulerHandler(s -> Schedulers.trampoline());

                try {
                    base.evaluate();
                } finally {
                    RxAndroidPlugins.reset();
                    RxJavaPlugins.reset();
                }
            }
        };
    }
}

要在测试中使用,则需要声明规则

@Rule public final RxSchedulersRule schedulersRule = new RxSchedulersRule();
相关问题