Я использую Maven + Surefire + TestNG + Guice (последние стабильные версии)
У меня "большой" тест, для запуска которого требуется Guice.
В основном я делаю это так:
@Test(groups = "large")
@Guice(modules = FooLargeTest.Module.class)
public class FooLargeTest {
public static class Module extends AbstractModule {
public void configure() {
bindConstant().annotatedWith(FooPort.class).to(5000);
// ... some other test bindings
}
}
@Inject Provider<Foo> fooProvider;
@Test
public void testFoo() {
Foo foo = fooProvider.get() // here injection of port is done
// it could not be passed to constructor
// ... actual test of foo
}
}
Проблема в том, что FooPort
жестко задан в 5000
. Это свойство Maven, поэтому первой попыткой было использовать следующую конфигурацию Surefire:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<suiteXmlFiles>
<suiteXmlFile>testng.xml</suiteXmlFile>
</suiteXmlFiles>
<systemPropertyVariables>
<fooPort>${foo.port}</fooPort>
</systemPropertyVariables>
</configuration>
</plugin>
И после этого запроса это похоже на System.getProperty("fooPort")
. К сожалению, в документации сказано, что это только для теста JUnit. По крайней мере, я не мог видеть эту системную переменную во время отладки теста. Я пробовал forkMode
и по умолчанию один и never
, это ничего не меняет. Для тестов TestNG рекомендуется сделать так:
<properties>
<property>
<name>fooPort</name>
<value>${foo.port}</value>
</property>
</properties>
Но теперь я должен использовать это свойство от Guice, так что оно должно быть как-то передано GuiceModule, я попробовал его следующим образом:
@Test(groups = "large")
@Guice(moduleFactory = FooLargeTest.ModuleFactory.class)
public class FooLargeTest {
public static class ModuleFactory extends AbstractModule {
private final String fooPort = fooPort;
@Parameters("fooPort")
public ModuleFactory(String fooPort) {
this.fooPort = fooPort;
}
public Module createModule(final ITestContext context, Class<?> testClass) {
return new AbstractModule {
public void configure() {
bindConstant().annotatedWith(FooPort.class).to(fooPort);
// ... some other test bindings
}
}
}
}
@Inject Provider<Foo> fooProvider;
@Test
public void testFoo() {
Foo foo = fooProvider.get() // here injection of port is done
// actual test of foo
}
}
Но этот путь также был неудачным, поскольку создатель для modulefactories
не учитывал @Parameters
и, следовательно, не мог создать экземпляр фабрики.
Похоже, я должен попытаться получить некоторые данные из ITestContext context
, но я не знаю, как и если эти данные есть или есть какой-то более простой способ сделать то, что я хочу.
Спасибо за ответ.