Kotlin 如何在参数中模拟函数

Dra*_*ake 0 junit android mockito kotlin

我试图用测试来覆盖演示者。演示者用例作为数据源。用例的 Execute 方法具有以下结构: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())
    }
}
Run Code Online (Sandbox Code Playgroud)

演示者代码:

@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) })
    }
}
Run Code Online (Sandbox Code Playgroud)

用例代码:

class ExecuteUseCase @Inject constructor(private val dataRepository: IDataRepository)
    : UseCase.RxObservable<ExecutePresentationQuery, AssignmentWrapper>() {

    override fun build(params: ExecutePresentationQuery?): Observable<AssignmentWrapper> {
        return dataRepository.execute(it)
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑

日志:

org.mockito.exceptions.misusing.InvalidUseOfMatchersException:参数匹配器的使用无效!预期 0 个匹配器,记录 1 个:-> 在 com.bottomline.partnerselect.presentation.presenter.assignments.AssignmentsPresenterTest$should return list of assignments$1.invoke(AssignmentsPresenterTest.kt:30) //在文件中结束括号

如果匹配器与原始值结合使用,则可能会发生此异常: //incorrect: someMethod(anyObject(), "raw String"); 使用匹配器时,所有参数都必须由匹配器提供。

mic*_*brz 9

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

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

你有

execute.execute(anyVararg(), { }, { })
Run Code Online (Sandbox Code Playgroud)

anyVararg()(顺便说一句。为什么不是常规的any()?)是匹配器,而{}不是。

{}是 Kotlin 中的普通函数定义。它是一个什么都不做的函数(带有零个或一个参数)。

所以你的论点之一是匹配器,而其他论点不是,它违反了 Mockito 规则。

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

val onNext = mock<(TOutput) -> Unit>()
Run Code Online (Sandbox Code Playgroud)