gpt4 book ai didi

android - 对 WebView 的 WebViewClient 回调的 onPageStarted 和 onPageFinished 进行单元测试

转载 作者:行者123 更新时间:2023-12-04 18:55:23 26 4
gpt4 key购买 nike

Android Studio 3.5.1
Kotlin 1.3

我有以下方法,我正在尝试进行单元测试。使用 WebViewWebViewClient
我拥有的方法如下,需要进行单元测试:
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 ?: ""))
}
}
}

我采用了一个覆盖来自 WebViewClient 的一些回调的 webView。然后在 onPageStarted 或 onPageFinished 中调用一个 lambda 函数。

使用密封类来设置在 lambda 方法中传递的属性
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)
}

最佳答案

由于此单元测试的性质是异步的,而不是调用 webView.webViewClient.onPageStarted自己同步,你应该使用异步测试方法。这样,我们将 URL 传递给 WebView显示,然后等到 onPageStarted方法由 WebView 调用本身。

似乎在 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)
}

关于android - 对 WebView 的 WebViewClient 回调的 onPageStarted 和 onPageFinished 进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58457110/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com