自定义断言
  拥有AssertJ或者Hamcrest提供的更强大的断言集合的确很好,但对于HourRange类来说,这并不是我们真正想要的。匹配器类库的另一个功能是允许你编写自己的断言。这些自定义断言的行为将与AssertJ的默认断言一样,也是说,你能够把它们串在一起。这正是我们接下来要做的。
  接下来我们将看到一个自定义断言的示例实现,但现在让我们先看看终效果。这次我们将使用(我们自己的)RangeAssert类的assertThat()方法。

@Test
public void shouldReturnHourlyRanges() throws ParseException {
// given
Date dateFrom = SDF.parse("2012-07-23 12:00");
Date dateTo = SDF.parse("2012-07-23 15:00");
// when
List<Range> ranges = HourlyRange.getRanges(dateFrom, dateTo);
// then
RangeAssert.assertThat(ranges)
.hasSize(3)
.isSortedAscending()
.hasRange("2012-07-23 12:00", "2012-07-23 13:00")
.hasRange("2012-07-23 13:00", "2012-07-23 14:00")
.hasRange("2012-07-23 14:00", "2012-07-23 15:00");
}
  即便是上面这么小的一个例子,我们也能看出自定义断言的一些优势。首先要注意的是//then后面的代码确实变少了,可读性也更好了。
  将自定义断言应用于更大的代码库时,将显现出其它优势。当我们继续使用自定义断言时,我们将注意到:
  可以很容易地复用它们。我们不强迫使用所有断言,但对特定测试用例,我们可以只选择那些重要的断言。
  特定领域语言属于我们,也是说,对于特定测试场景,我们可以根据自己的喜好改变它(例如,传入Date对象,而不是字符串)。更重要的是这样的改变不会影响到其它测试。
  高可读性。毫无疑问,因为断言包括了很多小断言方法,每一个都只关注校验的很小的某个方面,因此可以为校验方法取一个恰当的名字。
  与私有断言方法相比,自定义断言的不足是工作量要大一些。我们来看一下自定义断言的代码,它是否真的是一个很难的任务。
  要创建自定义断言,我们需要继承AssertJ的AbstractAssert类或者其子类。如下所示,我们的RangeAssert继承自AssertJ的ListAssert类。这很正常,因为我们的自定义断言将校验一个Range列表(List<Range>)。
  每一个使用AssertJ的自定义断言都会包含创建断言对象、注入被测对象的代码,然后可以使用更多的方法对其进行操作。如下面的代码所示,构造方法和静态assertThat()方法的参数都是List<Range>。
  public class RangeAssert extends ListAssert<Range> {
  protected RangeAssert(List<Range> ranges) {
  super(ranges);
  }
  public static RangeAssert assertThat(List<Range> ranges) {
  return new RangeAssert(ranges);
  }
本文内容不用于商业目的,如涉及知识产权问题,请权利人联系SPASVO小编(021-61079698-8054),我们将立即处理,马上删除。