Я пытаюсь смоделировать мою базу данных комнат с помощью 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) '
Вы не можете использовать сопоставления аргументов вне проверки или заглушки. ++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++
Я не совсем горжусь этим решением, но оно работает. Вместо того, чтобы передавать полный объект базы данных в конструктор моего класса Repository, я создал другой переопределенный конструктор, который принимает дао напрямую. Таким образом, я мог просто издеваться над дао без необходимости создавать какую-то странную цепочку функций базы данных, которая вообще не работала бы.
При тестировании вы можете создать базу данных вашей комнаты как базу данных в памяти. Таким образом, все сохраненное будет длиться до тех пор, пока процесс не будет закрыт. Так что ничего не будет сохраняться, идеально подходит для испытаний!
Код: Room.inMemoryDatabaseBuilder(context, TestDatabase::class.java).build()