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

发布于 2024-10-18 02:14:15 字数 948 浏览 8 评论 0原文

我想测试对象的特定字段是否与我指定的值匹配。在本例中,它是 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")));
    ...
}});

任何人都可以向我指出类似的事情吗?我想在这种情况下我已经解决了我的问题,但这并不是我第一次希望有一种更简单的方法。

I want to test whether a specific field of an object matches a value I specify. In this case, it's the bucket name inside an S3Bucket object. As far as I can tell, I need to write a custom matcher for this:

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")));
    ...
    }});

It would be nice if there were a simpler way to do this, something like:

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

Can anyone point me to something like that? I guess I've solved my problem already in this case, but this isn't the first time I've wished for a simpler way.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

北恋 2024-10-25 02:14:15

或者,对于类型更安全的版本,可以使用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")));
    ...
}});

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

Alternatively, for a more typesafe version, there's the FeatureMatcher. In this case, something like:

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

giving:

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

The purpose of the two string arguments is to make the mismatch report read well.

°如果伤别离去 2024-10-25 02:14:15

听起来你需要使用 Matchers.hasProperty,例如

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

或类似的东西。

Sounds like you need to use Matchers.hasProperty, e.g.

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

Or something similar.

波浪屿的海角声 2024-10-25 02:14:15

使用 LambdaJ 有一种巧妙的方法可以做到这一点:

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

There is a neat way of doing this with LambdaJ:

mockery.checking(new Expectations() {{
  one(query.s3).getObject(
    with(having(on(S3Bucket.class).getName(), is("bucket")))
  )
}});
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文