简而言之,本章涵盖了各种单元测试断言技术。 它详细说明了内置机制, Hamcrest匹配器和AssertJ断言的优缺点 。 正在进行的示例扩大了该主题,并说明了如何创建和使用自定义匹配器/断言。
单元测试断言
信任但要验证
罗纳德·里根(Ronald Reagan)
岗位测试结构解释了为什么单元测试通常分阶段进行。 它澄清说, 真正的测试即结果验证在第三阶段进行。 但是到目前为止,我们只看到了一些简单的示例,主要使用了JUnit的内置机制。
如Hello World所示,验证基于错误类型AssertionError
。 这是编写所谓的自检测试的基础。 单元测试断言将谓词评估为true
或false
。 如果为false
,则抛出AssertionError
。 JUnit运行时捕获此错误并将测试报告为失败。
以下各节将介绍三种较流行的单元测试断言变体。
断言
JUnit的内置断言机制由类org.junit.Assert
。 它提供了两种静态方法来简化测试验证。 以下代码片段概述了可用方法模式的用法:
fail();
fail( "Houston, We've Got a Problem." );
assertNull( actual );
assertNull( "Identifier must not be null.",
actual );
assertTrue( counter.hasNext() );
assertTrue( "Counter should have a successor.",
counter.hasNext() );
assertEquals( LOWER_BOUND, actual );
assertEquals( "Number should be lower bound value.",
LOWER_BOUND,
actual );
-
Assert#fail()
无条件地引发断言错误。 这对于标记不完整的测试或确保引发了预期的异常可能很有帮助(另请参见“ 测试结构”中的“预期异常”部分)。 -
Assert#assertXXX(Object)
用于验证变量的初始化状态。 为此,存在两个称为assertNull(Object)
和assertNotNull(Object)
。 -
Assert#assertXXX(boolean)
方法测试boolean参数传递的预期条件。 调用assertTrue(boolean)
期望条件为true
,而assertFalse(boolean)
期望相反。 -
Assert#assertXXX(Object,Object)
和Assert#assertXXX(value,value)
方法用于对值,对象和数组进行比较验证。 尽管结果没有区别,但通常的做法是将期望值作为第一个参数,将实际值作为第二个参数。
所有这些类型的方法都提供带有String
参数的重载版本。 如果发生故障,此参数将合并到断言错误消息中。 许多人认为这有助于更清楚地指定失败