我正在使用协程对拉动进行异步调用以刷新,如下所示:
class DataFragment : Fragment(), SwipeRefreshLayout.OnRefreshListener {
// other functions here
override fun onRefresh() {
loadDataAsync()
}
private fun loadDataAsync() = async(UI) {
swipeRefreshLayout?.isRefreshing = true
progressLayout?.showContent()
val data = async(CommonPool) {
service?.getData() // suspending function
}.await()
when {
data == null -> showError()
data.isEmpty() -> progressLayout?.showEmpty(null, parentActivity?.getString(R.string.no_data), null)
else -> {
dataAdapter?.updateData(data)
dataAdapter?.notifyDataSetChanged()
progressLayout?.showContent()
}
}
swipeRefreshLayout?.isRefreshing = false
}
}
当我实际将它放在设备上时,这里的一切都很好。我的错误、空、数据状态都处理的很好,性能也不错。但是,我也在尝试使用 Spek 对其进行单元测试。我的 Spek 测试如下所示:
@RunWith(JUnitPlatform::class)
class DataFragmentTest : Spek({
describe("The DataFragment") {
var uut: DataFragment? = null
beforeEachTest {
uut = DataFragment()
}
// test other functions
describe("when onRefresh") {
beforeEachTest {
uut?.swipeRefreshLayout = mock()
uut?.onRefresh()
}
it("sets swipeRefreshLayout.isRefreshing to true") {
verify(uut?.swipeRefreshLayout)?.isRefreshing = true // says no interaction with mock
}
}
}
}
测试失败,因为它说没有与uut?.swipeRefreshLayout
模拟交互。经过一些试验,这似乎是因为我通过async(UI)
. 如果我让它只是一个常规的异步,我可以让测试通过,但是应用程序崩溃了,因为我正在修改 UI 线程之外的视图。
任何想法为什么会发生这种情况?另外,如果有人对此有任何更好的建议,这将使其更具可测试性,我会全力以赴。
谢谢。
编辑:忘了提到我也尝试将verify
and包装uut?.onRefresh()
在 a 中runBlocking
,但我仍然没有成功。