Менее Hamcrest, чем не компилируется - PullRequest
7 голосов
/ 30 ноября 2009

Попытка скомпилировать этот код

import static org.hamcrest.Matchers.is;
import static org.hamcrest.number.OrderingComparison.lessThan;

...

Assert.assertThat(0, is(lessThan(1)));

выдает эту ошибку компиляции:

assertThat(Object, org.hamcrest.Matcher<java.lang.Object>) не может применяться к (int, org.hamcrest.Matcher<capture<? super java.lang.Integer>>)

Может быть, это столкновения между различными версиями Hamcrest? Я использую jUnit 4.6 и hamcrest 1.3

Ответы [ 4 ]

5 голосов
/ 01 ноября 2010

Я считаю, что проблема в том, что JUnit поставляется в комплекте со старой версией Hamcrest (1.1), так как подписи в более поздней версии Hamcrest несовместимы с JUnit. Есть два возможных решения:

  1. Удалите свою версию Hamcrest (1.3) из пути к классам и используйте копию, прилагаемую к JUnit.
  2. Используйте другую версию выпуска JUnit (я считаю, что jar названы как 'junit-dep-xxx.jar), которая не включает Hamcrest
  3. Изменить вызовы org.junit.Assert.assertThat() на org.hamcrest.MatcherAssert.assertThat () `.

Последнее, вероятно, мой рекомендуемый вариант, поскольку версия Hamcrest assertThat() выдает более приятные сообщения об ошибках, а версии более поздних, чем 1.1, имеют некоторые приятные функции (например, TypeSafeDiagnosingMatcher).

1 голос
/ 02 декабря 2009

Я думаю, возможно, проблема в том, что вы используете метод assertThat. Если это говорит,

void assertThat(Object item, Matcher<Object> matcher) { ... }

тогда вам нужно изменить его на:

void <T> assertThat(T item, Matcher<? super T> matcher) { ... }

Может быть, ваша библиотека JUnit устарела по сравнению с вашей библиотекой Hamcrest? Вы сами их построили? Возможно, у вас есть несколько копий JUnit или Hamcrest в вашем классе?

1 голос
/ 30 ноября 2009

Я не использую Hamcrest, но, очевидно, int не является объектом. Вместо этого используйте Integer, например

Assert.assertThat(Integer.valueOf(0), is(lessThan(1)));

Полагаю, вы используете версию Java <= 1.4, где автобокс не работает Следовательно, сначала вам нужно явное преобразование в <code>Integer.

0 голосов
/ 02 декабря 2009

Это очень странная проблема. Я думаю, что нам нужно больше информации, так как она должна работать правильно. Я попытался воспроизвести его, используя JUnit 4.4 и Hamcrest 1.1 (немного старше, но это то, что я использую в моем текущем проекте, так что его было легко протестировать), и он работал отлично.

Единственное отличие, которое я заметил, это то, что мой Eclipse импортировал org.hamcrest.Matchers.lessThan вместо org.hamcrest.number.OrderingComparisons.lessThan, но когда я использовал последний, он также работал безупречно.

Это может быть вызвано тем, что вы используете старую версию Hamcrest или JUnit (какие версии вы на самом деле используете? Вы еще не упомянули об этом). Странно то, что вы получили ошибку, даже если вы добавили явное приведение к Integer. Это интересно, и это может быть полезно, когда вы публикуете эту ошибку ...

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...