java - 如何让volley onResponse在UnitTest线程中运行

标签 java android multithreading android-volley realm

我正在为我的应用程序进行单元测试 我的单元测试类有这个方法

@Before
public void initialize() {
    mContext = InstrumentationRegistry.getTargetContext();
    RealmConfiguration realmConfiguration = new RealmConfiguration.Builder(mContext).name("realmTest").inMemory().build();
    Realm.setDefaultConfiguration(realmConfiguration);
    mWorkoutsModel = new WorkoutsModel(mContext);
    mRealm = Realm.getInstance(realmConfiguration);
    mWorkoutsModel.registerListener(this);
}

@Test
public void getWorkouts() throws Exception {
    mWorkoutsModel.onStart();

    mLock.await();
    mWorkoutsModel.onStop();

}

@After
public void deInitialize() {
    mWorkoutsModel.unRegisterListener();
    mRealm.close();
}

和我的模型

@Override
public void onStart() {

    mRealm = Realm.getDefaultInstance();
        getDataFromApi();
}

private boolean getDataFromApi() {
    Constants.AllAPIs.ALLWorkouts allWorkouts = new Constants.AllAPIs.ALLWorkouts();
    if (Permissions.isInternetConnectionExist(mContext)) {
        mApiHandler.downLoadDataFromApi(AllWorkouts.class, allWorkouts.getBaseUrl(),
                new APIHandler.StringResponseHandler<AllWorkouts>() {
                    @Override
                    public void onResponse(AllWorkouts response) {
                            insertWorkouts(response.getWorkouts());
                },
                new APIHandler.ErrorResponseHandler() {
                    @Override
                    public void onErrorResponse(VolleyError error) {

                    }
                }, TAG);

        return true;
    } else {
        return false;
    }
}
private void insertWorkouts(final List<Workout> workouts) {
    mCurrentInsertTransaction = mRealm.executeTransactionAsync(new Realm.Transaction() {
        @Override
        public void execute(Realm bgRealm) {
            bgRealm.copyToRealmOrUpdate(workouts);
        }
    }, new Realm.Transaction.OnSuccess() {
        @Override
        public void onSuccess() {
        }
    });
}

我的问题是unittest调用onStart,它在测试线程的模型中创建 Realm 对象,但 Volley 强制onResponse在UIThread上运行,这使得 Realm 抛出异常从不正确的线程访问 Realm 。 Realm 对象只能在创建它们的线程上访问。

代码正常运行完美,但在测试中失败

有人遇到同样的问题或者可以解决吗?

最佳答案

我通过在处理程序中运行测试解决了我的问题

new Handler(mContext.getMainLooper()).post(new Runnable() {
        @Override
        public void run() {
            try {
                mWorkoutsModel.onStart();
                mLock.await();
                mWorkoutsModel.onStop();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    });

希望对大家有帮助

关于java - 如何让volley onResponse在UnitTest线程中运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36600369/

相关文章:

java - 如何在 android 中找到内部(默认手机存储)和外部存储(可移动 sd 卡)?

android - 如何为 Spinner 的下拉菜单设置不同的主题?

c# - 在 ASP.NET 中处理数据时如何更新进度消息?

Java:如何启动一些异步操作并从其他线程更新用户界面?

java - 如何创建看起来 TextView 比它大的列表项?

java - Robotium 脚本中的当前日期验证

java - Android - 让用户浏览内部存储文件

java - 如何删除列表中的一堆对象

Java Gson - 帮我解析我的 JSON

javascript - Node.js 多线程 : What are Worker threads and how does it work?