我正在为我的应用程序进行单元测试 我的单元测试类有这个方法
@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/