使用不同的参数运行参数化的JUnit测试

时间:2014-03-18 08:49:53

标签: java parameters junit annotations scope

我有一个看起来像这样的JUnit-Test:

private final User user1;
private final User user2;

public UserTest(User user1, User user2) {
    this.user1 = user1;
    this.user2 = user2;
}

@Parameterized.Parameters
public static Collection<Object[]> userData() {
    return Arrays.asList(new Object[][] {
            { new User("Tim", "Burton", "tim.burton"),
                    new User("tim", "burton", "timothy.burton") },
            { new User("Vincent", "van Gogh", "vincent.van.gogh"),
                    new User("vincent", "van-gogh", "vincent.vangogh") } });
}

@Test
public void testPositive() {
    checkMatching(user1, user2);
}

现在所有的测试都成功了,但是我想为负面测试创建第二个@ Parameterized.Parameters列表。新方法应如下所示:

@Test
public void testNegative() {
    checkFalseMatching(wrongUser1, wrongUser2);
}

是否可以使用特定于方法的参数?我将使用我已经为testPositive()方法创建的参数以及testNegative()方法的第二个参数列表。

我该怎么做?我可以为我的参数或类似的东西使用“范围”吗?

2 个答案:

答案 0 :(得分:1)

这里有几个选择。首先在构造函数中接受3或4个参数...

public UserTest(User equalUser1, User equalUser2, 
          User notEqualUser1, User notEqualUser2);

另一种选择是使用@Enclosed运行并将不同的参数/测试集分成不同的内部类。这通常是一种很好的做法,因为如果您混合使用参数化测试和非参数化测试,则不希望多次运行非参数化测试。

另一个选择是使用Theories并使用assumeThat方法检查参数是否在特定集合中。

Example Theory with assumeThat

答案 1 :(得分:1)

您也可以尝试junitparams。使用junitparams,您可以通过返回参数值的方法对测试进行参数化。