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")
}
我正在开发 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")
}