如何模拟 SQLiteOpenHelper
Posted
技术标签:
【中文标题】如何模拟 SQLiteOpenHelper【英文标题】:How to mock an 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>>>
...
我查看了其他几个类似的问题,但没有一个有帮助:
Error mocking Class which hold reference to SQLiteOpenHelper Mock final class in java using mockito library - 我在导入 PowerMock 时遇到了很多问题 How to mock a final class with mockito - 我已经添加了依赖项并使用mock-maker-inline
行创建了文件,正如答案中所建议的那样,我仍然得到同样的错误。我还尝试了建议 Mockito.mock(SomeMockableType.class,AdditionalAnswers.delegatesTo(someInstanceThatIsNotMockableOrSpyable))
的答案,但这给了我一个“没有足够的信息来推断类型变量 T”错误
Mock final class with Mockito 2
Mockito cannot mock/spy because : Final Class
Cannot mock/spy class java.util.Optional
【问题讨论】:
嗨,你看到我的回答了吗? 【参考方案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()
函数被正常调用。以上是关于如何模拟 SQLiteOpenHelper的主要内容,如果未能解决你的问题,请参考以下文章