Ho un semplice POJO:iniettando chiamato Guice Singleton
public class MyPOJO {
@Inject
private Fizz fizz;
private Buzz buzz;
// rest of class omitted for brevity
}
Vorrei configurare il mio modulo Guice tale che ci sono due tipi di Fizz
ca che inietta:
- Uno speciale, globally-singleton
Fizz
istanza; e - Altro (non speciale)
Fizz
casi
voglio MyPOJO
da iniettare con la speciale istanza/Singleton. Così ho modificato il mio codice:
public class MyPOJO {
@Inject @Named("Special-Fizz")
private Fizz fizz;
private Buzz buzz;
// rest of class omitted for brevity
}
Poi, nel mio modulo:
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);
}
}
Ma quando cerco di test di unità (JUnit 4.10) questo:
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);
}
}
Questo passa. Fin qui tutto bene. Ma poi se cambio il nome del campo specialFizz
:
@Named("Special-Fuzz-This-Shouldnt-Work") private Fizz specialFizz;
e ri-eseguire il test, passa ancora. Perché?!? Dove sto andando fuori strada qui? Grazie in anticipo.
Grazie @condit (+1) - è stato un errore da parte mia nel digitare questa domanda. Ho modificato la mia domanda originale per mostrare che in realtà sto chiamando 'injector.getInstance', non' injector.inject'. Questo cambia qualcosa per te? 'GetInstance' non è corretto per me usare qui? Se è così, perché, e che cos'è? Grazie ancora! – IAmYourFaja
Nel tuo test stai chiedendo all'iniettore un'istanza di 'Fizz' che sarà sempre in grado di fornirti (a causa del tuo metodo' @ Provides'). Penso che tu voglia ottenere un'istanza di 'MyPOJO' invece. Nota che il 'Fizz' che stai ricevendo non è correlato al membro' Fizz' del test. Quindi la modifica di '@ Named' non avrà alcun effetto in questo caso. – condit
Lo hai inchiodato. Ho appena chiesto di iniettare un 'MyPOJO' e ha iniettato correttamente la sua proprietà' Fizz' con il mio fizz speciale. Mistero risolto: solo un metodo di test poco efficace. Grazie ancora! – IAmYourFaja