Как издеваться над SQLiteOpenHelper

avatar
T. Green
1 июля 2021 в 20:33
87
1
0

Я пытаюсь имитировать класс 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>>> {
        ...
    }
}

Я рассмотрел несколько других подобных вопросов, но ни один из них не помог:

Источник
Julien Gavard
3 июля 2021 в 04:03
0

Привет, ты видел мой ответ?

Ответы (1)

avatar
Julien Gavard
2 июля 2021 в 06:23
0

Я сделаю интерфейс :

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

Затем я заставил DatabaseHandler наследовать этот интерфейс, я вызываю фиктивную функцию Mockito с интерфейсом.

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

И, наконец, я добавляю свой макет в тестируемый класс.

T. Green
3 июля 2021 в 09:17
0

Спасибо за ответ, я не уверен, как сделать интерфейс класса. Я попытался обернуть класс в интерфейс, но не могу найти функцию getTasks(). Я попытался создать отдельный интерфейс, а затем реализовать интерфейс в классе DatabaseHandler, но это по-прежнему дает ту же ошибку, что и раньше.

Julien Gavard
3 июля 2021 в 09:27
0

Я изменяю свой ответ, чтобы добавить больше точности. Извините, я не сижу за компьютером 😀

T. Green
3 июля 2021 в 19:01
0

Спасибо, теперь я понимаю это лучше. Это останавливает ошибку, но функция getTasks() на самом деле не подвергается насмешкам при тестировании приложения, поэтому функция getTasks() вызывается как обычно.