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

标签 java unit-testing jmock hamcrest

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

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

最佳答案

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

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

关于java - 有没有一种使用 Hamcrest 匹配字段的简单方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5033526/

相关文章:

java - 如何在Jmock中模拟对象?如果使用 new 运算符创建对象

java - 无法解析类型 junit.framework.TestCase。它是从所需的 .class 文件中间接引用的

java - 覆盖 YAML 中的属性

java - Maven安装时编译错误

objective-c - 用于单元测试 Objective-C 代码的 GH-Unit,为什么会出现链接错误?

java - 如何检查一个方法是否返回 null?

java - 使用嵌套映射中的同级键值对访问子节点

java - Hadoop:从 JAVA 测量洗牌时间

asp.net-mvc - 使用 MvcContrib TestHelper 断言不应映射入站路由

unit-testing - 如何打破 F# 中的函数依赖关系?