JUnitParams - 在测试之前执行单独的方法

时间:2016-02-29 10:31:36

标签: java unit-testing junit junit4 junitparams

@RunWith(JUnitParamsRunner.class)
public class MySimpleTest {

    private MyRec rec;
    private Matrix matrix;

    @Before
    public void createRecognizerBeforeEveryExecution() {
        rec = new MyRec();
        matrix = MatrixUtils.createMatrixWithValues();
    }

    public static Iterable<Object[]> data() {
        return Arrays.asList(
                new Object[]{"expectedvalue1", "input1"},
                new Object[]{"expectedvalue2", "input2"}
        );
    }

    @Test
    @Parameters(method = "data")
    public void test1(String output, String input) {
        rec.fun1(matrix);
        assertEquals(output, rec.someFunction(input));
    }

    public static Iterable<Object[]> data2() {
        return Arrays.asList(
                new Object[]{"expectedothervalue1", "input1"},
                new Object[]{"expectedothervalue2", "input2"}
        );
    }

    @Test
    @Parameters(method = "data2")
    public void test2(String output, String input) {
        rec.fun1(matrix);
        rec.fun2(matrix);
        assertEquals(output, rec.someFunction(input));
    }

}

我试图找出进行此测试的正确方法。我想使用参数化测试,因为它非常方便。

正如您所看到的,在每个测试函数中,我都调用了一些函数(fun1fun2)。但我需要每次测试只调用一次(例如在每次参数化测试执行之前)。

有没有办法告诉JUnitParams它应该在执行所有参数化测试之前执行其他函数?

我无法使用@Before注释,因为您可以在test1中看到我没有使用fun2。它认为它应该由单独的函数执行。

2 个答案:

答案 0 :(得分:1)

解决方案1:

由于fun [1 | 2]不依赖于内部测试状态,因此请尝试将其调用放在data和data2方法中。

public static Iterable<Object[]> data() {
        rec.fun1(matrix);
        return Arrays.asList(
                new Object[]{"expectedvalue1", "input1"},
                new Object[]{"expectedvalue2", "input2"}
        );
    }

public static Iterable<Object[]> data2() {
        rec.fun1(matrix);
        rec.fun2(matrix);
        return Arrays.asList(
                new Object[]{"expectedvalue1", "input1"},
                new Object[]{"expectedvalue2", "input2"}
        );
    }

解决方案2:

分裂测试用例不是最佳做法。您的测试难以维护。流程要复杂得多。您的测试开始时也存在相互依赖的风险。测试中的重复有时会更好。

PS: 如果您使用Strings作为测试方法参数,最好将它们传递给与此文件的第25行完全相同: https://github.com/Pragmatists/JUnitParams/blob/master/src/test/java/junitparams/usage/SamplesOfUsageTest.java而非特殊方法。

@Test
@Parameters({"AAA,1", "BBB,2"})
public void paramsInAnnotation(String p1, Integer p2) { }

答案 1 :(得分:0)

我决定使用TestNG解决这个问题(代码只是为了显示我的思路):

import org.testng.Assert;
import org.testng.annotations.*;

import java.lang.reflect.Method;

public class TempTest {

    private Integer number;

    @BeforeMethod
    public void init(Method m) {
        number = 5;
        switch(m.getName()) {
            case "test2":
                fun(10);
                fun2(5);
                break;
            case "test1":
                fun(10);
                break;
        }
    }

    public void fun(int value) {
        number += value;
    }

    public void fun2(int value) {
        number -= value;
    }

    @Test
    public void test1() {
        Assert.assertEquals(new Integer(15), number);
    }

    @Test
    public void test2() {
        Assert.assertEquals(new Integer(10), number);
    }

    @Test
    public void test3() {
        Assert.assertEquals(new Integer(5), number);
    }

}