Realm在Android Espresso测试中失败

时间:2018-06-13 17:32:48

标签: android realm android-espresso android-testing

我有一个带有Realm数据库的Android应用程序,我正在尝试使用Espresso进行测试。我在模拟器上运行测试。我有3个测试,如果我单独运行它们就会通过。但是,如果我立即运行所有这些,我有一个由此引起的异常:

java.lang.IllegalStateException: This Realm instance has already been closed, 
making it unusable.

这是一个完整的测试代码:

@LargeTest
@RunWith(AndroidJUnit4::class)
class CategoryListActivityTest {

    @JvmField
    @Rule
    var activityTestRule = ActivityTestRule<CategoryListActivity>(CategoryListActivity::class.java)

    @Test
    fun clickOnCategoryListItemOpensCategoryActivity() {
        onView(withId(R.id.recyclerview_category_list))
                .perform(RecyclerViewActions.actionOnItemAtPosition<CategoryListAdapter.Holder>(1, click()))

        onView(withId(R.id.recyclerview_word_list))
                .check(matches(isDisplayed()))
    }

    @Test
    fun clickOnToTrainButtonOpensTrainingActivity() {
        onView(withText(R.string.to_training_button))
                .perform(click())

        onView(withId(R.id.swipeView))
                .check(matches(isDisplayed()))
    }

    @Test
    fun clickOnToTrainToolbarMenuButtonOpensTrainingActivity() {
        openActionBarOverflowOrOptionsMenu(getInstrumentation().targetContext)

        onView(withText(R.string.to_training_menu_item))
                .perform(click())

        onView(withId(R.id.swipeView))
                .check(matches(isDisplayed()))
    }
}

这是一个完整的堆栈跟踪:

java.lang.Exception: Can't get all categories!
at com.funbuilders.englishapp.persisted.dao.CategoryDao.getAll(CategoryDao.kt:29)
at com.funbuilders.englishapp.ui.category.CategoryListViewModel.<init>(CategoryListViewModel.kt:14)
at com.funbuilders.englishapp.ui.category.CategoryListViewModelFactory.create(CategoryListViewModelFactory.kt:14)
at android.arch.lifecycle.ViewModelProvider.get(ViewModelProvider.java:134)
at android.arch.lifecycle.ViewModelProvider.get(ViewModelProvider.java:102)
at com.funbuilders.englishapp.ui.category.CategoryListActivity.onCreate(CategoryListActivity.kt:51)
at android.app.Activity.performCreate(Activity.java:5933)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105)
at android.support.test.runner.MonitoringInstrumentation.callActivityOnCreate(MonitoringInstrumentation.java:624)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2251)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360)
at android.app.ActivityThread.access$800(ActivityThread.java:144)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5221)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
Caused by: java.lang.IllegalStateException: This Realm instance has already been closed, making it unusable.
at io.realm.BaseRealm.checkIfValid(BaseRealm.java:433)
at io.realm.Realm.where(Realm.java:1342)
at com.funbuilders.englishapp.persisted.dao.CategoryDao.getAll(CategoryDao.kt:27)
... 19 more


java.lang.RuntimeException: Unable to start activity ComponentInfo{com.funbuilders.englishapp/com.funbuilders.englishapp.ui.category.CategoryListActivity}: java.lang.Exception: Can't get all categories!
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2298)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360)
at android.app.ActivityThread.access$800(ActivityThread.java:144)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5221)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
Caused by: java.lang.Exception: Can't get all categories!
at com.funbuilders.englishapp.persisted.dao.CategoryDao.getAll(CategoryDao.kt:29)
at com.funbuilders.englishapp.ui.category.CategoryListViewModel.<init>(CategoryListViewModel.kt:14)
at com.funbuilders.englishapp.ui.category.CategoryListViewModelFactory.create(CategoryListViewModelFactory.kt:14)
at android.arch.lifecycle.ViewModelProvider.get(ViewModelProvider.java:134)
at android.arch.lifecycle.ViewModelProvider.get(ViewModelProvider.java:102)
at com.funbuilders.englishapp.ui.category.CategoryListActivity.onCreate(CategoryListActivity.kt:51)
at android.app.Activity.performCreate(Activity.java:5933)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105)
at android.support.test.runner.MonitoringInstrumentation.callActivityOnCreate(MonitoringInstrumentation.java:624)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2251)
... 10 more
Caused by: java.lang.IllegalStateException: This Realm instance has already been closed, making it unusable.
at io.realm.BaseRealm.checkIfValid(BaseRealm.java:433)
at io.realm.Realm.where(Realm.java:1342)
at com.funbuilders.englishapp.persisted.dao.CategoryDao.getAll(CategoryDao.kt:27)
... 19 more

Test running failed: Instrumentation run failed due to 'java.lang.IllegalStateException'

我在网上发现了这样的问题,但在这种情况下,人们没有正确使用Realm并在应用程序运行时获得异常。在我的情况下,我在应用程序runtume中没有问题。只是在Espresso测试中。
我知道每个Realm实例应该在使用后关闭。但在这种情况下,我不会显式初始化任何Realm实例。 这是解决这个问题的方法吗?

0 个答案:

没有答案