Сравнение числа Hamcrest с использованием между

Есть ли способ в Hamcrest сравнить число в диапазоне чисел? Я ищу что-то вроде этого:

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

person saw303    schedule 08.10.2012    source источник


Ответы (4)


Альтернативой решению Джеффа является использование both:

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

Я думаю, это вполне читабельно. Вы также получите хорошее сообщение об ошибке, если проверка не удалась:

Ожидаемый: is (значение больше ‹50L> и значение меньше ‹1658L>) получено: ‹50L>

person Christoph Leiter    schedule 08.10.2012
comment
Я не нашел оператор импорта для both. Кто-нибудь может помочь? - person Leonel Sanches da Silva; 20.06.2013
comment
@CiganoMorrisonMendez Это в org.hamcrest.CoreMatchers - person Christoph Leiter; 21.06.2013
comment
Спасибо. У меня он не появился, потому что LambdaJ использует hamcrest-all-1.1, в котором нет этой реализации. Я нашел его в версии 1.2 или выше. - person Leonel Sanches da Silva; 21.06.2013
comment
Это также хорошо работает со сравнениями java.util.Date, поскольку Date реализует Comparable - person GameSalutes; 22.08.2017

Я не верю, что between является частью основных средств сопоставления подколенного сухожилия, но вы можете сделать что-то вроде этого:

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

Это все еще немного некрасиво, поэтому вы можете создать вспомогательный метод между

assertThat(number, between(min,max))

и between выглядит так

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

Все еще не фантастическое решение, но оно читается как сопоставитель подколенного сухожилия.

Если вы не можете найти его в открытом доступе, было бы тривиально написать собственный between сопоставитель http://code.google.com/p/hamcrest/wiki/Tutorial.

person Jeff Storey    schedule 08.10.2012

Если вы имеете дело с целыми числами, вам следует рассмотреть возможность использования метода closeTo:

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

к сожалению, для целых чисел нет closeTo, но каждое 32-битное целое число можно представить двойным числом, поэтому вы можете просто привести их к удвоению и продолжить.

Это не совсем эквивалентно between, но иногда может быть полезно.

person Elazar Leibovich    schedule 09.09.2013

Другой вариант — использовать расширение 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>
person JeanValjean    schedule 30.12.2015