2016-02-29 3 views
1

Чтобы избежать много избыточных тестовых классов для простого тестирования интеграции, я хотел бы создать параметризованный общий тестовый класс, как в следующем примере:Как запустить общий параметризованный тест JUnit в Eclipse?

@RunWith(Parameterized.class) 
public class MovementTest<V extends Vehicle, T extends Track<V>> { 

    private final V testVehicle; 

    private final T testTrack; 

    public MovementTest(V vehicle, T track){ 
     testVehicle = vehicle; 
     testTrack = track; 
    } 

    @Test 
    public void testMovement(){ 
     testVehicle.moveAlong(testTrack); 
    } 

    @Parameters 
    public static Iterable<Object[]> provideTestExamples(){ 
     Object[][] params = { 
      { new Car(), new Highway() }, 
      { new Train(), new RailRoadTrack() } 
     }; 
     return Arrays.asList(params); 
    } 
} 

public interface Vehicle { 
    abstract void moveAlong(Track t); 
} 

public interface Track<E extends Vehicle> { }  

public class Train implements Vehicle { 
    @Override 
    public void moveAlong(Track t) {} 
} 

public class RailRoadTrack implements Track<Train> {} 

public class Car implements Vehicle { 
    @Override 
    public void moveAlong(Track t) { } 
} 

public class Highway implements Track<Car> {}  

К сожалению, этот тест класс не работоспособный. Есть ли краткий способ реализовать что-то подобное?

+0

Любой StackTrace, лаг, что угодно? У вас есть Object [] [] params, но создаются новые Object [] – Gaskoin

+0

@Gaskoin Исправлено. Кроме того, Eclipse не предоставляет возможность запускать этот тестовый класс, поэтому нет stacktrace. –

+0

Бегун Eclipse JUnit будет работать против стираемого стилем байт-кода, поэтому не имеет значения, что MovementTest имеет общие параметры типа. Вы используете относительно недавнюю версию eclipse? Является ли JUnit 4 на пути к проекту? У меня нет проблем с параметризованными тестами - даже с параметрами типового типа - в eclipse Luna. –

ответ

3

# 1

Вы можете использовать JUnit «s Parametrized бегуна. Она работает следующим образом:

@RunWith(Parameterized.class) 
public class ParametrizedTest { 

    private final String text; 
    private final int number; 

    public ParametrizedTest(String text, int number) { 
     this.text = text; 
     this.number = number; 
    } 

    @Test 
    public void shouldContainNumber() { 
     assertTrue(text.contains(String.valueOf(number))); 
    } 

    @Parameterized.Parameters 
    public static Iterable<Object[]> params() { 
     return Arrays.asList(
       new Object[][]{ 
         {"test string 1", 1}, 
         {"test string 2", 2} 
       } 
     ); 
    } 
} 

Вы можете прочитать больше об этом решении here

# 2 (лучше)

Там также может быть лучше (я так думаю), используя JUnitParameters (link), просто взять a Посмотрите:

@RunWith(JUnitParamsRunner.class) 
public class JUnitParamsTest{ 

    @Test 
    @Parameters 
    public void shouldContainNumber(String text, int number) { 
     assertTrue(text.contains(String.valueOf(number))); 
    } 

    public Object[] parametersForShouldContainNumber() { 
     return $(
       $("test string 1", 1), 
       $("test string 2", 2) 
     ); 
    } 
} 

Обратите внимание, что имя метода, которое поставляет параметры, должно соответствовать имени теста. Это решение кажется лучше, потому что (не только) вы получаете лучшие имена тестов после выполнения:

[OK] JUnitParams. [0] контрольная строка 1, 1 (mustContainNumber)

[OK] JUnitParams. [1] Тест строка 2, 2 (shouldContainNumber)

Более полный список того, почему это лучше можно найти на сайте проекта:

более
  • Явный - Титулы в тестовом методе Params, а не полей класса
  • меньше кода - вам не нужен конструктор, чтобы настроить параметры
  • вы можете смешать параметрирован с не параметрическими методами в одном классе
  • PARAMS может быть переданный в виде строки CSV или из класса поставщика параметров
  • класс поставщика параметров может иметь столько параметров, которые предоставляют методы, которые вы хотите, так что вы можете группировать разные случаи
  • вы можете иметь метод тестирования, который предоставляет параметры (без внешних классы или статика больше)
  • вы можете увидеть фактические значения параметров в вашем IDE (в параметрическом JUnit в это только последовательные номера параметров)
+0

Да, это очень простой параметризованный тест, и мы используем его много. Однако это не касается моих потребностей в данной ситуации. Здесь подчеркивается «общий». –

+0

@SME_Dev взгляните на обновленный ответ –

+0

Я завтра загляну в библиотеку. Выглядит многообещающе с первого взгляда. Спасибо. –

Смежные вопросы