2016-02-21 6 views
0

У меня есть неявный модуль scaldi в моем объекте корневого пакета, так что любой компонент может использовать инжектор неявно.Как реализовать модуль Scaldi в отношении тестирования и mocks (не знакомый с этим модулем)?

Этот модуль выглядит следующим образом:

val additionalModule = new AtomicReference[Module](new Module {}) 

lazy val applicationModule = additionalModule.get ++ new Module { 
    bind[Trait1] to new Impl1 
    bind[Trait2] to new Impl2 
} 

документация Scaldi говорит, что это не рекомендуется, чтобы связать на уже инициированную модуль, так что я добавил additionalModule для целей повторного тестирования/модулей и агрегировать его с заранее определенной одной , Правильно ли я понял?

+0

Почему вы поместили модуль в атомную ссылку? Вы хотите динамически добавлять привязки («привязать к уже инициализированному модулю»)? При составлении состава модуля правые модули имеют приоритет (http://scaldi.org/learn/#testing-of-play-application), поэтому, если вы используете 'дополнительныйModule' для тестирования, он должен быть добавлен к другому модулю для перезаписи привязок. – Mironor

ответ

0

Я бы не рекомендовал делать инжектор глобально доступным. Если вы хотите использовать его в определенном классе, я бы рекомендовал вам ввести неявный параметр с Injector для этого класса. Что-то вроде этого:

class UserService(implicit inj: Injector) extends Injectable { 
    // ... 
} 

(more info)

В качестве альтернативы вы можете использовать инъекции конструктора в сочетании с injected макро:

class TokenRepo(db: Database, metrics: Metrics) extends Tokens { 
    // ... 
} 

теперь вы можете связать это следующим образом:

class MyModule extends Module { 
    bind [Tokens] to injected [TokenRepo] 
} 

(more info)

При тестировании важно не повторять использование экземпляров модулей, если вы составляете их разными способами внутри тестов. Это означает, что в вашем случае вам необходимо создать экземпляр не только тестового модуля, но и модуля приложения. Например:

implicit injector = new TestModuleWithMocks ++ new Appmodule 

Как упоминалось в @Mironor, вам необходимо быть осторожным с порядком модулей в составе.

 Смежные вопросы

  • Нет связанных вопросов^_^