有没有一种简单的方法使用Hamcrest匹配一个字段?

5

我想测试一个对象的特定字段是否与我指定的值匹配。在这种情况下,它是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

如果需要更加类型安全的版本,可以使用 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")));
    ...
}});

两个字符串参数的目的是使不匹配报告易于阅读。

3
听起来你需要使用 Matchers.hasProperty,例如:
mockery.checking(new Expectations() {{
  one(query.s3).getObject(
    with(hasProperty("name", "bucket")),
    with(equal("key")));
    ...
}});

或类似的东西。

1

使用LambdaJ有一种简洁的方式来做到这一点:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接