Пользовательские инъекции TestNG-Guice с TypeListener не работают - PullRequest
0 голосов
/ 25 января 2020

Я пытаюсь сделать пользовательские инъекции 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); }
}
...