Есть ли способ правильно смоделировать базу данных комнаты?

1

Я пытаюсь смоделировать мою базу данных комнат с помощью Mockito, чтобы я мог проверить сложные алгоритмы в моем репозитории. Я получаю множество различных ошибок, независимо от того, в каком направлении я вступаю.

Сначала я попробовал просто Mocking всего объекта базы данных, это создало исключение нулевого интерфейса.

Чтобы решить эту проблему, я использовал конструктор статических объектов Room. (Это инструментальный unit тест, поэтому у меня есть доступ к основным зависимостям Android)

import org.mockito.*
import org.mockito.Mockito.'when'
import org.mockito.Mockito.anyDouble

class BasicReposTest {


@get:Rule
val activityRule = ActivityTestRule(MainActivity::class.java)

@get:Rule
val mockitoRule: MockitoRule = MockitoJUnit.rule()

@Mock
lateinit var mockedDb : AppDatabase

@Before
fun setTheDatabase() {
    val context = ApplicationProvider.getApplicationContext<Context>()

    mockedDb = Room.inMemoryDatabaseBuilder(
        context, AppDatabase::class.java).build()

}

@Test
fun doesReposRequestBounds() {

    'when'(mockedDb.momentDao().findMomentsByBound(ArgumentMatchers.anyDouble(), ArgumentMatchers.anyDouble(),
        anyDouble(), ArgumentMatchers.anyDouble())).thenReturn(momentList)

    //Request first set of moments
    repos.queryMapMoments(bounds, 20.toFloat())
    //Do we get a list of moments sent to livedata?
    assertTrue(mappedMoments.value!!.size >= momentList.size)

    val list : List<Moment> = mappedMoments.value!!

    for (value in list) {
        System.out.println("D " + "RequestMomentsFromDatabaseByBoundsTest    " + "MID = " + value.mId )
    }
}

При этом я получаю исключение для неправильно используемого совпадения... ++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++

org.mockito.exceptions.misusing.InvalidUseOfMatchersException: здесь обнаружен неулокальный или неправильно использованный сопоставитель аргументов:

→ по адресу com.example.barrechat108.RepositoryTests.doesReposRequestBounds(RepositoryTests.kt: 138) → по адресу com.example.barrechat108.RepositoryTests.doesReposRequestBounds(RepositoryTests.kt: 138) (RepositoryTests.kt: 139) → at com.example.barrechat108.RepositoryTests.doesReposRequestBounds(RepositoryTests.kt: 139) '

Вы не можете использовать сопоставления аргументов вне проверки или заглушки. ++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++

Теги:
kotlin
unit-testing
android-room
mockito

2 ответа

0

Я не совсем горжусь этим решением, но оно работает. Вместо того, чтобы передавать полный объект базы данных в конструктор моего класса Repository, я создал другой переопределенный конструктор, который принимает дао напрямую. Таким образом, я мог просто издеваться над дао без необходимости создавать какую-то странную цепочку функций базы данных, которая вообще не работала бы.

0

При тестировании вы можете создать базу данных вашей комнаты как базу данных в памяти. Таким образом, все сохраненное будет длиться до тех пор, пока процесс не будет закрыт. Так что ничего не будет сохраняться, идеально подходит для испытаний!

Код: Room.inMemoryDatabaseBuilder(context, TestDatabase::class.java).build()

  • 0
    Я сделал это точно, но это все еще не работало: /

Ещё вопросы

Сообщество Overcoder
Наверх
Меню