Kotlin:单元测试将函数作为参数的函数

时间:2018-03-08 08:28:27

标签: android unit-testing kotlin

我有一个从存储库中检索项目列表的函数。我没有使用常规回调,而是传入一个函数并使用结果调用它。但是你如何对这种功能进行单元测试呢?有没有办法验证传入的函数是否被调用,或者我应该重构并使用常规回调并使用模拟的回调接口对其进行测试?

我的代码:

class WorklistInteractor @Inject
constructor(private val worklistRepository: WorklistRepository,
            private val preferenceManager: PreferenceManager,
            private val executor: Executor)
    : WorklistDialogContract.Interactor, Executor by executor {

    @Volatile private var job: Job? = null

    override fun getWorklist(callback: (Result<List<WorklistItem>>) -> Unit) {
        job = onWorkerThread {
            val result = worklistRepository.getWorklist().awaitResult()
            onMainThread { callback(result) }
        }
    }

    override fun cancel() {
        job?.cancel()
    }
}

2 个答案:

答案 0 :(得分:5)

要检查它是否被调用,类似的东西会起作用:

var hasBeenCalled = false
interactor.getWorklist({ result -> hasBeenCalled = true })

assertTrue(hasBeenCalled)

当然你也可以检查预期结果是否通过等等。

答案 1 :(得分:4)

您可以简单地传递一个回调函数,该函数设置一个测试局部变量,您将其验证为断言。为简单起见,我稍微更改了一些示例:

fun getWorklist(callback: (String) -> Unit) = callback("helloWorld")


@Test
fun testCase() {
    var invoked = false
    getWorklist {
        invoked = true
        it.length
    }
    Assert.assertTrue(invoked)
}