有没有办法验证在测试过程中是否已调用作为依赖项传递给类的顶级函数?

时间:2018-08-22 21:59:06

标签: kotlin mockito

我有一个接收一个函数的类,该函数允许它在故障情况下在UI上显示内容。验证测试中是否已调用该函数的最佳方法是什么?

MyClass(private val uiPrinter: (String) -> Unit) {
    fun foo() {
        // do some stuff
        uiPrinter("printing from foo!")
        // do some more stuff 
    }
}

MyClassTest() {
    val testUiPrinter: (String) -> Unit = { System.out.println(it) }

    @Test
    fun uiPrinterIsInvoked() {
        val myClass = MyClass(testUiPrinter)
        myClass.foo()
        // can I verify that testUiPrinter has been invoked?
    }
}

2 个答案:

答案 0 :(得分:1)

您可能想查看Model-View-Presenter体系结构。其目的是将Android框架隐藏在抽象的View接口后面,纯Java Presenter可以与之交互。在您的示例中:

interface ViewInterface {
  fun printError(error: String)
}


class MyPresenter(private val view: ViewInterface) {
  fun foo() {
    // do some stuff (testable stuff)
    view.printError("Printing from foo()!")
    // do some more (testable) stuff
  }
} 

class MyPresenterTest() { // Test using Mockito to mock the abstract view
    private val view = mock(ViewInterface::class.java)
    private val presenter = MyPresenter(view)

    @Test
    fun printsError() {
        // set up preconditions

        presenter.foo()

        verify(view).printError("Printing from foo()!")
    }
}

您的具体视图通常是实现视图界面的Android Activity,Fragment或View。注意,MyPresenter仅需要抽象视图,不需要了解框架相关的操作。

class MyActivity : Activity(), ViewInterface {
    // ...

    override fun printError(error: String) {
        textView.text = error // For example
    }
    // ...
}

答案 1 :(得分:0)

这可以通过模拟高阶函数来实现,因为除非内联,否则高阶函数是对象。

@Mock
val testUiPrinter: (String) -> Unit

@Test
fun uiPrinterIsInvoked() {
    val myClass = MyClass(testUiPrinter)
    myClass.foo()
    verify(testUiPrinter).invoke("Printing from foo!")
}