Pro*_*001 2 android kotlin android-room android-livedata android-architecture-components
我正在运行androidTest检测测试,我有一个方法,使用Room从DAO对象返回LiveData.
我正在调用这样的方法:
val animal = roomDatabase.animalsDao().getAnimal(1)
animal.observeForever(mMockObserver)
assertNotNull(animal.value)
我用Mockito嘲笑观察者:
@Mock
private lateinit var mMockObserver = Observer<Animal>
这应该返回包含动物ID为1的LiveData实例,但它为null.我的理解是,为了让LiveData返回任何东西,必须有一个观察者.我错误地设置了吗?
注意:如果我在DAO中更改getAnimal()的签名以直接返回Animal,而不是LiveData,那么它可以工作,所以我知道它与LiveData有关.
经过一番挖掘后,我发现了Google通过GitHub上的Architecture Components示例提供的一种实用方法.
public class LiveDataTestUtil {
    /**
     * Get the value from a LiveData object. We're waiting for LiveData to emit, for 2 seconds.
     * Once we got a notification via onChanged, we stop observing.
     */
    public static <T> T getValue(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];
    }
}
这允许您传递LiveData实例并获取它所拥有的值.
更新: 
您还可以使用InstantTaskExecutorRule与observeForever结合来测试您的LiveData.在Kotlin中,您设置@get:Rule val instantTaskExecutorRule = InstantTaskExecutorRule()在测试类的顶部以确保同步处理LiveData,然后在测试用例myLiveData.observeForever { /* Do something when event emitted */ }中获取LiveData值.
| 归档时间: | 
 | 
| 查看次数: | 1411 次 | 
| 最近记录: |