Mam proste POJO:wstrzykiwanie nazwie Guice singleton
public class MyPOJO {
@Inject
private Fizz fizz;
private Buzz buzz;
// rest of class omitted for brevity
}
chciałbym skonfigurować mój moduł Guice takie, że istnieją dwa rodzaje Fizz
es że wstrzykuje:
- Specjalny, globally-singleton
Fizz
instancja; i - inne (nie-specjalnego)
Fizz
przypadki
że chce MyPOJO
wstrzykiwano w specjalnej/jednoelementowy przykład. Więc mój zmodyfikowany kod:
public class MyPOJO {
@Inject @Named("Special-Fizz")
private Fizz fizz;
private Buzz buzz;
// rest of class omitted for brevity
}
Wtedy w moim modułu:
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);
}
}
Ale gdy próbuję testów jednostkowych (JUnit 4.10) to:
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);
}
}
przechodzi ten. Jak na razie dobrze. Ale jeśli mogę zmienić nazwę pola specialFizz
:
@Named("Special-Fuzz-This-Shouldnt-Work") private Fizz specialFizz;
i ponownie uruchomić test, nadal przechodzi. Czemu?!? Gdzie ja tu zbłądziłem? Z góry dziękuję.
Dzięki @condit (+1) - to był błąd z mojej strony przy pisaniu tego pytania. Zmieniłem moje oryginalne pytanie, aby pokazać, że w rzeczywistości nazywam 'injector.getInstance', a nie' injector.inject'. Czy to coś dla ciebie zmieni? Czy 'getInstance' nie jest dla mnie poprawny? Jeśli tak, dlaczego i czym jest? Dzięki jeszcze raz! – IAmYourFaja
W teście pytasz wtryskiwacz o instancję 'Fizz', która zawsze będzie w stanie Ci zapewnić (z powodu twojej metody" @ Provides "). Myślę, że zamiast tego chcesz utworzyć instancję 'MyPOJO'. Zauważ, że 'Fizz', który otrzymujesz, nie ma związku z testem członka Fizz. Zatem zmiana '@Named' nie będzie miała żadnego wpływu w tym przypadku. – condit
Przybiłeś to. Poprosiłem go tylko o wstrzyknięcie "MyPOJO" i poprawnie wstrzyknęło mu własność 'Fizz' z moim specjalnym szampanem. Mystery rozwiązane - tylko źle wdrożona metoda testowa. Dzięki jeszcze raz! – IAmYourFaja