我有一个简单的POJO:注入命名吉斯单
public class MyPOJO {
@Inject
private Fizz fizz;
private Buzz buzz;
// rest of class omitted for brevity
}
我想配置我吉斯模块,有两种类型的Fizz
ES,这注入:
- 一个特殊的, global-singleton
Fizz
instance;和 - 其他(非特殊)
Fizz
实例
我想MyPOJO
与特殊/单实例注入。所以,我修改了代码:
public class MyPOJO {
@Inject @Named("Special-Fizz")
private Fizz fizz;
private Buzz buzz;
// rest of class omitted for brevity
}
然后我的模块中:
public class MyModule extends AbstractModule {
@Override
public void configure() {
bind(Fizz.class).annotatedWith(
Names.named("Special-Fizz"))
.to(Fizz.class);
// Other bindings here...
}
@Provides @Singleton
private Fizz providesFizz() {
return new Fizz(true, "Special", 12.0);
}
}
但是,当我试图单元测试(JUnit的4.10)这样的:
public class MyTest {
@Named("Special-Fizz") private Fizz specialFizz;
@Test
public void usingNamedShouldInjectSpecialFizz() {
MyModule mod = new MyModule();
Injector injector = Guice.createInjector(mod);
specialFizz = injector.getInstance(Fizz.class);
Assert.assertTrue(specialFizz != null);
}
}
此通过。到现在为止还挺好。不过,如果我改变specialFizz
字段的名称:
@Named("Special-Fuzz-This-Shouldnt-Work") private Fizz specialFizz;
,并重新运行测试,它仍然通过。为什么?!?我在哪里误入歧途?提前致谢。
Thanks @condit(+1) - 这是我在输入这个问题时的一个错误。我编辑了我的原始问题,以表明我实际上调用了'injector.getInstance',而不是'injector.inject'。这会为你改变什么吗? 'getInstance'不正确,我在这里使用?如果是这样,为什么,什么是?再次感谢! – IAmYourFaja 2013-02-09 02:03:56
在你测试你问喷射器Fizz'的'一个实例,它始终能为您提供(因为你'@ Provides'方法)。我想你想得到一个'MyPOJO'的实例。请注意,你得到的'Fizz'与测试中的'Fizz'成员无关。所以在这种情况下更改'@ Named'将不起作用。 – condit 2013-02-09 02:05:50
你钉了它。我只是要求它注入一个'MyPOJO',并且正确地向它的'Fizz'属性注入了特殊的嘶嘶声。神秘解决 - 只是一个执行不力的测试方法。再次感谢! – IAmYourFaja 2013-02-09 02:09:07