gpt4 book ai didi

android - 单元测试室和 LiveData

转载 作者:IT老高 更新时间:2023-10-28 13:26:41 26 4
gpt4 key购买 nike

我目前正在使用新的 Android Architecture Components 开发应用程序.具体来说,我正在实现一个房间数据库,它在其中一个查询上返回一个 LiveData 对象。插入和查询按预期工作,但是我在使用单元测试测试查询方法时遇到问题。

这是我要测试的 DAO:

NotificationDao.kt

@Dao
interface NotificationDao {

@Insert
fun insertNotifications(vararg notifications: Notification): List<Long>

@Query("SELECT * FROM notifications")
fun getNotifications(): LiveData<List<Notification>>
}

如您所知,如果我将其更改为 ListCursor 或基本上我得到了预期的结果,即插入数据库中的数据。

问题是下面的测试总是会失败,因为 LiveData 对象的 value 总是 null:

NotificationDaoTest.kt

lateinit var db: SosafeDatabase
lateinit var notificationDao: NotificationDao

@Before
fun setUp() {
val context = InstrumentationRegistry.getTargetContext()
db = Room.inMemoryDatabaseBuilder(context, SosafeDatabase::class.java).build()
notificationDao = db.notificationDao()
}

@After
@Throws(IOException::class)
fun tearDown() {
db.close()
}

@Test
fun getNotifications_IfNotificationsInserted_ReturnsAListOfNotifications() {
val NUMBER_OF_NOTIFICATIONS = 5
val notifications = Array(NUMBER_OF_NOTIFICATIONS, { i -> createTestNotification(i) })
notificationDao.insertNotifications(*notifications)

val liveData = notificationDao.getNotifications()
val queriedNotifications = liveData.value
if (queriedNotifications != null) {
assertEquals(queriedNotifications.size, NUMBER_OF_NOTIFICATIONS)
} else {
fail()
}
}

private fun createTestNotification(id: Int): Notification {
//method omitted for brevity
}

所以问题是:有谁知道执行涉及 LiveData 对象的单元测试的更好方法?

最佳答案

当有观察者时,Room 会懒惰地计算 LiveData 的值。

您可以查看sample app .

它使用 getValue添加观察者以获取值的实用方法:

public static <T> T getOrAwaitValue(final LiveData<T> liveData) throws InterruptedException {
final Object[] data = new Object[1];
final CountDownLatch latch = new CountDownLatch(1);
Observer<T> observer = new Observer<T>() {
@Override
public void onChanged(@Nullable T o) {
data[0] = o;
latch.countDown();
liveData.removeObserver(this);
}
};
liveData.observeForever(observer);
latch.await(2, TimeUnit.SECONDS);
//noinspection unchecked
return (T) data[0];
}

使用 kotlin 更好,您可以将其作为扩展功能:)。

关于android - 单元测试室和 LiveData,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44270688/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com