androidTest中的Android LiveData返回null

问题描述 投票:1回答:1

我正在运行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有关。

android kotlin android-room android-architecture-components android-livedata
1个回答
5
投票

经过一番挖掘后,我发现了Google通过GitHub上的Architecture Components示例提供的一种实用方法。

LiveDataTestUtil

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值。

© www.soinside.com 2019 - 2024. All rights reserved.