我有一個簡單的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