Junit使用文件输入参数化测试

时间:2014-01-28 09:23:19

标签: java unit-testing junit junitparams

我有一个关于使用参数化测试来查询我的API单元测试的查询。现在,而不是像

那样建立一个arraylist
Arrays.asList(new Object[]{
   {1},{2},{3}
});

我想逐个读取文件中的行并将它们填入数组中。 这样一切都会被推广。任何人都可以用示例建议我这样的方法吗?

还有一种方法可以在不将各种参数声明为私有成员并在测试单元的构造函数中初始化它的情况下进行测试吗?

编辑:Duncan提出的代码

@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

3 个答案:

答案 0 :(得分:13)

@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

答案 1 :(得分:2)

查看junitparams项目,尤其是this example。它将向您展示如何使用CSV文件进行参数输入。这是一个简短的例子:

我的test.csv文件:

1, one
2, two
3, three

我的测试:

package com.stackoverflow.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);
    }

}

显然,第一个测试将失败,产生错误消息一个不是至少两个

答案 2 :(得分:0)

在Spring-boot Java框架中,您可以在类中方便地使用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));
       }
   }
}

Source