Mockito Scala 中的模拟函数行为

Mock function's behvaiour in Mocktio Scala

我正在开发 Scala 和 Play 应用程序,并尝试为我的一个单元测试编写模拟。

def getActionAsBase64(
    appName: String = null,
    taskType: String = null,
    taskName: String = null
  ): String = {
    val pwd = System.getProperty("user.dir")
    val filePath = Paths.get(pwd, "..", "tasks", appName, taskType, taskName, taskName + ".zip").toString
    val simplified = Files.simplifyPath(filePath)

    // Reading the file as a FileInputStream
    val file = new File(simplified)
    val in = new FileInputStream(file)
    val bytes = new Array[Byte](file.length.toInt)
    in.read(bytes) // stream inserts bytes into the array
    in.close()

    // Encoding the file using Base64encoder
    val encoded =
      new BASE64Encoder()
        .encode(bytes)
        .replace("\n", "")
        .replace("\r", "")
    return encoded.toString
  }

以上是我的原始代码,我试图模拟 in.read 的行为,并使其将任意数据注入 bytes 数组。

到目前为止,我只能找到如何使用 thenReturn 方法来模拟返回值的简单模拟。

在我的情况下,我想模拟函数的行为,理想情况下,它应该做类似

的事情
def mockRead(bytes) {
   // mutate the bytes parameter
}

您需要一种方法来注入模拟文件或读取文件的函数,

接受函数的 API 示例,

  import java.util.Base64

  object Api {

    def getActionAsBase64(fileBytesFn: (String, String, String) => Array[Byte],
                          appName: String,
                          taskType: String,
                          taskName: String): String = {

      val encoded = new String(Base64.getEncoder
        .encode(fileBytesFn(appName, taskName, taskName)))
        .replace("\n", "")
        .replace("\r", "")

      encoded
    }
  }

这样你就可以通过一个读取文件的测试函数,

  test("test a function") {

    val mock = (_: String, _: String, _: String) => "prayagupd".getBytes()

    val d = Api.getActionAsBase64(mock, "any app name", "taskName", "taskName")

    assert(d == "cHJheWFndXBk")
  }

另一种方法是传入 stubbed func,

  test("test a function II") {

    val stbbedFn = stubFunction[String, String, String, Array[Byte]]
    stbbedFn.when("any appName", "any taskType", "any taskName").returns("prayagupd".getBytes())

    val d = Api.getActionAsBase64(stbbedFn, "any appName", "any taskType", "any taskName")

    assert(d == "cHJheWFndXBk")
  }