PlayFramework Scala Test — получить экземпляр класса через инжектор зависимостей

Я использую Scala Test для тестирования своего уровня обслуживания. Я изо всех сил пытаюсь получить экземпляр класса обслуживания в своем тесте. Мой тестовый класс, как показано ниже

class SmsServiceSpec extends BaseSpec with OneAppPerSuite with ScalaFutures {

implicit override lazy val app: FakeApplication = FakeApplication()

"SMS Service" must {
   "able to send SMS" in {

    val smsService =  //not sure how to get instance of class here => app.injector.getInstance[SmsService]

    whenReady(smsService.sendSms("9XXXXXXX", "This is test message")) { res =>
      res mustBe true
    }
  }
 }
}

Отредактированный код согласно @easel

class SmsServiceSpec extends BaseSpec with OneAppPerSuite with ScalaFutures {

 "SMS Service" must {
"able to send SMS" in {

  @Inject val smsService: SmsService = null //not sure how to get instance of class here => app.injector.getInstance[SmsService]

  whenReady(smsService.sendSms("98XXXXXX", "This is test message")) { res =>
    res mustBe true
  }
}
}

}

Я не уверен, как получить экземпляр службы SMS в приведенном выше коде.

Спасибо,


person Naveen    schedule 23.06.2015    source источник
comment
Итак, я не так хорошо знаком с 2.4, и я знаю, что с DI все изменилось, но в своем приложении я использую 2.3 с Guice, а для модульных тестов в моей настройке я сам создаю экземпляр класса и передаю зависимости или макеты и т. д. Можете ли вы что-то сделать похожий?   -  person Barry    schedule 23.06.2015
comment
Что не так со строкой, которую вы закомментировали. В версии 2.4 это должно работать только до тех пор, пока SmsService аннотирован @Inject или имеет конструктор с 0 аргументами.   -  person easel    schedule 23.06.2015
comment
@barry - этот конкретный тест не может работать с макетами. Я хочу проверить, действительно ли я получаю SMS на свой телефон :(   -  person Naveen    schedule 24.06.2015
comment
@easel - я обновил свой код выше, но мое свойство по-прежнему равно нулю.   -  person Naveen    schedule 24.06.2015
comment
Вы пытались просто использовать app.injector.getInstance[SmsService]?   -  person easel    schedule 24.06.2015
comment
@easel - пытался это сделать, sbt жалуется, что getInstance не является функцией инжектора. Не уверен, что я пропускаю какой-либо импорт   -  person Naveen    schedule 25.06.2015
comment
Я думаю, что у вас есть что-то еще происходит тогда. Возможно, отсутствуют библиотеки или конфигурация или переопределенный глобальный модуль. У меня есть такая черта, как следующая, которую я добавляю в свои тесты для удобства ссылок на сервисы и т. Д., И это просто работает. trait Injections { def app: Application implicit lazy val инжектор = app.injector def acterSystem: ActorSystem = инжектор.instanceOf[ActorSystem]   -  person easel    schedule 25.06.2015
comment
@easel - Спасибо за это, это может быть действительно полезно. По крайней мере, я знаю, с чего начать :)   -  person Naveen    schedule 26.06.2015


Ответы (1)


Вы можете использовать Guice для внедрения зависимостей. Рекомендуется абстрагировать службы во время компиляции и указывать привязку между абстракциями служб и их реализациями во время выполнения.

Например,

класс SmsServiceImpl расширяет SmsService

привязать (класс [SmsService]). к (класс [SmsServiceImpl])

Это, https://github.com/luongbalinh/play-mongo, простое, но стандартное приложение с использованием Play 2.4.2, ReactiveMongo и Guice (для внедрения зависимостей).

person Luong Ba Linh    schedule 30.07.2015