说,我正在使用一些提供对象Json
的json库:
object Json {
def unapply[T](jsonStr:String)(implicit converter:Converter[T]) { ... }
}
我可以在我的scala代码中使用它:
class MyLoginController {
def login(request:Request) = {
val loginInfo = Json.unapply[LoginInfo](request.body)
// check(loginInfo.email)
// check(loginInfo.password)
}
}
它完美无缺,但很快我发现我的自我无法通过模拟轻松测试。我无法找到模仿Json.unapply
的方法。
所以我必须更改我的代码以提供特征并使用依赖注入:
trait JsonParsable[T] {
def parse(jsonStr:String)(implicit converter:Converter[T])
}
object JsonParser extends JsonParsable[T] {
def parse(jsonStr:String)(implicit converter:Converter[T]) = Json.unapply(jsonStr)
}
class MyLoginController(jsonParser:JsonParsable[T]) {
def login(request:Request) = {
val loginInfo = jsonParser.parse[LoginInfo](request.body)
// check(loginInfo.email)
// check(loginInfo.password)
}
}
当我编写单元测试时,我会为JsonParsable
模拟MyLoginController
:
val fakeParser = mock[JsonParsable]
// ...
val controller = new MyLoginController(fakeParser)
// ...
我的问题是,我是否必须这样做以避免使用对象,只是为了使其可测试?
我发现以前的代码简单易行,但后者更复杂:(