Параметризованные тесты 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));
}
}
}