断言和AssertJ简介
一个单元测试的执行通常分为4步:
Setup
: 创建被测对象并设置被测对象状态和环境状态。Exercise
:执行被测试的方法。Verify
:断言执行结果(返回值、副作用或异常)符合预期。Teardown
:打扫环境,释放资源,将一切恢复到测试前状态。
其中的第3
步Verify
就是断言起作用的地方。
JUnit
3.x及以前的版本有自己的断言,形式如下:
assertEquals(7, calculator.add(3, 4));
有各种各样的assertXXX()方法。这些方法通常接受两个参数,第一个是预期的值,第二个是实际的值。
JUnit
4.x支持Hamcrest
断言库。例如:
assertThat(calculator.add(3, 4), equalTo(7));
但是我总觉得这样的断言编写起来很不爽。例如你很难知道针对特定的测试结果有哪些断言可用。所以我一直寻找更好的断言库,终于发现Assert
符合我对断言的一切需求。AssertJ
通过IDE
的代码补全功能,能够针对目标对象的不同类型自动提示可用的断言方法,而且更重要的是支持流式断言:
Collection<String> sut = Arrays.asList("I", "love", "you", "!");
assertThat(sut)
.isNotEmpty()
.contains("I", "love")
.doesNotContain("World");
我的建议是:忘掉JUnit
自带的断言,忘掉Hamcrest
,直接使用AssertJ
。
AssertJ
包含以下几部分:
AssertJ Core
:为JDK
中的类型(String, Iterable, Stream, Path, File, Map…
)提供断言。AssertJ Guava
:为Google Guava
中的类型(Multimap, Optional…
)提供断言。AssertJ Joda
:为Joda
时间类型(DateTime, LocalDateTime
)提供断言。AssertJ Neo4j
:为Neo4J
类型(Path, Node, Relationship…
)提供断言。AssertJ DB
:为关系数据库类型(Table, Row, Column…
)提供断言、AssertJ Swing
:为Swing
用户界面提供简单而直白的功能测试API。
本文只涉及到AssertJ Core
。AssertJ Core 3.x
需要Java 8
以上的版本。