我遵循MVP模式+ UseCases与模型层进行交互。这是我想要测试的Presenter中的一种方法:
fun loadPreviews() {
launch(UI) {
val items = previewsUseCase.getPreviews() // a suspending function
println("[method] UseCase items: $items")
println("[method] View call")
view.showPreviews(items)
}
}
我简单的BDD测试:
fun <T> givenSuspended(block: suspend () -> T) = BDDMockito.given(runBlocking { block() })
infix fun <T> BDDMockito.BDDMyOngoingStubbing<T>.willReturn(block: () -> T) = willReturn(block())
@Test
fun `load previews`() {
// UseCase and View are mocked in a `setUp` method
val items = listOf<PreviewItem>()
givenSuspended { previewsUseCase.getPreviews() } willReturn { items }
println("[test] before Presenter call")
runBlocking { presenter.loadPreviews() }
println("[test] after Presenter call")
println("[test] verify the View")
verify(view).showPreviews(items)
}
测试已经成功通过,但是日志中出现了一些奇怪的东西。我期望它应该是这样的:
- "[test] before Presenter call"
- "[method] UseCase items: []"
- "[method] View call"
- "[test] after Presenter call"
- "[test] verify the View"
- [test] before Presenter call
- [test] after Presenter call
- [test] verify the View
- [method] UseCase items: []
- [method] View call