Как использовать IInjectorFactory - PullRequest
0 голосов
/ 26 апреля 2020

Я пробую последнюю версию TestNG, и есть функция, которая может вводить пользовательский Dependency Injector. Поэтому я написал демо, но обнаружил, что проблема не ясна.

@Test
public void testPluginDependencyInjector() {
    TestNG testNG = new TestNG();
    testNG.setInjectorFactory(new TestInjectorFactory());
    testNG.setXmlSuites(Collections.singletonList(createXmlSuite()));
    testNG.run();
}

private static XmlSuite createXmlSuite() {
    XmlSuite xmlSuite = new XmlSuite();
    xmlSuite.setParallel(XmlSuite.ParallelMode.CLASSES);
    xmlSuite.setThreadCount(5);
    xmlSuite.setName("suite");
    XmlTest xmlTest = new XmlTest(xmlSuite);
    xmlTest.setName("test");
    XmlClass xmlClass = new XmlClass(InjectTest.class);
    xmlTest.setXmlClasses(Collections.singletonList(xmlClass));
    System.err.println("Generated Xml File ");
    System.err.println(xmlSuite.toXml());
    return xmlSuite;
}

InjectTest class

public class InjectTest {
/*@Inject
private GuiceDemo.Greeter greeter;*/

@Test
public void injectTest(GuiceDemo.Greeter greeter) {
    greeter.sayHello();
}

}

Реализует IInjectorFatory для добавления нового модуля

public static class TestInjectorFactory implements IInjectorFactory {

    @Override
    public Injector getInjector(Stage stage, Module... modules) {

        return Guice.createInjector(stage, modules);
    }
}

класс GuiceDemo, который содержит демонстрационный модуль

public class GuiceDemo {
@Qualifier
@Retention(RetentionPolicy.RUNTIME)
@interface Message {}

@Qualifier
@Retention(RetentionPolicy.RUNTIME)
@interface Count {}

public static class DemoModule extends AbstractModule {

    @Override
    protected void configure() {
        bind(Key.get(String.class, Message.class)).toInstance("hello world");
    }

    @Provides
    @Count
    static Integer provideCount() {
        return 3;
    }
}

public static class Greeter {
    private final String message;
    private final int count;

    @Inject
    Greeter(@Message String message, @Count int count) {
        this.message = message;
        this.count = count;
    }

    public void sayHello() {
        for (int i=0; i < count; i++) {
            System.out.println(message);
        }
    }
}

public static void main(String[] args) {
    Injector injector = Guice.createInjector(new DemoModule());
    Greeter greeter = injector.getInstance(Greeter.class);
    greeter.sayHello();
}

}

Когда я запускаю 'testPluginDependencyInjector', я встретил

[Utils] [ERROR] [Error] org.testng.TestNGException: 
Cannot inject @Test annotated Method [injectTest] with [class com.*.GuiceDemo$Greeter].
For more information on native dependency injection please refer to 
http://testng.org/doc/documentation-main.html#native-dependency-injection
at org.testng.internal.Parameters.checkParameterTypes(Parameters.java:441)
at org.testng.internal.Parameters.createParametersForMethod(Parameters.java:355)
at org.testng.internal.Parameters.createParameters(Parameters.java:712)
at org.testng.internal.Parameters.handleParameters(Parameters.java:879)
at org.testng.internal.Parameters.handleParameters(Parameters.java:744)
at org.testng.internal.ParameterHandler.handleParameters(ParameterHandler.java:59)
at org.testng.internal.ParameterHandler.createParameters(ParameterHandler.java:38)
at org.testng.internal.TestInvoker$MethodInvocationAgent.invoke(TestInvoker.java:783)
at org.testng.internal.TestInvoker.invokeTestMethods(TestInvoker.java:146)
at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:146)
at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:128)

Итак, я не знаю, неправильно ли я понимаю функцию этого интерфейса, или мне не хватает некоторого кода в демоверсии. Если нет, пожалуйста, помогите показать некоторые демонстрационные версии для этой функции.

BR / Nan

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...