Как использовать тестовый бегун с параметризированным JUnit с полем, который вводится с помощью Spring?
Я использую Spring для ввода пути к каталогу в свои модульные тесты. Внутри этого каталога есть несколько файлов, которые должны использоваться для генерации тестовых данных для параметризованных тестовых примеров с помощью тестового бегуна Parameterized. К сожалению, тест-бегун требует, чтобы метод, обеспечивающий параметры, был статичным. Это не работает для моей ситуации, потому что каталог может быть введен только в нестатическое поле. Любые идеи, как я могу обойти это?
Ответы
Ответ 1
Я предполагаю, что вы используете JUnit 4.X, так как вы упомянули тестовый бегун с параметризацией. Это означает, что вы не используете @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
}
Ответ 2
Вы можете использовать TestContextManager из Spring. В этом примере я использую теории вместо Parameterized.
@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
Ответ 3
Достаточно аннотировать тестовый класс с @RunWith(Parameterized.class)
и @ContextConfiguration
, используйте @Autowired
для инъекции зависимостей и используйте TestContextManager
в конструкторе для инициализации, например:
@RunWith(Parameterized.class)
@ContextConfiguration(classes = TestConfig.class)
public class MyTest {
@Autowired
private DataSource dataSource;
private final int param;
@Parameterized.Parameters
public static List<Object[]> params() {
return Arrays.asList(new Object[][]{
{1},
{2},
});
}
public MyTest(int p) {
this.param = p;
new TestContextManager(getClass()).prepareTestInstance(this);
}
@Test
public void testSomething() {
…
}
}
Ответ 4
Я использую следующее решение с Parameterized.class без проблем:
http://bmocanu.ro/coding/320/combining-junit-theoriesparameterized-tests-with-spring/
@ContextConfiguration(value = "classpath:test-context.xml")
public abstract class AbstractJunitTest extends AbstractJUnit4SpringContextTests {
private static TestContextManager testContextManager = null;
private static DAOFactory daoFactory = null;
@Before
public void initApplicationContext() throws Exception {
if (testContextManager == null) {
testContextManager = new TestContextManager(getClass());
testContextManager.prepareTestInstance(this);
daoFactory = (DAOFactory)applicationContext.getBean("daoFactory");
}
}
protected DAOFactory getDaoFactory() throws Exception {
return daoFactory;
}
}
@RunWith(Parameterized.class)
public class SomeTestClass extends AbstractJunitTest {
...
}
Ответ 5
Для тех, кто читает эту версию в конце 2015 года или позже, Spring 4.2, помимо SpringJUnit4ClassRunner добавлены SpringClassRule и SpringMethodRule, которые используют поддержку для Spring TestContext Framework.
Это означает поддержку первого класса для любого Runner, такого как MockitoJUnitRunner
или Parameterized
:
@RunWith(Parameterized.class)
public class FibonacciTest {
@ClassRule public static final SpringClassRule SCR = new SpringClassRule();
@Rule public final SpringMethodRule springMethodRule = new SpringMethodRule();
long input;
long output;
public FibonacciTest(long input, long output) { this.input = input; ...}
@Test
public void testFibonacci() {
Assert.assertEquals(output, fibonacci(input));
}
public List<Long[]> params() {
return Arrays.asList(new Long[][] { {0, 0}, {1, 1} });
}
}
Ответ 6
Помните, что Spring вводит использование @Autowired, но также и с установщиком. Поэтому вместо использования @Autowired используйте установщик:
private static String directory;
public void setDirectory(String directory) {
this.directory = directory;
}
public static String getDirectory() {
return directory;
}