Есть ли простой способ сопоставить поле с помощью Hamcrest? - PullRequest
5 голосов
/ 17 февраля 2011

Я хочу проверить, соответствует ли определенное поле объекта указанному мной значению. В данном случае это имя корзины внутри объекта S3Bucket. Насколько я могу судить, мне нужно написать собственный сопоставитель для этого:

mockery.checking(new Expectations() {{
  one(query.s3).getObject(with(
      new BaseMatcher<S3Bucket>() {
        @Override
        public boolean matches(Object item) {
          if (item instanceof S3Bucket) {
            return ((S3Bucket)item).getName().equals("bucket");
          } else {
            return false;
          }
        }
        @Override
        public void describeTo(Description description) {
          description.appendText("Bucket name isn't \"bucket\"");
        }
      }), with(equal("key")));
    ...
    }});

Было бы неплохо, если бы был более простой способ сделать это, например:

mockery.checking(new Expectations() {{
  one(query.s3).getObject(
    with(equal(methodOf(S3Bucket.class).getName(), "bucket")),
    with(equal("key")));
    ...
}});

Кто-нибудь может указать мне на что-то подобное? Думаю, я уже решил свою проблему в этом случае, но я не первый раз желаю более простого способа.

Ответы [ 3 ]

9 голосов
/ 21 февраля 2011

Кроме того, для более безопасной версии есть FeatureMatcher. В этом случае что-то вроде:

private Matcher<S3Bucket> bucketName(final String expected) {
  return new FeatureMatcher<S3Bucket, String>(equalTo(expected), 
                                              "bucket called", "name") {
     String featureValueOf(S3Bucket actual) {
       return actual.getName();
     }
  };
}

дает:

mockery.checking(new Expectations() {{
  one(query.s3).getObject(with(bucketName("bucket")), with(equalTo("key")));
    ...
}});

Цель двух строковых аргументов - сделать отчет о несоответствии хорошо прочитанным.

2 голосов
/ 17 февраля 2011

Похоже, вам нужно использовать Matchers.hasProperty, например,

mockery.checking(new Expectations() {{
  one(query.s3).getObject(
    with(hasProperty("name", "bucket")),
    with(equal("key")));
    ...
}});

или что-то подобное.

1 голос
/ 22 ноября 2011

Есть отличный способ сделать это с LambdaJ:

mockery.checking(new Expectations() {{
  one(query.s3).getObject(
    with(having(on(S3Bucket.class).getName(), is("bucket")))
  )
}});
...