【问题标题】:how to make volley onResponse run in UnitTest thread如何让 volley onResponse 在 UnitTest 线程中运行
【发布时间】:2016-04-13 13:45:01
【问题描述】:

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

@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 在测试线程中的模型中创建领域对象,但凌空强制 onResponse 在 UIThread 上运行,这使得领域抛出异常 Realm access from incorrect thread. Realm objects can only be accessed on the thread they were created.

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

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

【问题讨论】:

    标签: java android multithreading android-volley realm


    【解决方案1】:

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

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

    希望对某人有所帮助

    【讨论】:

    • 谢谢兄弟。它为我工作。所以我可以在单独的线程中完成繁重的任务,所以我的 ui 不会被阻塞。你能给出处理程序类的详细解释。比如何时使用,为什么以及如何使用
    猜你喜欢
    • 2021-01-05
    • 2020-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-04
    • 1970-01-01
    • 1970-01-01
    • 2021-06-27
    相关资源
    最近更新 更多