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