Должен ли я избегать использования объектов, если я хочу их модульного тестирования?

#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)
// ...
  

Мой вопрос в том, должен ли я делать это, чтобы избежать использования объектов, просто для того, чтобы сделать его тестируемым?

Я обнаружил, что предыдущий код прост и удобен, но более поздний более сложный: (