【问题标题】:How to mock an SQLiteOpenHelper如何模拟 SQLiteOpenHelper
【发布时间】:2021-09-13 21:38:24
【问题描述】:

我正在尝试在仪器测试中模拟 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>>> {
        ...
    }
}

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

【问题讨论】:

  • 嗨,你看到我的回答了吗?

标签: kotlin mocking mockito instrumented-test


【解决方案1】:

我会做一个界面:

public interface ContainerHandler {
    MutableList<Pair<MutableList<String>, MutableList<Room>>> getTasks();
}

然后我让DatabaseHandler继承了这个接口,我用这个接口调用了Mockito的mock函数。

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

最后我将我的模拟注入到测试类中。

【讨论】:

  • 谢谢你的回答,我不知道如何制作类的接口。我尝试将类包装在接口中,但找不到函数getTasks()。我尝试创建一个单独的接口,然后在 DatabaseHandler 类中实现该接口,但这仍然给我和以前一样的错误
  • 我修改了我的答案以增加精度。对不起,我不在电脑后面?
  • 谢谢,我现在更明白了。这样做会停止错误,但 getTasks() 函数在测试应用程序时实际上并没有被模拟,因此 getTasks() 函数被正常调用。
猜你喜欢
  • 1970-01-01
  • 2014-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-12
  • 1970-01-01
  • 2021-10-22
相关资源
最近更新 更多