Реализация базы данных тестов комнаты не найдена

Я тестирую 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 из тестового каталога, но я бы предпочел не иметь тестового класса в своем производственном коде. Любые идеи, почему это происходит и как это решить?


person Eduardo    schedule 17.09.2018    source источник
comment
В итоге я запросил базу данных для Cursor и проверил, содержит ли она ожидаемый объект данных. Нет необходимости в тестовом коде в производственном коде (нет TestDatabase нет тестового запроса в DAO)   -  person Eduardo    schedule 18.09.2018


Ответы (2)


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

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

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

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

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

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

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

person Sam    schedule 17.09.2018
comment
Спасибо! Смотрите мой ответ (это было слишком долго, чтобы поместить его в комментарий) - person Eduardo; 18.09.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, поскольку я не вижу другой «быстрой» альтернативы, но я буду иметь в виду вашу идею использования ароматов и попробую это в ближайшем будущем.

Спасибо!

person Eduardo    schedule 18.09.2018
comment
Имеет смысл. Похоже, ароматизаторы могут быть вашим лучшим средством, чем. Удачи, и если вы найдете что-то более креативное, поделитесь :). - person Sam; 18.09.2018