Как использовать тестовый бегун с параметризированным 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;
}