如果我想对它们进行单元测试,是否必须避免使用对象?

时间:2014-06-17 02:46:19

标签: scala unit-testing object dependency-injection

说,我正在使用一些提供对象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)
// ...

我的问题是,我是否必须这样做以避免使用对象,只是为了使其可测试?

我发现以前的代码简单易行,但后者更复杂:(

0 个答案:

没有答案