JUnit: ввести параметры @Parameterized?

Какой самый простой способ добавить набор параметров в тестовый класс @Parameterized?

Случай использования:

У меня есть обычный класс, который выглядит так

@RunWith(Parameterized.class)
class Tests {

    public void testOne() { }
    public void testTwo() { }

    @Parameters
    public static Collection<Object[]> generateData() { }

}

Стандартный бегун JUnit может быть вызван следующим образом: org.junit.runner.JUnitCore.runClasses(TestClass1.class, ...);

тем не менее, нет способа указать / переопределить параметры.

Как я могу ввести свои собственные параметры?

2 ответа

junit не предназначен для запуска чужого класса junit с вашими параметрами. поэтому, если возможно, проведите рефакторинг тестируемых классов, чтобы они поддерживали желаемое поведение. если вы не можете выполнить рефакторинг, тогда все, что вы можете сделать, это использовать некоторые обходные пути. например:

  • если тестовый класс написан "правильно" (например, нет статических ссылок), то вы можете наследовать от тестового класса и предоставить свои собственные параметры. но все же вы должны предоставить параметры явно в файле класса, а не во время выполнения
  • Вы можете попытаться использовать пользовательский загрузчик классов и генерацию / преобразование байт-кода, чтобы изменить метод поставщика параметров при загрузке класса. так же, как работает PowerMockito
  • написать свой собственный бегун, так что он будет игнорировать параметры в классе и использовать вместо этого свой собственный

Я бы использовал generateData() метод, который генерирует все пятьсот элементов. Кроме того, я бы добавил метод getParameters() с пометкой @Parameters, Это может вызвать generateData() чтобы получить полную коллекцию, затем загрузите файл журнала (если имеется) и уменьшите коллекцию до ошибочных параметров теста. Если файл журнала отсутствует, он вернет всю коллекцию. Возможно, вам придется явно указать ваши параметры, чтобы иметь возможность их идентифицировать, потому что JUnit не гарантирует повторный запуск тестов / тестовых параметров в том же порядке (см. Изменение имен параметризованных тестов).

@RunWith(Parameterized.class)
public class Tests {

  @Parameters
  public static Collection<Object[]> getParameters() {
    List<Object[]> parameters = generateData();
    return filterParameters(parameters);
  }

  private static Collection<Object[]> filterParameters(Collection<Object[]> params) {
    // load a file to exclude successful tests
    // ...
  }

  private static Collection<Object[]> generateData() {
    return new ArrayList<Object[]>();
  }
}

Другим способом может быть использование Scanner с System.in в @Parameters метод, так что вы можете выбрать параметры с пользовательского ввода из консоли. Тем не менее, вам нужно будет как-то убедиться, что тесты все еще могут выполняться без взаимодействия с пользователем, если вы хотите использовать их в непрерывной интеграции.

Другие вопросы по тегам