#scala #unit-testing #object #dependency-injection
#scala #модульное тестирование #объект #внедрение зависимостей
Вопрос:
Скажем, я использую некоторые библиотеки 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)
}
}
Это работает отлично, но вскоре я обнаружил, что не могу легко протестировать его с помощью mock. Я не могу найти способ издеваться над 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)
// ...
Мой вопрос в том, должен ли я делать это, чтобы избежать использования объектов, просто для того, чтобы сделать его тестируемым?
Я обнаружил, что предыдущий код прост и удобен, но более поздний более сложный: (