使用之间的Hamcrest号码比较

Hamcrest有没有办法在数字范围内比较一个数字? 我正在寻找这样的东西:

assertThat(50L, is(between(12L, 1658L))); 

杰夫的解决scheme的另一种select是使用both

 assertThat(50L, is(both(greaterThan(12L)).and(lessThan(1658L)))); 

我认为这是很可读的。 如果检查失败,您也会得到一个很好的错误信息:

预期:是(大于<50L>和小于<1658L>的值)得到:<50L>

我不相信这是核心Hamcrest匹配者的一部分,但你可以这样做:

 assertThat(number, allOf(greaterThan(min),lessThan(max))); 

这仍然有点难看,所以你可以创build一个辅助方法

 assertThat(number, between(min,max)) 

between样子

 allOf(greaterThan(min),lessThan(max)) 

仍然不是一个梦幻般的解决scheme,但它看起来像一个hamcrest匹配器。

如果您找不到公开发布的内容,则可以between匹配器http://code.google.com/p/hamcrest/wiki/Tutorial between自行编写代码。

如果你正在处理整数,你应该考虑使用closeTo方法:

 assertThat((double)nclient, is(closeTo(nserver, 1d))); 

不幸的是,整数没有closeTo ,但是每32位整数可以用一个double来表示,所以你可以简单地将它们转换为double,并继续。

这不完全相同,但有时可以帮助。

另一种select是使用Cirneco扩展 。 它有between()betweenInclusive()和更多。 这些匹配器也适用于实现Comparable其他对象(如Date )。

遵循你的例子,它将是:

 assertThat(50L, between(12L, 1658L)); 

如果你想要包含两个边界:

 assertThat(50L, betweenIncluded(12L, 1658L)); 

或者如果你只想要包含其中的一个界限:

 assertThat(50L, betweenLowerBoundIncluded(12L, 1658L)); assertThat(50L, betweenUpperBoundIncluded(12L, 1658L)); 

您可以对符合JDK7的项目使用以下依赖项:

 <dependency> <groupId>it.ozimov</groupId> <artifactId>java7-hamcrest-matchers</artifactId> <version>0.7.0</version> </dependency> 

或者如果您使用的是JDK8,则使用以下内容

 <dependency> <groupId>it.ozimov</groupId> <artifactId>java8-hamcrest-matchers</artifactId> <version>0.7.0</version> </dependency>