Наблюдение за фиктивной функцией в Mocktio Scala - PullRequest
0 голосов
/ 28 сентября 2018

Я работаю над приложением Scala and 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
}

1 Ответ

0 голосов
/ 28 сентября 2018

вам нужен способ внедрить фиктивный файл или функцию, которая читает файл,

Пример 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
    }
  }

Таким образом, вы можете пройти тестfunc, который читает файл,

  test("test a function") {

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

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

    assert(d == "cHJheWFndXBk")
  }

Альтернативным способом может быть передача в заглушки 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")
  }
...