2012-10-08 65 views
40

Hamcrest有一種方法可以比較數字範圍內的數字嗎?我期待這樣的事情:Hamcrest號碼比較使用

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

回答

60

傑夫的解決方案的一個替代方案是使用both

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

我認爲這是相當的可讀性。您還可以的情況下,檢查失敗了良好的錯誤消息:

預期:是(值大於< 50L>和值小於< 1658L>) 了:< 50L>

+0

我沒有找到_both_聲明導入。有人可以幫忙嗎? –

+2

@CiganoMorrisonMendez它在org.hamcrest.CoreMatchers –

+1

謝謝。它並沒有出現在我面前,因爲LambdaJ使用了hamcrest-all-1.1,它沒有這個實現。我發現它在1.2或更高版本。 –

20

我不相信between是核心hamcrest匹配器的一部分,但你可以做這樣的事情:

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

這還是有點難看,所以你可以

assertThat(number, between(min,max)) 

between之間創建一個helper方法,看起來像

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

仍然不是一個夢幻般的解決方案,但它看起來像一個hamcrest匹配器。

如果您找不到可公開提供的產品,那麼編寫您自己的between匹配器http://code.google.com/p/hamcrest/wiki/Tutorial將會很簡單。

12

如果你處理整數,你應該考慮使用closeTo方法:

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

不幸的是,沒有爲closeTo整數,但ē非常32位的整數可以用double來表示,所以你可以簡單地將它們轉換爲double,然後繼續。

這不完全等同於between,但有時可能會有所幫助。

1

另一種選擇是使用Cirneco extension。它有between(),betweenInclusive()和更多。這些匹配器也適用於實現Comparable的其他對象(如Date)。

按照您的例子,這將是:

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

,如果你要包括兩個界限:

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

,或者如果你只想被包含在範圍之一:

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

您CA n使用以下依賴於一個兼容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>