Тестирование LiveData с помощью PowerMockRunner

Мои локальные модульные тесты все время используют LiveData. Обычно, когда вы пытаетесь установить значение MutableLiveData, вы получаете

java.lang.RuntimeException: Method getMainLooper in android.os.Looper not mocked.

потому что локальная JVM не имеет доступа к платформе Android. Я исправил это, используя это:

@get:Rule
val rule = InstantTaskExecutorRule()

Все было хорошо, пока мне не пришлось использовать PowerMockito для имитации статического метода из библиотеки Google Play. Поскольку я добавил

@RunWith(PowerMockRunner::class)
@PrepareForTest(Tasks::class)

над объявлением моего тестового класса я снова начал получать эту ошибку Looper not mocked. Я использовал это правило раньше с MockitoJUnitRunner, и все было хорошо.


person Michał Powłoka    schedule 17.08.2018    source источник
comment
Примерно так: stackoverflow.com/questions/43356314/   -  person Faysal Ahmed    schedule 17.08.2018


Ответы (2)


Немного поздно для ответа, но столкнулся с той же проблемой и решил ее!

Чтобы использовать PowerMock и InstantTaskExecutorRule, вам необходимо добавить следующую аннотацию:

@RunWith(PowerMockRunner::class)
@PowerMockRunnerDelegate(MockitoJUnitRunner::class) //this line allows you to use the powermock runner and mockito runner
@PrepareForTest(UnderTestClass::class)
class UnderTestClassTest {

    @get:Rule
    var instantExecutorRule = InstantTaskExecutorRule()
person Rainmaker    schedule 27.12.2018
comment
Я бы не стал этого делать. Спасибо! - person Michał Powłoka; 28.12.2018
comment
Эй. ты спасатель. - person Vijay; 31.07.2019
comment
образец находится в Котлине, какую ошибку вы получаете - person Rainmaker; 03.12.2019
comment
Ваше решение сработало, добавив следующую строку. @PowerMockRunnerDelegate (MockitoJUnitRunner :: class) // эта строка позволяет использовать бегун powermock и бегун mockito Сделал это все работает - person Kartikey Kumar Srivastava; 02.05.2021

Не нужно беспокоиться, так как оказывается, что вы все еще можете использовать этот метод для проверки своих наблюдателей LiveData!

Сначала добавьте эту зависимость в build.gradle файл вашего модуля:

testImplementation 'android.arch.core:core-testing:1.0.0-alpha3'

Убедитесь, что вы используете ту же версию, что и остальные зависимости android.arch. *!

Затем в тестовом классе, где вам нужно вызвать setValue() и подтвердить, добавьте это поле:

@Rule
public TestRule rule = new InstantTaskExecutorRule();

Для Котлина

@get:Rule
var rule: TestRule = InstantTaskExecutorRule()

За кулисами это обходит проверку основного потока и немедленно запускает любые задачи в вашем тестовом потоке, обеспечивая немедленные и предсказуемые вызовы и, следовательно, утверждения.

Этот ответ уже есть здесь.

person Faysal Ahmed    schedule 17.08.2018
comment
Я уже пользуюсь этим Правилом. Проблема в том, что поскольку я использую PowerMockRunner, это правило не действует. Я снова начал получать это исключение, как будто я вообще не буду использовать это правило. Он работал нормально, пока я использовал обычный MockitoJUnitRunner, но в этом тесте мне нужно использовать именно его. - person Michał Powłoka; 17.08.2018