Как обсуждалось в комментариях, проблема заключается в заметной инициализации.Вот более подробное объяснение.
Проблема заключается в следующем:
private val observable: Observable<SomeResponse> by lazy {
myApi.doSomething(SomeRequestBody())
.toObservable()
.share()
}
Переменная observable
инициализируется лениво, что означает, что пока мы используем один и тот же экземпляр репозитория, онИнициализируется только один раз.
Соответственно, в тестах у вас есть один экземпляр репозитория и несколько тестов.Это означает, что для всего тестового класса код внутри блока lazy
запускается один раз.Это означает, что myApi.doSomething(any())
запускается один раз.Это приводит к сбою, когда вы пытаетесь проверить более одного взаимодействия.
Причина, по которой он работает, когда вы заключаете его в defer
, заключается в том, что defer
создает наблюдаемое, которое будет выполняться каждый раз, когда подписчикподписывается (в вашем случае это немного сложнее из-за оператора share
, но идея та же).Как и раньше, defer
выполняется лениво и никогда больше не вызывается во время теста.То есть, если можно было проверить вызовы на defer
, то это будет тот же результат.Однако теперь каждый раз, когда наблюдаемая должна запускаться, она будет вызывать myApi.doSomething(any())
, и тест будет проходить.
Как вы уже поняли, это можно исправить, заключив вызов в defer
.Я думаю, что вы также можете просто удалить ленивую инициализацию.Возможно, даже использовать внедрение зависимостей, чтобы не лениво инициализировать объект в тестах, но сохранять его лениво инициализированным в производственном приложении.