如何模拟 SQLiteOpenHelper

问题描述

我试图在插桩测试中模拟 sqliteOpenHelper 类,因此每当任何片段试图从数据库获取信息时,它都会返回一个通用结果。但是,我不断收到错误消息:

org.mockito.exceptions.base.MockitoException:无法模拟/间谍类 com.example.cleaningschedule.helpers.DatabaseHandler Mockito 不能 模拟/间谍因为:

  • 最后一节课 在 com.example.cleaningschedule.TodoListInstrumentedTest.oneTask(TodoListInstrumentedTest.kt:81)

测试类是:

@RunWith(AndroidJUnit4::class)
class TodoListInstrumentedTest {

    @Rule
    @JvmField var activityRule: ActivityTestRule<MainActivity> = ActivityTestRule(MainActivity::class.java)

    private fun getActivity() = activityRule.activity

    @After
    fun tearDown() {
        InstrumentationRegistry.getInstrumentation().getTargetContext().deleteDatabase("TaskDatabase")
    }

    @Test
    fun oneTask() {
        val mock = mock(DatabaseHandler::class.java)
        `when`(mock.getTasks()).thenThrow()

        onView(withId(R.id.taskName)).check(matches(isdisplayed()))
    }
}

我试图模拟的课程是:

class DatabaseHandler(context: Context): sqliteOpenHelper(context,DATABASE_NAME,null,DATABASE_VERSION) {
    companion object {
    private const val DATABASE_VERSION = 5
    private const val DATABASE_NAME = "TaskDatabase"
        ...
    }

    override fun onCreate(db: sqliteDatabase?) {
        ...
    }

    override fun onUpgrade(db: sqliteDatabase?,oldVersion: Int,newVersion: Int) {
        ...
    }    
    fun getTasks(): MutableList<Pair<MutableList<String>,MutableList<Room>>> {
        ...
    }
}

我查看了其他几个类似的问题,但都没有帮助:

解决方法

我为 DatabaseHandler 创建了一个接口(如 ContainerHandler),然后使用该接口调用 Mockito 的模拟函数。

val mock = mock(ContainerHandler::class.java)
    `when`(mock.getTasks()).thenThrow()