Kotlin如何在参数中模拟函数

时间:2018-06-24 16:28:18

标签: android junit kotlin mockito

我试图用测试覆盖主持人。演示者用例作为数据源。用例的执行方法具有以下结构: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(),“原始字符串”);   使用匹配器时,必须由匹配器提供所有参数。

1 个答案:

答案 0 :(得分:3)

错误消息中最重要的部分是:

  

使用匹配器时,所有参数都必须由匹配器提供。

你有

execute.execute(anyVararg(), { }, { })

anyVararg()(顺便问为什么不定期使用any()?)是匹配器,而{}不是匹配器。

{}是Kotlin中的常规函数​​定义。它是一个不执行任何操作的函数(具有零个或一个参数)。

因此,您的参数之一是匹配器,而其他参数则不是,它违反了Mockito规则。

您可以使用与常规对象相同的方法来模拟函数(使用mockito-kotlin):

val onNext = mock<(TOutput) -> Unit>()