我有一个接收一个函数的类,该函数允许它在故障情况下在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?
}
}
答案 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!")
}