Модульные тесты для обратных вызовов с использованием Junit - PullRequest
0 голосов
/ 27 февраля 2019

Я пытаюсь написать несколько примеров модульного теста для класса с функциями, у которых в качестве аргументов используются обратные вызовы (см. Код ниже)

class NetworkApi(private val url: String) {

    fun getToken(listener: (String) -> Unit) {
        Thread(Runnable {
            Thread.sleep(2000)
            if (TextUtils.isEmpty(url)) listener("")
            else listener("Dummy token")
        }).start()
    }
}

, а пример модульного теста

@RunWith(AndroidJUnit4::class)
class NetworkApiTest {

    var networkApi: NetworkApi? = null

    @Test
    fun testEmptyToken() {
        networkApi = NetworkApi("")
        networkApi?.getToken {
            Assert.assertThat(it, isEmptyOrNullString())
        }
    }

}

И всякий раз, когда я запускаю этот тестовый пример, я все время получаю успех, независимо от того, какие значения я отправляю.Я знаю, что я не делаю точный путь.Может кто-нибудь, пожалуйста, помогите мне написать модульные тесты для классов в JUnit.

1 Ответ

0 голосов
/ 27 февраля 2019

Проблема в том, что тест завершается до вызова обратного вызова, и assert находится в неправильном потоке.Вы должны скопировать результат обратного вызова обратно в основной поток.Используйте CompletableFuture.Если вы хотите не пройти тест по истечении определенного периода времени, вы можете использовать метод get со значением времени ожидания:

@RunWith(AndroidJUnit4::class)
class NetworkApiTest {
    var networkApi: NetworkApi? = null

    @Test
    fun testEmptyToken() {
        val future = CompletableFuture<String>()
        networkApi = NetworkApi("")
        networkApi?.getToken {
            future.complete(it)
        }
        val result = future.get(3,TimeUnit.SECONDS)
        Assert.assertThat(it, isEmptyOrNullString())
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...