Я пытаюсь сделать пользовательские инъекции Guice с TypeListeners и MemberInjectors, но TypeListener не вызывается. Поскольку это происходит в сочетании с TestNG, я не создаю инжекторы, они создаются TestNG и используются для создания экземпляров тестовых классов.
Может ли кто-нибудь предоставить некоторые входные данные или указать, что мне не хватает. Оцените его.
Версия артефакта -
'org.testng:testng:6.9.10'
'com.google.inject:guice:4.0'
Документация TestNG для инъекций на основе Guice - TestNG-Guice
Ссылаясь на документацию Guice - Пользовательские инъекции
Мой код -
Класс модуля Guice *
public class GModule extends AbstractModule {
@Override
protected void configure() {
bindListener(Matchers.any(), new RemoteOpTypeListener());
}
}
Тестовый класс
@Guice(modules = GModule.class)
public class TestClass1 {
@R public Remote r1;
@Test
public void test1_a(){ r1.connect(); }
}
Пользовательская аннотация
@BindingAnnotation @Target({FIELD, PARAMETER, METHOD}) @Retention(RUNTIME)
public @interface R {}
Тип слушателя
public class RemoteOpTypeListener implements TypeListener {
@Override
public <I> void hear(TypeLiteral<I> type, TypeEncounter<I> encounter) {
System.out.println("Hearing ..");
Class<?> clazz = type.getRawType();
while (clazz != null) {
System.out.println("Class found "+clazz.getCanonicalName());
for (Field field : clazz.getDeclaredFields()) {
System.out.println("Found field : "+field.getName());
if (field.getType() == Remote.class &&
field.isAnnotationPresent(R.class)) {
System.out.println("Registering the encounter");
encounter.register(new RemoteOpMembersInjector<I>(field));
}
}
clazz = clazz.getSuperclass();
}
}
}
Инжектор участника
public class RemoteOpMembersInjector<T> implements MembersInjector<T> {
private final Field field;
private final Remote remote;
RemoteOpMembersInjector(Field field) {
this.field = field;
System.out.println("Hello, i was called");
this.remote = new RemoteOps("Current User");
field.setAccessible(true);
}
public void injectMembers(T t) {
try {
System.out.println("Trying to inject remote object");
field.set(t, remote);
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
}
}
}
Дистанционный класс
public interface Remote { void connect(); }
public class RemoteOps implements Remote {
private String user;
public RemoteOps() {}
public RemoteOps(String user) { this.user = user; }
@Override
public void connect() { System.out.println("Connected to this user : "+this.user); }
}