【问题标题】:Kotlin: Unit testing a function that takes a function as parameterKotlin:对以函数为参数的函数进行单元测试
【发布时间】:2018-03-08 08:28:26
【问题描述】:

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

我的代码:

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()
    }
}

【问题讨论】:

    标签: android unit-testing kotlin


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

      fun getWorklist(callback: (String) -> Unit) = callback("helloWorld")
      
      
      @Test
      fun testCase() {
          var invoked = false
          getWorklist {
              invoked = true
              it.length
          }
          Assert.assertTrue(invoked)
      }
      

      【讨论】:

      • 同样的想法,同样的时间。