Модульное тестирование onPageStarted и onPageFinished обратных вызовов WebViewClient WebView - PullRequest
5 голосов
/ 18 октября 2019
Android Studio 3.5.1
Kotlin 1.3

У меня есть следующий метод, который я пытаюсь провести модульное тестирование. При этом используются WebView и WebViewClient

. У меня есть следующий метод, требующий модульного тестирования:

fun setPageStatus(webView: WebView?, pageStatus: (PageStatusResult) -> Unit) {
    webView?.webViewClient = object : WebViewClient() {

        override fun onPageStarted(view: WebView?, url: String?, favicon: Bitmap?) {
            pageStatus(PageStatusResult.PageStarted(url ?: "", favicon))
        }

        override fun onPageFinished(view: WebView?, url: String?) {
            pageStatus(PageStatusResult.PageFinished(url ?: ""))
        }
    }
}

Я беру webView, который переопределяет некоторый обратный вызов из WebViewClient,А затем вызывает лямбда-функцию в onPageStarted или onPageFinished.

Использует закрытый класс для установки свойств, которые передаются в лямбда-метод

sealed class PageStatusResult {
    data class PageFinished(val url: String) : PageStatusResult()
    data class PageStarted(val url: String, val favicon: Bitmap?) : PageStatusResult()
}

В модульном тесте я должен сделать что-токак это:

@Test
fun `should set the correct settings of the WebView`() {
    // Arrange the webView
    val webView = WebView(RuntimeEnvironment.application.baseContext)

    // Act by calling the setPageStatus
    webFragment.setPageStatus(webView) { pageStatusResult ->
        when(pageStatusResult) {
            is PageStarted -> {
            // Assert that the url is correct
                assertThat(pageStatusResult.url).isEqualToIgnoringCase("http://google.com")
            }
        }
    }

    // Call the onPageStarted on the webViewClient and and assert in the when statement
    webView.webViewClient.onPageStarted(webView, "http://google.com", null)
}

1 Ответ

5 голосов
/ 21 октября 2019

Поскольку этот модульный тест носит асинхронный характер, вместо того, чтобы самостоятельно вызывать webView.webViewClient.onPageStarted, следует использовать подход асинхронного тестирования. Таким образом, мы передаем URL для показа WebView, а затем ждем, пока сам метод WebView не вызовет метод onPageStarted.

Кажется, что лучший вариант для запуска асинхронных модульных тестовВ Android используется Awaitility .

build.gradle

dependencies {
    testImplementation 'org.awaitility:awaitility:4.0.1'
}

Класс модульного тестирования

@Test
fun `should set the correct settings of the WebView`() {

    val requestedUrl = "https://www.google.com"
    var resultUrl: String? = null

    // Arrange the webView
    val webView = WebView(RuntimeEnvironment.application.baseContext)

    // Act by calling the setPageStatus
    webFragment.setPageStatus(webView) { pageStatusResult ->
        when (pageStatusResult) {
            is PageStatusResult.PageStarted -> {
                resultUrl = pageStatusResult.url
            }
        }
    }

    // trying to load the "requestedUrl"
    webView.loadUrl(requestedUrl)

    // waiting until the "onPageStarted" is called
    await().until { resultUrl != null }

    // now check the equality of URLs
    assertThat(resultUrl).isEqualToIgnoringCase(requestedUrl)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...