Разница в компиляции Hamcrest Matcher между Eclipse и javac - PullRequest
5 голосов
/ 30 ноября 2011

Я пытаюсь использовать настраиваемое сопоставление из hamcrest в сопоставителе hasItem

  @Test
  public void populatesChildCompanies() {
    final long firstChildId = 2;
    final String firstChildName = "jim";
    final long secondChildId = 3;
    final String secondChildName = "adam";
    final List<Company> childCompanies = asList(createCompanyForRelation(firstChildCid, firstChildName),
        createCompanyForRelation(secondChildCid, secondChildName));
    company.getChildCompanies().addAll(childCompanies);

    final CompanyOverview companyOverview = new CompanyOverview(company);

    assertThat(companyOverview.getChildCompanies(), hasItem(companyRelation(firstChildName, firstChildId)));
    assertThat(companyOverview.getChildCompanies(), hasItem(companyRelation(secondChildName, secondChildId)));
  }

Сопоставитель выглядит так

  public static final Matcher<CompanyRelation> companyRelation(final String name, final long id) {
    return new TypeSafeMatcher<CompanyRelation>() {

      @Override
      protected boolean matchesSafely(final CompanyRelation companyRelation) {
        return name.equals(companyRelation.getName()) && id == companyRelation.getId();
      }

      @Override
      public void describeTo(final Description description) {
        description.appendText(format("a company relation with a name of %s and a CID of %s", name, id));
      }

      @Override
      protected void describeMismatchSafely(final CompanyRelation companyRelation, final Description description) {
        description.appendText(format("[%s, %s]", companyRelation.getName(), companyRelation.getId()));
      }
    };
  }

Это прекрасно работает из затмения, но при сборке с maven из командной строки выдает исключение:

[ERROR] CompanyOverviewTest.java:[96,4] cannot find symbol
[ERROR] symbol  : method assertThat(java.util.List<CompanyRelation>,org.hamcrest.Matcher<java.lang.Iterable<? super java.lang.Object>>)

Я знаю, что это проблема стирания типа, и что это связано с некоторой разницей между компилятором eclipse и командной строкой, но я не уверен в лучшем способе ее решения.

Ответы [ 3 ]

5 голосов
/ 08 августа 2012

проблема возникает, когда реализация TypeSafeMatcher является внутренним классом.

Перемещение совпадения в один файл .java должно решить вашу проблему.

1 голос
/ 21 января 2012

Я бы сравнил банки JUnit и Hamcrest, используемые в Eclipse, а также Maven. Много раз Eclipse объединяет свои собственные JUnit и Hamcrest jar, которые отличаются от тех, которые вы могли определить в Maven pom.xml

0 голосов
/ 22 января 2016

Максимальное значение правильно - проблема с использованием TypeSafeMatcher. Однако если вместо этого вы используете CustomTypeSafeMatcher , это должно позволить сборке Maven успешно завершиться.

...