关于java:(j)单元测试断言和错误消息?

(j)Unit testing assertions and error messages?

本问题已经有最佳答案,请猛点这里访问。

我目前正在测试一种方法,我称之为testedMethod()

方法体如下所示

1
2
3
4
5
6
7
8
9
10
private testedMethod(List<Protocoll> protocolList) {
    //so something with the protocolList
    if (something) && (somethingElse) {
        Assert.isFalse(areTheProtocollsCorrect(p1, p2),"Error, the protocols are wrong");
    }

    if (somethingCompeletlyElse) && (somethingElse) {
        Assert.isFalse(areTheProtocollsExactlyTheSame(p1, p2),"Error, the protocols are the same");
    }
}

来自Assert.class的附加代码:

IsFALSE:

1
2
3
public static void isFalse(boolean condition, String descr) {
    isTrue(!condition, descr);
}

伊斯特鲁:

1
2
3
4
5
public static void isTrue(boolean condition, String descr) {
    if (!condition) {
        fail(descr);
    }
}

失败:

1
2
3
4
public static void fail(String descr) {
    LOGGER.fatal("Assertion failed:" + descr);
    throw new AssertException(descr);
}

测试这个方法应该做什么已经准备好了。但我想测试一下这些断言。这个断言是代码的一个重要部分,我想看看当我向它提供错误的数据时,这个方法是否会抛出这些错误。我怎么能用JUnit呢?


首先,我您当前使用的是JUnit,您不应该编写自己的assert*fail方法:它们已经包含在assert类中。

无论如何,如果要测试断言,则必须编写两种测试用例:正用例和负(失败)用例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
@Test
public void positiveCase1()
{
    // Fill your input parameters with data that you know must work:
    List<Protocoll> protocolList=...
    testedMethod(protocolList);
}

@Test
public void positiveCase2()
{
    ...
}

@Test(expected=AssertException.class)
public void negativeCase1()
{
    // Fill your input parameters with data that you know must NOT work:
    List<Protocoll> protocolList=...
    testedMethod(protocolList);
}

@Test(expected=AssertException.class)
public void negativeCase2()
{
    ...
}

Test注释中的expected参数使junit检查是否引发了该类型的异常。否则,测试标记为失败。

但我仍然坚持使用JUnit标准更好。