Проверьте функцию приостановки с Matchers.anyObject () - PullRequest
0 голосов
/ 11 января 2019

Я пытаюсь добавить сопрограммы в наше приложение для Android, но я наткнулся на загвоздку с нашей насмешливой структурой. Мой интерфейс имеет функцию приостановки, например, так:

interface MyInterface {
  suspend fun makeNetworkCall(id: String?) : Response?
}

Вот как я пытаюсь убедиться, что код был выполнен в моем модульном тесте

runBlocking {
  verify(myInterface).makeNetworkCall(Matchers.anyObject())
}

Когда я делаю это, я получаю следующую ошибку

org.mockito.exceptions.misusing.InvalidUseOfMatchersException: 
Invalid use of argument matchers!
2 matchers expected, 1 recorded:
-> at     com.myproject.MyTest$testFunction$1.invokeSuspend(MyTest.kt:66)

This exception may occur if matchers are combined with raw values:
  //incorrect:
  someMethod(anyObject(), "raw String");
When using matchers, all arguments have to be provided by matchers.
For example:
  //correct:
  someMethod(anyObject(), eq("String by matcher"));

Есть ли другой способ проверить, вызывается ли соответствующий метод при использовании сопрограмм? Любая помощь будет оценена.

1 Ответ

0 голосов
/ 13 января 2019

Я пытался написать аналогичный тест, используя предоставленный вами код. Изначально я получил ту же ошибку, что и ваша. Однако когда я использовал mockito-core v2.23.4 , тесты были пройдены.

Вот быстрые шаги, которые вы можете попробовать:

  1. добавьте testCompile "org.mockito:mockito-core:2.23.4" в список зависимостей в файле build.gradle.

  2. Запустите тесты снова, и вы не должны получить похожую ошибку.

Поскольку Matchers.anyObject() устарело, я использовал ArgumentMatchers.any().

Ниже вы можете увидеть код клиента:

data class Response(val message: String)

interface MyInterface {
    suspend fun makeNetworkCall(id: String?) : Response?
}

class Client(val  myInterface: MyInterface) {
    suspend fun doSomething(id: String?) {
        myInterface.makeNetworkCall(id)
    }
}

Вот код теста:

class ClientTest {
    var myInterface: MyInterface = mock(MyInterface::class.java)

    lateinit var SUT: Client

    @Before
    fun setUp() {
        SUT = Client(myInterface)
    }

    @Test
    fun doSomething() = runBlocking<Unit> {
        // Act
        SUT.doSomething("123")
        // Verify
        Mockito.verify(myInterface).makeNetworkCall(ArgumentMatchers.any())
    }
}
...