我试图用测试覆盖主持人。演示者用例作为数据源。用例的执行方法具有以下结构:fun execute(params: TInput? = null, onNext: (TOutput) -> Unit, onError: (Throwable) -> Unit)
。
我的问题是我该如何模拟onNext和onError的发射?
这是我的PresenterTest:
class AssignmentsPresenterTest : UnitTest() {
@Mock lateinit var dataRepository: IDataRepository
@Mock lateinit var viewState: AssignmentsView
lateinit var execute: ExecuteUseCase
lateinit var presenter: AssignmentsPresenter
@Before fun setUp() {
execute = ExecuteUseCase(dataRepository)
presenter = AssignmentsPresenter()
presenter.attachView(viewState)
}
@Test fun `should return list of assignments`() {
given {
execute.execute(anyVararg(), { }, { })
}.willReturn(anyVararg())
}
}
演示者代码:
@InjectViewState
class AssignmentsPresenter : BasePresenter<AssignmentsView>() {
@Inject lateinit var executeUseCase: ExecuteUseCase
private var items: MutableList<AssignmentExpandableModel> = mutableListOf()
init {
BTApplication.getApplicationComponent()?.mainComponent()?.inject(this)
}
fun getAssignments(text: String? = null) {
viewState.showLoading()
executeUseCase.execute(
onNext = { handleSuccessDefault(it) },
onError = { handleError(it) })
}
}
UseCase代码:
class ExecuteUseCase @Inject constructor(private val dataRepository: IDataRepository)
: UseCase.RxObservable<ExecutePresentationQuery, AssignmentWrapper>() {
override fun build(params: ExecutePresentationQuery?): Observable<AssignmentWrapper> {
return dataRepository.execute(it)
}
}
编辑
日志:
org.mockito.exceptions.misusing.InvalidUseOfMatchersException: 无效使用参数匹配器! 预计有0个符合条件的记录,有1个记录: ->在com.bottomline.partnerselect.presentation.presenter.assignments.AssignmentsPresenterTest $处应返回作业列表$ 1.invoke(AssignmentsPresenterTest.kt:30)//在文件中加括号
如果匹配器与原始值组合,则可能发生此异常: //不正确: someMethod(anyObject(),“原始字符串”); 使用匹配器时,必须由匹配器提供所有参数。
答案 0 :(得分:3)
错误消息中最重要的部分是:
使用匹配器时,所有参数都必须由匹配器提供。
你有
execute.execute(anyVararg(), { }, { })
anyVararg()
(顺便问为什么不定期使用any()
?)是匹配器,而{}
不是匹配器。
{}
是Kotlin中的常规函数定义。它是一个不执行任何操作的函数(具有零个或一个参数)。
因此,您的参数之一是匹配器,而其他参数则不是,它违反了Mockito规则。
您可以使用与常规对象相同的方法来模拟函数(使用mockito-kotlin):
val onNext = mock<(TOutput) -> Unit>()