adlı enjekte:Basit POJO var Guice singleton'ununu
public class MyPOJO {
@Inject
private Fizz fizz;
private Buzz buzz;
// rest of class omitted for brevity
}
Ben Fizz
es iki tür de enjekte etmesiyle vardır öyle ki benim Guice modülünü yapılandırmak istiyorum:
- özel, küresel olarak tekil
Fizz
örneği; ve - Diğer (özel olmayan)
Fizz
örnekleri
I MyPOJO
özel/Singleton Örneğin enjekte verilsin. Benim modülünde Sonra
public class MyPOJO {
@Inject @Named("Special-Fizz")
private Fizz fizz;
private Buzz buzz;
// rest of class omitted for brevity
}
: Ben kodumu modifiye
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);
}
}
Ama (JUnit 4.10) Bu birim testi çalıştığınızda:
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);
}
}
Bu geçirir. Çok uzak çok iyi. Ama specialFizz
alanının adını değiştirin sonra eğer:
@Named("Special-Fuzz-This-Shouldnt-Work") private Fizz specialFizz;
Ve testi, hala geçer yeniden çalıştırın. Niye ya?!? Nerede burdan gidiyorum? Şimdiden teşekkürler.
Teşekkür @condit (1) - bu soruyu yukarı yazarak kendi payıma bir hata oldu. Ben aslında injector.getInstance' değil 'injector.inject'' arıyorum olduğunu göstermek için benim orijinal soruyu kaydetmiştiniz. Bu senin için her şeyi değiştirir mi? Burada kullanmak benim için doğru değil mi? Eğer öyleyse, neden, ve nedir? Tekrar teşekkürler! – IAmYourFaja
Testinizde, enjektörü her zaman size sağlayabilecek olan bir “Fizz” örneği için soruyorsunuz ('Sağlamanız' yönteminiz nedeniyle). Bunun yerine bir "MyPOJO" örneğini almak istediğinizi düşünüyorum. Aldığınız Fizz'in testin Fizz üyesi ile ilgisi olmadığını unutmayın. Bu yüzden '@ Named' değiştirilmesinin bu durumda bir etkisi olmaz. – condit
Siz çivilenmişsiniz. Sadece 'MyPOJO' enjekte etmesini istedim ve özel fizzimle 'Fizz' özelliğini doğru şekilde enjekte ettim. Gizem çözüldü - sadece zayıf uygulanan bir test yöntemi. Tekrar teşekkürler! – IAmYourFaja