中介器实时数据源在测试期间不会更新



我有一个MediatorLiveData存在于我的视图模型中,它应该对模型层的LiveData排放做出反应,在必要时采取行动并更新其侦听器。出于某种原因,源在测试期间不会更新。

class MyViewModel(private val repository: Repository) : ViewModel() {
    private val liveData1: LiveData<String> = repository.getString1()
    private val livedata2: LiveData<String> = repository.getString2()
    val currentState = MediatorLiveData<MyState>
    init {
        currentState.addSource(liveData1) {
            it?.let { string1 ->
                doSomething()
                currentState.postValue(String1Updated)
            }
        }
        currentState.addSource(liveData2) {
            it?.let { string1 ->
                doSomethingElse()
                currentState.postValue(String2Updated)
            }
        }
    }
}

嘲笑观察者和存储库方法似乎无济于事。 从不调用doSomething(),并且当前状态不会更新为 String1Update。

@RunWith(MockitoJUnitRunner::class)
class MyViewModelTest {
    @get:Rule instantTaskExecutorRule = InstantTaskExecutorRule()
    @Mock lateinit var mockRepository: Repository
    @Mock lateinit var mockLiveData1: MutableLiveData<String>
    @Mock lateinit var mockLiveData2: MutableLiveData<String>
    @Mock lateinit var mockStateObserver: Observer<MyState>
    lateinit var myViewModel: MyViewModel
    @Before
    fun setup() {
        whenever(mockRepository.getLiveData1()).thenReturn(mockLiveData1)
        whenever(mockRepository.getLiveData2()).thenReturn(mockLiveData2)
        myViewModel = myViewModel(mockRepository)
    }
    @Test
    fun `Does something when live data 1 is updated`() {
        myViewModel.state.observeForever(mockStateObserver)
        mockLiveData1.postValue("hello world")
        verify(mockStateObserver).onChanged(String1Updated)
    }
}

即使将观察员直接放在调解员的mockLiveData1mockLiveData2上,也不会导致调解员中的来源更新。

MediatorLiveData需要一个活跃的观察者才能触发其on "onChange"方法。

看看这个答案。

正如我的帖子中所展示的,我使用模拟LiveData作为中介数据的来源。这些应该只是LiveData实现。

@Before
fun setup() {
    liveData1 = MutableLiveData()
    whenever(mockRepository.getLiveData1()).thenReturn(liveData1)
    liveData1.postValue("initial value")
    myViewModel.state.observeForever(mockStateObserver)
}

mockLiveData1mockLiveData2可能不应该被嘲笑。

然后它就会起作用。

(你也可以试试@Spy,我总是忘记它的作用。但我认为您应该将它们实例化为常规的可变实时数据而不是@Mock

相关内容

  • 没有找到相关文章

最新更新