5

hasItem マッチャー内で hamcrest のカスタム マッチャーを利用しようとしています。

  @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()));
      }
    };
  }

これはEclipse内からは問題なく動作しますが、コマンドラインから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 コンパイラとコマンド ラインの違いによるものであることはわかっていますが、それを処理する最善の方法がわかりません。

4

3 に答える 3

6

TypeSafeMatcher 実装が内部クラスである場合に問題が発生します。

マッチャーを単一の .java ファイルに移動すると、問題が解決するはずです。

于 2012-08-08T15:01:13.247 に答える
1

Eclipse と Maven で使用される JUnit および Hamcrest jar を比較します。多くの場合、Eclipse は、Maven pom.xml で定義したものとは異なる独自の JUnit および Hamcrest jar をバンドルします。

于 2012-01-21T00:06:02.980 に答える
0

Maxence は正しいです - TypeSafeMatcher の使用が問題です。ただし、代わりにCustomTypeSafeMatcherを使用すると、Maven ビルドが正常に完了するはずです。

于 2016-01-22T09:32:27.367 に答える