如何测试Guice Singleton?

时间:2010-05-22 07:21:29

标签: java unit-testing singleton module guice

Guice Singletons对我来说很奇怪

首先我想到了

IService ser = Guice.createInjector().getInstance(IService.class);
System.out.println("ser=" + ser);
ser = Guice.createInjector().getInstance(IService.class);
System.out.println("ser=" + ser);

将作为单身人士工作,但会返回

ser=Service2@1975b59
ser=Service2@1f934ad

没关系,它不一定非常容易。

Injector injector = Guice.createInjector();
IService ser = injector.getInstance(IService.class);
System.out.println("ser=" + ser);
ser = injector.getInstance(IService.class);
System.out.println("ser=" + ser);

作为单身人士

ser=Service2@1975b59
ser=Service2@1975b59

所以我需要有Injector的静态字段(Singleton for Singletons)

我如何传递给它进行测试?

2 个答案:

答案 0 :(得分:12)

使用Guice时,每个JVM应该只创建一个注入器。通常,您将在应用程序的入口点(即在public static void main方法中)创建它。如果您在应用程序中多次致电createInjector,那么您可能错误地使用了Guice!

单身人士是每个注射器的实例。请注意,这是 instance-per-JVM。获得单身人士参考的最佳方法是注入它。另一种方法是要求唯一的注射器实例给你。

答案 1 :(得分:0)

在做出类似的狂野,不准确的指控之前,你真的需要做更多的测试(和阅读)。我正在使用Guice来管理我的单例实例。

你的模块绑定是什么样的? GoF中的单例模式只是确保一个类的一个实例的一种方式,但使用static使它实际上是一个糟糕的选择。对单例的需求是在应用程序运行时只有一个类的实例可用。

以下是使用Guice创建单例实例所需的全部内容:

public class myModule extends AbstractModule {
    protected void configure() {
        bind(Service.class).to(ServiceImpl.class).in(Singleton.class);
    }
}

当您要求Guice为您提供实例时,除非您自己做一些独特的范围,否则您将获得相同的实例。默认情况下,单例将用于当前的Injector实例。