Параметризованные тесты Junit с использованием файлового ввода

У меня есть вопрос об использовании параметризованных тестов для моего модульного тестирования моих API. Теперь вместо того, чтобы строить как arraylist как

Arrays.asList(new Object[]{
   {1},{2},{3}
});

Я хочу прочитать строки в файле одну за другой разделить их пространство и заполнить их в массиве. Таким образом, все будет обобщено. Может кто-нибудь предложить мне такой метод с примером?

Также есть ли способ, которым я мог бы тестировать, не объявляя различные аргументы как частные члены и инициализируя их в конструкторе тестового модуля?

РЕДАКТИРОВАТЬ: код в соответствии с просьбой Дункана

@RunWith(Parameterized.class)
public class JunitTest2 {

    SqlSession session;
    Integer num;
    Boolean expectedResult;
    static BufferedInputStream buffer = null;

    public JunitTest2(Integer num, Boolean expected){
        this.num = num;
        this.expectedResult = expected;
    }

    @Before
    public void setup() throws IOException{
        session = SessionUtil.getSqlSessionFactory(0).openSession();
        SessionUtil.setSqlSession(session);
        buffer = new BufferedInputStream(getClass().getResourceAsStream("input.txt"));
        System.out.println("SETUP!");
    }

    @Test
    public void test() {
        assertEquals(expectedResult, num > 0);
        System.out.println("TESTED!");
    }

    @Parameterized.Parameters
    public static Collection getNum() throws IOException{
        //I want my code to read input.txt line by line and feed the input in an arraylist so that it returns an equivalent of the code below

        return Arrays.asList(new Object[][]{
            {2, true},
            {3, true},
            {-1, false}
        });
    }
    @After
    public void tearDown() throws IOException{
        session.close();
        buffer.close();
        System.out.println("TEARDOWN!");
    }
}

Также мой input.txt будет выглядеть следующим образом:

2 true
3 true
-1 false

2 ответа

Решение
@RunWith(JUnitParamsRunner.class)
public class FileParamsTest {

    @Test
    @FileParameters("src/test/resources/test.csv")
    public void loadParamsFromFileWithIdentityMapper(int age, String name) {
        assertTrue(age > 0);
    }

}

JUnitParams поддерживает загрузку данных из файла CSV.

CSV-файл будет содержать

1,true
2,false

Взгляните на проект junitparams, особенно этот пример. Он покажет вам, как использовать файл CSV для ввода параметров. Вот короткий пример:

Мой файл test.csv:

1, one
2, two
3, three

Мой тест:

package com.stackru.sourabh.example;

import static org.junit.Assert.assertTrue;
import junitparams.FileParameters;
import junitparams.JUnitParamsRunner;

import org.junit.Test;
import org.junit.runner.RunWith;

@RunWith(JUnitParamsRunner.class)
public class FileReadingParameterizedTest {

    @Test
    @FileParameters("src/test/resources/test.csv")
    public void testWithCSV(int number, String name) {
        assertTrue(name + " is not at least two", number >= 2);
    }

}

Очевидно, что первый тест не пройден, и выдается сообщение об ошибке один, по крайней мере, два.

В среде Java с загрузкой Spring вы можете использовать Value аннотация удобно внутри класса,

@Component
public class MyRunner implements CommandLineRunner {

@Value("classpath:thermopylae.txt") //Annotation
private Resource res; // res will hold that value the `txt` player

@Autowired
private CountWords countWords;

@Override
public void run(String... args) throws Exception {

    Map<String, Integer> words =  countWords.getWordsCount(res);

    for (String key : words.keySet()) {

        System.out.println(key + ": " + words.get(key));
       }
   }
}

Источник

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