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

我想测试一个对象的特定字段是否与我指定的值匹配。 在这种情况下,它是S3Bucket对象中的存储桶名称。 据我所知,我需要为此编写一个自定义匹配器:

mockery.checking(new Expectations() {{ one(query.s3).getObject(with( new BaseMatcher() { @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 bucketName(final String expected) { return new FeatureMatcher(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"))); ... }}); 

两个字符串参数的目的是使错配报告读得很好。

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

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

或类似的东西。

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

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