Можно ли издеваться над модернизацией Отложенов Котлине? - PullRequest
0 голосов
/ 12 июня 2019

Мне интересно, смогу ли я сделать эту насмешку

Deferred<Response<Void>>

Я новичок в Котлине и на макете, но я безуспешно сделал это.

Пока я сделал это:

У меня есть клиентский интерфейс:

class MyClient {

@POST("/names")
    @FormUrlEncoded
    fun names(
        @Field("username") username: String
    ): Deferred<Response<Void>>

}

На моих тестах:

lateinit var myClient: MyClient

@Before
fun setUp() {
    client = mockk<MyClient>(relaxed = true)
    val response = mockk<Response<Void>>(relaxed = true)
    every { myClient.names(username) }.returns(mockedResponse)

}

Я нашел много сообщений об Response (например, Обработка пустого ответа с помощью дооснащения и rxjava 2.x ), но не совсем уверен, как обработать «Отложенный»

или кое-что об отсрочке (невозможно реализовать ответ на этот вопрос. async не может быть решено в моем проекте

При использовании сопрограмм kotlin, как мне выполнить модульное тестирование функции, которая вызывает функцию приостановки?

Возможно ли это? что мне не хватает?

Сервис, который я тестирую:

class MyService {

    fun doSomething(username: String) {
       myClient().names(username).await()
    }
}

Ответы [ 2 ]

2 голосов
/ 12 июня 2019

Вы пытаетесь вернуть Response<Void>, где потребуется Deferred<Response<Void>>.

Отсрочка - это, в основном, результат работы, которая еще не выполнена. Когда отложено isCompleted, результат готов. В вашем случае вы, скорее всего, захотите иметь Отложенный, который уже заполнен ответом.

Для создания отложенного, которое уже завершено с некоторым значением, вы можете использовать функцию CompletableDeferred(value: T).

Вот полный пример того, как вернуть завершенный отложенный из клиента макет.

interface GithubClient {
    @GET("users/{username}/repos")
    fun listRepos(@Path("username") username: String): Deferred<Response<Void>>
}

class RepoService(val client: GithubClient) {
    suspend fun doSomething(username: String): Response<Void> {
        return client.listRepos(username).await()
    }
}

class GithubClientTests {

    private lateinit var client: GithubClient

    @BeforeTest
    fun setUp() {
        // setup the mocked client
        client = mockk<GithubClient>(relaxed = true)
        val mockResponse = mockk<Response<Void>>(relaxed = true)
        every { client.listRepos(any()) } returns CompletableDeferred(mockResponse)
    }

    @Test
    fun testMockClient() = runBlocking<Unit> {
        // create the service with the mocked client
        val service = RepoService(client)
        val response = service.doSomething("octocat")

        // response is not successful, because we didn't specify any behavior for the mocked response
        assertFalse { response.isSuccessful }
    }
}
1 голос
/ 12 июня 2019

Я бы сказал, что вам не хватает ожидания:

@Before
fun setUp() {
    client = mockk<MyClient>(relaxed = true)
    val response = mockk<Response<Void>>(relaxed = true)
    every { myClient.names(username).await() /* this would return an response instead of deferred */ }.returns(mockedResponse)
}

Дайте мне знать, если это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...