Я пробую последнюю версию 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