Есть ли способ правильно смоделировать базу данных комнаты? - PullRequest
1 голос
/ 08 апреля 2019

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

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

Чтобы решить эту проблему, я использовал построитель статических объектов в Комнате. (Это инструментальный модульный тест, поэтому у меня есть доступ к основным зависимостям 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: Обнаружено неуместное или неправильно использованное сопоставление аргументов:

-> at com.example.barrechat108.RepositoryTests.doesReposRequestBounds (RepositoryTests.kt: 138) -> at com.example.barrechat108.RepositoryTests.doesReposRequestBounds (RepositoryTests.kt: 138) -> at com.example.barrechat108.RepositoryTests.doesReposRequestBounds (RepositoryTests.kt: 139) -> at com.example.barrechat108.RepositoryTests.doesReposRequestBounds (RepositoryTests.kt: 139) `

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

Ответы [ 2 ]

2 голосов
/ 08 апреля 2019

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

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

0 голосов
/ 09 апреля 2019

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

...