每个参数调用的Junit参数化测试

时间:2014-03-19 10:49:55

标签: java junit

在junit中,每个测试都应该独立运行。对于更复杂的程序,通常运行设置方法。但我需要类似于在每个参数之前运行的设置方法。

假设我有一个这样的测试用例:

setup()
contructor()
test1()
test2()
test3()
teardown()

从执行i junit参数化测试开始,这将以2个参数结束:

setUpBeforeClass
contrcutor called
test1 running
contrcutor called
test2 running
contrcutor called
test3 running
contrcutor called
test1 running
contrcutor called
test2 running
contrcutor called
test3 running
tearDownAfterClass

我需要的是在每个参数之前调用的东西。所以结果就像这样(用“()”改变了方法):

setUpBeforeClass
contrcutor called
setupParam()
test1 running
contrcutor called
test2 running
contrcutor called
test3 running
contrcutor called
tearDownParam()
setupParam()
test1 running
contrcutor called
test2 running
contrcutor called
test3 running
tearDownParam()
tearDownAfterClass

我知道junit测试应该是原子的,但每个参数的设置过程非常昂贵。有没有办法实现这种执行顺序?

提前致谢!

更新

@Before在第一个答案中只会在每次测试前调用。 例如:

setUpBeforeClass
contrcutor called
before
test1 running
contrcutor called
before
test2 running
contrcutor called
before
test3 running
contrcutor called
before
test1 running
contrcutor called
before
test2 running
contrcutor called
before
test3 running
tearDownAfterClass

2 个答案:

答案 0 :(得分:1)

使用@Before Annotation

@Before
public void before() {
    System.out.println("Before every test ");
}

答案 1 :(得分:0)

如果要将每个参数对象用于多个运行,则意味着必须在静态字段中保留对它们的引用,因为每个测试方法都在不同的对象上运行。

您还可以在静态字段中保留其中一个参数的先前值,并假设其在参数集中具有唯一值,您可以将其用作参数更改的检测器。

这几乎就是你想要的,在第一次测试新参数的构造函数之后运行tearDownParams()的小故障。

@RunWith(Parameterized.class)
public class SomeTest {

    @Parameters
    public static Collection<Object[]> data() {
        return Arrays.asList(new Object[][] {
            { 1, 4, 3 },
            { 2, 5, 6 },
            { 3, 8, 12 }
        });
    }

    static int lastP1Value = -1;

    private int p1;

    public SomeTest(int p1, int p2, int p3) {
        System.out.println("constructor");
        this.p1 = p1;
    }

    @Test
    public void test1() {
        System.out.println("    test1");
    }

    @Test
    public void test2() {
        System.out.println("    test2");
    }

    @Before
    public void setUp() {
        if (lastP1Value != p1) {
            if (lastP1Value != -1) {
                // this is a bit too late (after constructor for new params...)
                tearDownParams();
            }
            setUpParams();
        }
        lastP1Value = p1;
    }

    public static void setUpParams() {
            System.out.println("  setUpParams");

    }

    @AfterClass
    public static void tearDownParams() {
            System.out.println("  tearDownParams");
    }
}