函数参数和对象的Kotlinunit testing

在Kotlin中,我们可以将函数对象作为函数参数传入。

  1. 如何创建unit testing来测试函数对象逻辑? (例如下面的funcParam
  2. 如何对具有函数参数的函数进行unit testing? (例如下面的functionWithFuncParam ) – 即我可以创建一个模拟funcParam

     class MyClass1(val myObject: MyObject) { val funcParam = fun (num: Int): Int { return num * num } fun myFunctionOne() { myObject.functionWithFuncParam(funcParam) } } class MyObject () { fun functionWithFuncParam(funcParam: (Int) -> Int) { println(funcParam(32)) } } 

One Solution collect form web for “函数参数和对象的Kotlinunit testing”

假设funcParampublic你可以像其他方法一样测试它:

 class MyClass1Tests { val sut = MyClass1(MyObject()) @Test fun `funcParam multiplies input`() { assertThat(sut.funcParam(4), equalTo(16)) assertThat(sut.funcParam(1), equalTo(1)) assertThat(sut.funcParam(0), equalTo(0)) assertThat(sut.funcParam(-10), equalTo(100)) } } 

如果funcParam是私有的,你不应该直接测试它的行为,而只能通过它的包含类的公共接口来测试它的行为。

当测试functionWithFuncParam你可以很容易地提供(Int) -> Int的存根实现:

 class MyObjectTests { val outContent = ByteArrayOutputStream().apply { System.setOut(PrintStream(this)) } val sut = MyObject() @Test fun `functionWithFuncParam prints function output `() { sut.functionWithFuncParam { 12345678 } assertThat(outContent.toString(), containsString("12345678")) } } 

如果你想测试MyClass1MyObject交互,一种方法是使用MyClass1接口实现的MyObject 。 如果两个class级是不同的合作者,通常是最好的选择,因为他们有一个独立的大多数不相关的行为:

 interface FunctionalObj { fun functionWithFuncParam(funcParam: (Int) -> Int) } class MyClass1(val myObject: FunctionalObj) { //omitted for brevity } class MyClass1Tests { var params = mutableListOf<(Int)->Int>() val sut = MyClass1(object: FunctionalObj { override fun functionWithFuncParam(funcParam: (Int) -> Int) { params.add(funcParam) } }) @Test fun `myFunctionOne calls delegate`() { sut.myFunctionOne() assertThat(params.size, equalTo(1)) assertThat(params[0], equalTo(sut.funcParam))//only if `funcParam` is public } } 

如果MyClass1MyObject交互更复杂(即涉及更多的查询和命令调用),这意味着他们是同行密切合作。 在这种情况下,使用模拟会导致测试变得脆弱和困难。

  • 如何调试NoClassDefFoundError(Gradle,Kotlin)
  • 使用Kotlin自定义Android视图
  • admob横幅使用太多的内存
  • Kotlin中的Room Persistence lib实现
  • 未解决的参考:Kotlin中的findViewById
  • 在Kotlin中使用通用输入参数声明函数文字
  • 无法转换为org.jetbrains.kotlin.java.model.types.JeClassInitializerExecutableTypeMirror
  • Kotlingenericstypes参数
  • Intellij Idea kotlin不能自动导入一些运算符函数,例如+
  • 在Kotlin协同程序中暂停function是什么意思
  • 春季数据JPA /hibernate“无法find给定名称的属性”
  • Kotlin language will be the best programming language for Android.