Я использую Spring для введения пути к каталогу в мои модульные тесты. В этом каталоге много файлов, которые должны использоваться для генерации данных тестирования для параметризованных тестовых сценариев с помощью Параметризованного исполнителя тестов. К сожалению, исполнитель тестов требует, что метод, который обеспечивает параметры быть статичным. Это не работает на мою ситуацию, потому что каталог может только быть введен в нестатическое поле. Какие-либо идеи, как я могу обойти это?
Я предполагаю, что вы используете JUnit 4.X, поскольку вы упомянули Parameterized test runner. Это подразумевает, что вы не используете @RunWith(SpringJUnit4ClassRunner). Это не проблема, просто перечисляю свои предположения.
Следующий пример использует Spring для получения каталога тестовых файлов из XML-файла. Он не инжектирует его, но данные все равно доступны вашему тесту. Причем в статическом методе, не меньше.
Единственный недостаток, который я вижу, это то, что это может означать, что ваша конфигурация Spring будет разбираться/конфигурироваться несколько раз. При необходимости вы можете загрузить только меньший файл с информацией для конкретного теста.
@RunWith(Parameterized.class)
public class MyTest {
@Parameters
public static Collection<Object[]> data() {
ApplicationContext ctx = new ClassPathXmlApplicationContext("/jeanne/jeanne.xml");
String dir = ctx.getBean("testFilesDirectory", String.class);
// write java code to link files in test directory to the array
return Arrays.asList(new Object[][] { { 1 } });
}
// rest of test class
}
Помните, что Spring вводит с помощью @Autowired, но также и с сеттером. Поэтому вместо использования @Autowired используйте установщик:
private static String directory;
public void setDirectory(String directory) {
this.directory = directory;
}
public static String getDirectory() {
return directory;
}
Вы можете использовать TestContextManager из Spring. В этом примере я использую теории вместо параметризованных.
@RunWith(Theories.class)
@ContextConfiguration(locations = "classpath:/spring-context.xml")
public class SeleniumCase {
@DataPoints
public static WebDriver[] drivers() {
return new WebDriver[] { firefoxDriver, internetExplorerDriver };
}
private TestContextManager testContextManager;
@Autowired
SomethingDao dao;
private static FirefoxDriver firefoxDriver = new FirefoxDriver();
private static InternetExplorerDriver internetExplorerDriver = new InternetExplorerDriver();
@AfterClass
public static void tearDown() {
firefoxDriver.close();
internetExplorerDriver.close();
}
@Before
public void setUpStringContext() throws Exception {
testContextManager = new TestContextManager(getClass());
testContextManager.prepareTestInstance(this);
}
@Theory
public void testWork(WebDriver driver) {
assertNotNull(driver);
assertNotNull(dao);
}
}
Я нашел это решение здесь: Как проводить параметризованные / теоретические тесты с помощью Spring