2010-06-09 8 views
6

La documentación EasyMock es bastante claro queEasyMock - cambiar el comportamiento de equals() y otros métodos de objetos,

El comportamiento de los tres métodos de objeto es igual a(), hashCode() y toString() no puede ser cambiado para Simulacros de objetos creados con EasyMock, incluso si son parte de la interfaz para la que se crea el objeto simulado.

El código que estoy tratando de probar utiliza equals() para comparar mi objeto de simulacro con otra cosa. Me gustaría hacer algo como

expect(mock.equals(obj)).andReturn(false); 

Cuando hago eso, obtengo una IllegalStateException. No es de extrañar, dado lo que dice la documentación.

¿Alguien tiene alguna sugerencia para un enfoque alternativo? ¿Hay alguna otra forma de controlar qué devolverá el objeto simulado cuando se llame a igual() sobre él? Supongo que puedo crear una subclase que anula iguales()

class FooImplOverrideEquals extends FooImpl { 
    public boolean equals; 
    public boolean equals(Object obj) { return equals; } 
} 
FooImplOverrideEquals mock = createMock(FooImplOverrideEquals.class); 
mock.equals = false; // instead of expect(mock.equals(obj)).andReturn(false); 

pero esto parece poco elegante. Siento que me falta algo importante (como la razón por la cual EasyMock no te permite anular esos métodos de objetos). ¿Hay una mejor solución?

+0

Si lo que desea es llamar m ock.equals (algo), ¿no puedes simplemente renombrar el método: mock.equalsalt (algo)? –

+0

Sí, pero en el código que estoy probando quiero usar .equals() y no .equalsalt(). –

+0

Creo que, en lugar de burlarse, necesitas usar stubs :) –

Respuesta

4

Muchas de las bibliotecas de burlas no admiten esto porque generalmente es una mala idea. Si está haciendo una comparación equals(), entonces tiene un objeto de valor, no un colaborador real y será mejor que utilice una instancia real. Si usa equals() para representar algún otro concepto (isBestFriendsWith (other)), entonces puede adjuntarlo si corresponde.

+1

En el caso particular que generó mi pregunta, terminé usando una instancia real en lugar de una simulación. Su explicación sobre los objetos de valor frente a los colaboradores tiene mucho sentido y eso es probablemente lo que estaba en el fondo de mi mente, aunque no había identificado conscientemente esos dos roles. –

3

No puede cambiar el comportamiento de iguales, pero puede usar un Comparador para implementar comparaciones personalizadas o parciales.

continuación, puede utilizar el comparador de EasyMock expectativa con el método:

EasyMock.cmp 

Por ejemplo, si usted tiene una persona de clase con un nombre y una variables de instancia de edad, y que están interesados ​​sólo en la comparación de la nombre:

public class Person { 
    String name; 
    int age; 

public boolean equals(Object obj) { 
     // the equals method compares the name and the age, but we are interested only in     
     // comparing the name 
     // other not-null checks... 
     Person other = (Person) obj; 
     if (this.age != other.age) { 
      return false; 
     } 
     if (other.name != null) { 
      return false; 
     } 
     return true; 
    } 
} 

public class PersonComparator implements Comparator<Person> { 
     @Override 
     public int compare(Person person1, Person person2) { 
      //compare only the name 
      if (person1.getName().equals(person2.getName())) { 
       return 0; 
      } 
      return -1; 
     } 

} 

Y el uso de EasyMock.expect esta manera:

PersonComparator nameComparator = new PersonComparator(); 

Person person = new Person("Ana"); //the age doesn't matter 

Person expectedPerson = EasyMock.cmp(comparisonPerson, nameComparator, LogicalOperator.EQUAL); 

EasyMock.expect(personService.authenticate(expectedPerson)).andReturn(true); 
Cuestiones relacionadas