如何在测试和模拟方面实现Scaldi模块(对该模块不熟悉)?

时间:2016-02-21 04:36:47

标签: scala scaldi

我的根包对象中有一个隐式scaldi模块,因此任何组件都可以隐式使用注入器。

此模块如下所示:

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用于测试/模块重用目的,并将其与预定义模块聚合在一起。 我做对了吗?

1 个答案:

答案 0 :(得分: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所提到的,你需要注意组合中模块的顺序。