Tôi có một POJO đơn giản:tiêm tên Guice singleton
public class MyPOJO {
@Inject
private Fizz fizz;
private Buzz buzz;
// rest of class omitted for brevity
}
Tôi muốn cấu hình mô-đun Guice của tôi như vậy là có hai loại Fizz
es rằng nó sẽ tiêm nhiễm:
- Một đặc biệt, phiên bản toàn cầu-singleton
Fizz
; và - khác (không đặc biệt)
Fizz
trường
Tôi muốn MyPOJO
được tiêm với các trường hợp đặc biệt/singleton. Vì vậy, tôi đổi mã của tôi:
public class MyPOJO {
@Inject @Named("Special-Fizz")
private Fizz fizz;
private Buzz buzz;
// rest of class omitted for brevity
}
Sau đó, trong mô-đun của tôi:
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);
}
}
Nhưng khi tôi cố gắng để kiểm tra đơn vị (JUnit 4.10) này:
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);
}
}
này đi. Càng xa càng tốt. Nhưng sau đó nếu tôi thay đổi tên của trường specialFizz
:
@Named("Special-Fuzz-This-Shouldnt-Work") private Fizz specialFizz;
Và tái chạy thử nghiệm, nó vẫn đi. Tại sao?!? Tôi sẽ đi lạc ở đâu? Cảm ơn trước.
Cảm ơn @condit (+1) - đó là lỗi của tôi khi nhập câu hỏi này. Tôi đã chỉnh sửa câu hỏi ban đầu của mình để cho thấy rằng tôi thực sự đang gọi 'injector.getInstance', không phải là' injector.inject'. Điều đó có thay đổi gì cho bạn không? 'GetInstance' có đúng không cho tôi sử dụng ở đây không? Nếu vậy, tại sao, và cái gì? Cảm ơn một lần nữa! – IAmYourFaja
Trong thử nghiệm của bạn, bạn đang yêu cầu các vòi phun cho một thể hiện của 'Fizz' mà nó sẽ luôn luôn có thể cung cấp cho bạn (vì phương pháp' @ Provides') của bạn. Tôi nghĩ rằng bạn muốn có một ví dụ của 'MyPOJO' thay thế. Lưu ý rằng 'Fizz' bạn nhận được không liên quan đến thành viên' Fizz' của bài kiểm tra. Vì vậy, việc thay đổi '@ Named' sẽ không có hiệu lực trong trường hợp này. – condit
Bạn đã đóng đinh nó. Tôi chỉ yêu cầu nó tiêm một 'MyPOJO' và nó tiêm nó một cách chính xác nó là tài sản 'Fizz' với fizz đặc biệt của tôi. Bí ẩn được giải quyết - chỉ là một phương pháp thử nghiệm được thực hiện kém. Cảm ơn một lần nữa! – IAmYourFaja