2011-02-17 8 views
5

Quiero probar si un campo específico de un objeto coincide con un valor que especifico. En este caso, es el nombre del cubo dentro de un objeto S3Bucket. Por lo que yo puedo decir, tengo que escribir un matcher personalizado para esto:¿Hay una manera simple de emparejar un campo usando Hamcrest?

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

Sería bueno si hubiera una manera más sencilla de hacer esto, algo como:

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

Puede alguien señalarme algo así? Supongo que ya resolví mi problema en este caso, pero esta no es la primera vez que lo he deseado de una manera más simple.

Respuesta

9

Alternativamente, para una versión más segura, está el FeatureMatcher. En este caso, algo así como:

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

dando:

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

El propósito de los dos argumentos de cadena es hacer el informe desajuste leer bien.

2

Parece que necesita usar Matchers.hasProperty, p. Ej.

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

O algo similar.

1

Hay una clara forma de hacer esto con LambdaJ:

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