Лог и юнит тестирование в Android Kotlin - PullRequest
0 голосов
/ 22 февраля 2019

Я довольно новичок в Android-X и впервые использую Room.Кажется, это должно быть очень просто.все же у меня возникают некоторые проблемы с настройкой и тестированием.

У меня есть модульный тест, который не проходит

Ошибка: java.lang.AssertionError:

Ожидается: 1

Факт: ноль

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

class LogTest {
    //setup db
    private lateinit var logDao: LogDao
    private lateinit var testAppDatabase: AppDatabase

    @Before
    fun setUp() {
        val context = ApplicationProvider.getApplicationContext<Context>()
        testAppDatabase = Room.inMemoryDatabaseBuilder(context, AppDatabase::class.java).allowMainThreadQueries().build()
        logDao = testAppDatabase.getLogDao()
    }

    @After
    @Throws(IOException::class)
    fun closeDb() {
        testAppDatabase.close()
    }

    @Test
    @Throws(Exception::class)
    fun `log Database is Empty on Start`() {
        assertEquals(null, logDao.getAllLogs().value?.size)

        val testLog = LogModel("Test", "Test", 0, 0, 0.0, 0.0)
        logDao.insertAll(testLog)
        assertEquals(1, logDao.getAllLogs().value?.size)
    }
}

@Entity(tableName = "Logs")
data class LogModel (
    @ColumnInfo(name = "tag") var tag: String,
    @ColumnInfo(name = "msg") var msg: String,
    @ColumnInfo(name = "device_id") var deviceID: Int,
    @ColumnInfo(name = "user_id") var userID: Int,
    @ColumnInfo(name = "latitude") var latitude: Double,
    @ColumnInfo(name = "longitude") var longitude: Double
) {
    @PrimaryKey(autoGenerate = true) var id: Long? = null
    //@ColumnInfo(name = "timestamp") var timestamp: String? = null
}


@Dao
interface LogDao {
    @Query("SELECT * FROM Logs")
    fun getAllLogs(): LiveData<List<LogModel>>

    @Insert(onConflict = OnConflictStrategy.REPLACE)
    fun insertAll(vararg logs: LogModel)
}


@Database(entities = [LogModel::class], version = 1)
abstract class AppDatabase : RoomDatabase() {
    //Database to be initialised here
    abstract fun getLogDao(): LogDao

    companion object {
        @Volatile
        private var INSTANCE: AppDatabase? = null

        fun getDatabase(context: Context): AppDatabase {
            val tempInstance = INSTANCE
            if (tempInstance != null) {
                return tempInstance
            }
            synchronized(this) {
                val instance = Room.databaseBuilder(
                    context.applicationContext,
                    AppDatabase::class.java,
                    "My_Database"
                ).build()
                INSTANCE = instance
                return instance
            }
        }
    }
}

1 Ответ

0 голосов
/ 22 февраля 2019

я думаю, что вы должны блокировать работающий поток, пока операция вставки не закончит свою работу

вы можете использовать runBlocking{} для сопрограмм около logDao.insertAll(testLog)

или попробоватьпозвонить Thread.sleep(someMillisec) после завершения вставки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...