3

有人告诉我 Guice 旨在生成可测试的代码,而不是在单元测试中需要。但是如何在不使用 Guice 的情况下测试 Singleton(@Singleton)?

4

3 回答 3

12

您在单元测试中不需要Guice(或任何 DI 框架),SUT 通常足够小,以至于手动 DI 很好。

现在关于如何“测试单例”。与测试任何其他类的方式相同,这是单例作为范围之美的一部分。在您的测试方法中创建“单例”的新实例,对其进行测试,然后将其丢弃。请记住,您不希望 SUT 受到先前测试的影响,并且您希望能够为每个测试设置不同的依赖关系,因此您使用范围而不是设计模式这一事实是一件好事。你不需要做任何特别的事情来测试它。

于 2009-10-30T14:11:27.443 回答
2

实际上,我个人的看法是,任何需要 DI 框架的测试都可能被怀疑——听起来更像是集成测试,而不是单元测试。单元测试应该是独立的,你应该手动明确地连接所有依赖项,包括你不想测试的东西的模拟版本。我知道在主流开发术语中,“单元测试”可能会被淡化为开发人员编写的任何测试。然而,这并不意味着它是该术语的正确用法。

鉴于此,不,您应该(并且可能只是不应该!)依赖 Guice 或 Spring DI。

Guice (et al) 的伟大之处实际上在于:通过将它们用于完整系统,您可以在没有任何 DI 的情况下进行测试变得更加容易。

所以我认为评分最高的答案是正确的:要测试一个单例,只需创建并测试它。它没有特定的魔法。

于 2010-05-17T19:02:39.863 回答
1

Guice 进行依赖注入,我猜你在测试中也需要它。
Guice 使得将注入类的实现更改为模拟对象(存根,而不是真实对象)变得很简单。因此,您的测试可以在存根环境中运行,并且可以更快地进行测试,并且独立于应用程序的其他层。

于 2009-10-29T10:38:38.703 回答