Home > Desarrollo, Testing > Crea tus propios Matchers

Crea tus propios Matchers

Si no sabes lo que es un Matcher, pasa por la siguiente direccion antes de leer mi articulo:

http://mockito.googlecode.com/svn/branches/1.5/javadoc/org/mockito/Matchers.html

A menudo testeando necesitamos hacer algún tipo de checkeo que Mockito no ha implementado por nosotros, pero afortunadamente nos ofrecen una forma de hacerlo. A groso modo, las implementaciones de matchers de mockito consisten en comprobar que “el metodo se ha invocado con cualquier parametro” o que “se ha invocado con exactamente unos parametros definidos por ti”. Pero a veces no nos interesa ni tanto, ni tan poco.

Por ejemplo, uno de los problemas que podemos encontrar en mysql es que en las fechas no se guardan los milisegundos. Como consecuencia, la fecha que vamos a introducir es diferente que la que recogeremos una vez persistida, pues habremos insertado una fecha que en milisegundos es 123456789234 y se recogera 123456789000. Asi que cuando queramos matchear que la fecha que hemos introducido es la misma que la persistida, tendremos un fallo. A lo mejor, queremos hacer que no se matchen los milisegundos. Vamos a ello:

Debemos heredar de la clase ArgumentMatcher, que nos obligara a implementar la funcion matches. Este metodo es el que ejecuta el mockito cuando matchea. Como argumento, tiene un Object que es el objeto que realmente se ha invocado:


public class DateMatcher extends ArgumentMatcher<Date>{

private Date dateBeforePersist;

public DateMatcher(Date dateBeforePersist){
this.dateBeforePersist=dateBeforePersist;
}

@Override
public boolean matches(Object argument) {
Date persistedDate=(Date)argument;
//Comparamos en segundos en vez de milisegundos
return persistedDate.getTime()/1000==dateBeforePersist.getTime()/1000;
}

}

Una vez hecho esto, donde antes teniamos:

Date fecha=new Date();
//Comprueba que se ha invocado someMethod con exactamente esa fecha (milisegundos incluidos)
verify(mock).someMethod(eq(fecha));

Pondremos:

Date fecha=new Date();
//Comprueba que se ha invocado someMethod con esa fecha en segundos
verify(mock).someMethod(argThat(new DateMatcher(fecha)));

Advertisements
Categories: Desarrollo, Testing Tags: ,
  1. No comments yet.
  1. No trackbacks yet.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: