我为返回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;
}
}
答案 0 :(得分:0)
似乎您没有覆盖正在使用的调度程序。如果不这样做,几乎可以肯定会在尝试使用AndroidSchedulers.mainThread
方法getMainLooper android.os.Looper没有被嘲笑
要解决此问题,您可以创建一个TestRule,该规则可让您指定测试的计划程序,例如以下将用Schedulers.io
重设AndroidSchedulers.mainThread
和Schedulers.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();