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.
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With