2015-04-14 3 views
0

Я хотел бы выполнить тест с параметризацией JUnit с внешними данными. У меня есть список объектов, и мне просто нужно знать, как я могу преобразовать их в коллекцию массивов объектов. Я вижу следующий вопрос переполнения стека, но я хочу добавить данные из файла, который считывается из моего метода.Конвертировать список <T> в коллекцию <Object[]> для параметризованного теста JUnit

Parameterized JUnit tests with non-primitive parameters?

Рабочий код: что-то вроде этого:

@RunWith(Parameterized.class) 
public class sampletest { 

    private BranchMailChildSample branch; 

    public sampletest(BranchMailChildSample branch) 
    { 
    this.branch = branch; 
    } 

    @Parameters 
    public static Collection<Object[]> data() 
    { 
    String excel = "C:\\Resources\\TestData\\ExcelSheets\\BranchMail\\branchmail_TestData.xlsx"; 
    ExcelMarshallerTool tool = new ExcelMarshallerTool(excel); 
    List<BranchMailChildSample> items = tool.unmarshallExcel(BranchMailChildSample.class); 

    //RIGHT HERE I NEED HELP: Convert list to Collection<Object[]> 

    //return items as Collection of object arrays 
    } 

    @Test 
    public void test() 
    { 
    System.out.println(branch.toString()); 
    } 
} 
+0

Это будет лучше создать ожидаемый 'List ' и проверить соответствующий код .. –

+0

я могу сделать это, но я хотел бы Тонкость иметь его показать, как несколько тестов в JUnit плагин , Если один из объектов в этом списке терпит неудачу, тогда весь тест завершится с ошибкой. Для отладки потребуется больше времени, чем если бы у меня был снимок каждой части данных. – CodyK

+0

Вы можете объявить список как поле класса, инициализировать его и заполнить его методом '@ Before', а затем использовать его по своему желанию. Это не то же самое, что при использовании других фреймворков, но это вариант. –

ответ

2

Вы не должны преобразовать список.

@RunWith(Parameterized.class) 
public class SampleTest { 

    @Parameters(name = "{0}") 
    public static List<BranchMailChildSample> data() { 
    String excel = "C:\\Resources\\TestData\\ExcelSheets\\BranchMail\\branchmail_TestData.xlsx"; 
    ExcelMarshallerTool tool = new ExcelMarshallerTool(excel); 
    return tool.unmarshallExcel(BranchMailChildSample.class); 
    } 

    @Parameter(0) 
    public BranchMailChildSample branch; 

    @Test 
    public void test() { 
    System.out.println(branch.toString()); 
    } 
} 

Я использовал полевую инъекцию, потому что для этого требуется меньше кода, чем инъекция конструктора. Установка имени проверяемого объекта печатает более полезный вывод. Пожалуйста, взгляните на documentation of the Parameterized runner.

Вы можете использовать впрыск конструктора, если вам не нравится публичное поле.

@RunWith(Parameterized.class) 
public class SampleTest { 

    @Parameters(name = "{0}") 
    public static List<BranchMailChildSample> data() { 
    String excel = "C:\\Resources\\TestData\\ExcelSheets\\BranchMail\\branchmail_TestData.xlsx"; 
    ExcelMarshallerTool tool = new ExcelMarshallerTool(excel); 
    return tool.unmarshallExcel(BranchMailChildSample.class); 
    } 

    private final BranchMailChildSample branch; 

    public SampleTest(BranchMailChildSample branch) { 
    this.branch = branch; 
    } 

    @Test 
    public void test() { 
    System.out.println(branch.toString()); 
    } 
} 
+0

Спасибо, это очень полезно. Я даже не знал, что ты сможешь это сделать. Я полагаю, единственное, что мне не нравится, так это то, что мои тестовые данные должны быть публичными. Но это не должно быть слишком большой проблемой. – CodyK

+0

Это потому, что параметризированный бегун должен получить доступ к методу data(). –

+0

Я имел в виду ветку свойств. Он не может установить его с личным значением, даже с установщиком. – CodyK

0

Вот почему я хотел бы предложить вам использовать TestNG вместо этого, если это возможно. Это работает так же, как JUnit, но вы можете использовать внутренний или внешний DataProvider, выполнять методы в заданном порядке ... Это гораздо удобнее использовать

//This method will provide data to any test method that declares that its Data Provider 
//is named "test1" 
@DataProvider(name = "test1") 
public Object[][] createData1() { 
return new Object[][] { 
    { "Cedric", new Integer(36) }, 
    { "Anne", new Integer(37)}, 
}; 
} 

//This test method declares that its data should be supplied by the Data Provider 
//named "test1" 
@Test(dataProvider = "test1") 
public void verifyData1(String n1, Integer n2) { 
System.out.println(n1 + " " + n2); 
} 
+0

Пожалуйста, хотя бы предоставьте, как это можно достичь с помощью TestNG, иначе это должен быть комментарий. –

+0

Я предоставил ссылку, как использовать его в моем anserw: http://testng.org/doc/documentation-main.html#parameters-dataproviders – loikkk

+0

Это невозможно. Я хотел бы использовать TestNG, но мы застряли с JUnit, так как это то, что уже используется. – CodyK

0

На самом деле, если вы используете JUnit 4.12 и теории бегуна , что-то вроде этого должно работать:

@RunWith(Theories.class) 
public class MyTest 
{ 
    @DataPoints public static List<MyClass> myFunctionThatReturnsTestData() 
    { 
     // TODO 
    } 

    @Theory 
    public void canDoTheThing(MyClass m) throws Exception { 
+0

Хотя это будет работать, я все равно столкнусь с проблемами. Первая проблема - это бегун плагина junit, который будет сообщать об этом как один тест. Я хочу, чтобы каждый фрагмент данных отображался как другой тест, поэтому я могу получить представление о том, что прошло и что не получилось. Во-вторых, при использовании Therories, если я использую assert, он запустит тест и не запустит остальные. Использование Assums будет отмечать тест как пропуск в бегуне, если он терпит неудачу, поэтому я не хочу его использовать. – CodyK

+0

Я изначально использовал эту библиотеку под названием Feed4Junit, но потом выяснил, что она не работает с JUnit 4.12 http://databene.org/feed4junit – CodyK

0

Я получил его на работу это сделать:

List<BranchMailChildSample> items = tool.unmarshallExcel(BranchMailChildSample.class); 

    Collection<Object[]> data = new ArrayList<Object[]>(); 

    for(BranchMailChildSample item : items) 
    { 
     Object[] objItem = new Object[] { item }; 
     data.add(objItem); 
    } 

    return data;