【问题标题】:Testing whether functions passed through function parameters are getting called (Android/Kotlin))测试通过函数参数传递的函数是否被调用(Android/Kotlin)
【发布时间】:2018-05-23 06:34:50
【问题描述】:

有什么方法可以检查通过另一个函数的参数传递的函数是否被调用?例如,

override fun updateWeight(value: Editable,
                          showEmptyError: () -> Unit,
                          showOutOfRangeError: () -> Unit,
                          dismissAlertDialog: () -> Unit,
                          updateAndShow: (Float) -> Unit) {
    if (value.toString().trim().isEmpty()) {
        showEmptyError()
    } else {
        val floatVal = value.toString().trim().toFloat()
        if (floatVal > 300) {
            showOutOfRangeError()
        } else {
            dismissAlertDialog()
            updateAndShow(floatVal)
        }
    }
}

我需要用 value 参数的不同值测试上述方法并检查正在执行哪个方法?我尝试寻找答案,但找不到合适的解决方案。

【问题讨论】:

  • 您是否可以控制在测试中将相应函数传递到 updateWeight 中?
  • @s1m0nw1 是的。我正在做一个具有 MVP 架构的应用程序,这是一个演示者功能。这个方法是从一个带有所需参数的 Activity 中调用的。
  • 您可以通过 lambdas 为您的测试设置一些状态,然后您可以检查:stackoverflow.com/questions/49168588/…

标签: android unit-testing junit kotlin mockito


【解决方案1】:

您可以使用 Mockito 模拟 lambda 函数。比如showEmptyError测试:

@RunWith(MockitoJUnitRunner::class)
class TestUpdateWeight {
    @Mock
    lateinit var showEmptyError: () -> Unit
    @Mock
    lateinit var showOutOfRangeError: () -> Unit
    @Mock
    lateinit var dismissAlertDialog: () -> Unit
    @Mock
    lateinit var updateAndShow: (Float) -> Unit

    @Test
    fun testShowEmptyErorr() {
        updateWeight("", showEmptyError, showOutOfRangeError, dismissAlertDialog, updateAndShow)

        verify(showEmptyError).invoke()
        verifyNoMoreInteractions(showOutOfRangeError)
        verifyNoMoreInteractions(dismissAlertDialog)
        verifyNoMoreInteractions(updateAndShow)
    }
}

【讨论】:

  • 我试过了,但出现了kotlin.UninitializedPropertyAccessException: lateinit property showEmptyError has not been initialized
  • 你给这个属性添加了@Mock注解吗?
  • 成功了。我忘了在类上方添加@RunWith(MockitoJUnitRunner::class)
【解决方案2】:

你可以用不同的标签记录值 喜欢showEmptyError方法,你可以登录

Log.d("showEmptyError value",value.toString()) // inside your showEmptyError() method

相同的方法使用不同的标签Log.d中的第一个参数 并且您的结果将在 Logcat 中打印。

但要做到这一点,您必须在 showEmptyError 中接受 value 参数。所以原型应该是showEmptyError(value:Editable)

【讨论】:

    猜你喜欢
    • 2018-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-12
    • 2013-11-08
    相关资源
    最近更新 更多