Реализация базы данных комнатного теста не найдена - PullRequest
0 голосов
/ 17 сентября 2018

Я тестирую DAO, и для этого мне нужно расширить его с помощью метода getAll(), которого нет в рабочем коде.

Единственный способ, с помощью которого я мог бы достичь этого, - это расширить реализацию моей базы данных с помощью расширенного DAO, содержащего getAll(), который мне нужен. Код выглядит следующим образом:

@Database(
                entities = [
                    OneEntity::class,
                    AnotherEntity::class
                ],
                version = 1,
                exportSchema = false
        )
        abstract class TestDatabase : RoomDatabase() {
            abstract fun getOneEntityDao(): OneEntityDao
            abstract fun getAnotherEntityDao(): TestAnotherEntityDao
        }

@Dao
abstract class TestAnotherEntityDao : AnotherEntityDao {

        @Query("""select * from $ANOTHER_ENTITY_TABLE""")
        abstract fun getAll() : Single<List<AnotherEntity>>
    }

Но когда я запускаю тесты, я получаю следующую ошибку:

`java.lang.RuntimeException: cannot find implementation for com.example.persistence.TestDatabase. TestDatabase_Impl does not exist`

Я уже проверил другие ответы, и единственное, что мне помогло, это переместить класс Testdatabase из тестового каталога, но я бы предпочел не иметь тестовый класс в моем рабочем коде. Есть идеи, почему это происходит и как это решить?

Ответы [ 2 ]

0 голосов
/ 18 сентября 2018

Спасибо за ваш ответ, Сэм!

По поводу вашего комментария

Have you included all the necessary TestDepenedencies for the test build to recognize Room content as well as the kapt and other necessary components?

-> Да, я сделал.Как я уже писал ранее, моя проблема не связана с kapt или каким-либо отсутствующим компонентом, поскольку помещение моего TestDatabase в другую папку из моего пути к тестовой папке работает и генерируется TestDatabase_Impl.

Я не являюсьextending generated code хотя, но заменяет мою базу данных на тестовую в памяти, которая предоставляет доступ к расширенным DAO с помощью методов тестирования, подобных getAll().Поскольку я не проверяю, как Room генерирует свои компоненты, я думаю, что достаточно сохранить замену базы данных, пока я храню DAO.

Как вы указали, у меня нет запроса getAll(), потому чтоОн мне не нужен в моем рабочем коде, и я не хотел создавать его для тестирования (чтобы проверить, работает ли вставка в базу данных, и, например, иметь возможность проверить сохраненные данные)

Пока я думаю, что я сделаю то, что вы предлагаете, и добавлю метод get в мои DAO, поскольку я не вижу другой «быстрой» альтернативы, но я буду помнить вашу идею использования ароматов и попробую ее вближайшее будущее.

Спасибо!

0 голосов
/ 17 сентября 2018

Включили ли вы все необходимые TestDepenedencies для тестовой сборки для распознавания содержимого комнаты, а также kapt и других необходимых компонентов? Я вижу, что вы пытаетесь сделать, лично не делал этого, но вы расширяете сгенерированный код, так что это кажется потенциально ненадежным.

По какой причине вы не просто добавляете "getAll" к стандартному классу DAO, а просто используете его только в тестах. Если вы беспокоитесь о том, чтобы другие прикоснулись к нему, вы всегда можете добавить к нему устаревший тег, но интерфейс, который предоставляет все это, может показаться лучшим местом для жизни с более надежным доступом.

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

@Query ( "SELECT * FROM firstTable UNION SELECT * FROM secondTable")
fun myCombiningQueryMethod() : MyEntityArray

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

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

Надеюсь, это поможет. счастливого кодирования.

...