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

谁能指出我这样的事情?我想在这种情况下我已经解决了我的问题,但这不是我第一次希望有一个更简单的方法。

4

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

两个字符串参数的目的是使不匹配报告读起来很好。

于 2011-02-21T09:34:14.093 回答
2

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

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

或类似的东西。

于 2011-02-17T19:24:44.427 回答
1

使用 LambdaJ 有一种巧妙的方法:

mockery.checking(new Expectations() {{
  one(query.s3).getObject(
    with(having(on(S3Bucket.class).getName(), is("bucket")))
  )
}});
于 2011-11-21T20:17:48.750 回答