关于Java:如何使JUnit打印断言和结果

How make JUnit to print asserts and results

我有一些像这样的测试:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@Test
public void test01()
{
    Position p = getPositionAt('a', 1);
    assertNotNull("a1 exists", p);
    assertNotNull("figure exists a1", p.getFigure());

    p = getPositionAt('a', 2);
    assertNotNull("exists a2", p);
    assertNull("figure exists a2", p.getFigure());

    p = getPositionAt('b', 1);
    assertNotNull("exists b1", p);
    assertNull("figure exists b1", p.getFigure());
}

运行测试时,我需要将每个断言消息打印到stdout,然后再输出断言的结果。

这是来自测试类的要求格式:

1
2
3
4
5
6
a1 exists -success
figure exists a1 -success
exists a2 -success
figure exists a2 -succcess
exists b1 -succcess
figure exists b1 -failed

但是该怎么做呢? 我是使用JUnit的新手,却一无所知。 是否可以使用runnerssuites? 还是存在任何assertSuccess()assertFailed()方法? 感谢您的提示。


首先,您有两个问题,而不是一个。断言失败时,将引发AssertionError异常。这样可以防止检查超过此点的任何断言。为了解决这个问题,您需要使用ErrorCollector。

其次,我不相信JUnit内置任何方法可以做到这一点。但是,您可以实现包装断言的自己的方法:

1
2
3
4
5
6
7
8
9
10
public static void assertNotNull(String description, Object object){
     try{
          Assert.assertNotNull(description, object);
          System.out.println(description +" - passed");
     }catch(AssertionError e){
          System.out.println(description +" - failed");

        throw e;
     }
}


所有assertXXX方法的格式都允许在出错时显示String:

assertNotNull("exists a2", p); // prints"exists a2" if p is null

成功打印消息没有特殊价值。

编辑

Junit通常提供两种断言形式。要遵循上面的示例,您可以使用以下2种方法之一来测试空值:

assertNotNull(p)

要么

assertNotNull("my message on failure", p)

框架将无需您的其他任何努力就打印错误消息(由框架提供)。

要测试异常,可以使用以下模式:

1
2
3
4
5
try{
    someCall();
catch(Exception e){
    fail(): // exception shouldn't happen, use assertTrue(true) if it should
}

同样,这些消息的添加方法有多种版本

检查API


最后一种选择是将每个断言与对应的System.out.println配对,尽管显然这不理想。尽管如此,如果其他所有方法都失败了,它将解决问题。