问题描述
我试图在插桩测试中模拟 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
解决方法
我为 DatabaseHandler 创建了一个接口(如 ContainerHandler),然后使用该接口调用 Mockito 的模拟函数。
val mock = mock(ContainerHandler::class.java)
`when`(mock.getTasks()).thenThrow()