2012-04-18 39 views
20

Soy un poco nuevo en Mockito y me preguntaba cómo podría un par get/set.Mockito: how to stub getter setter

Por ejemplo

public interface Dummy { 
    public String getString(); 
    public void setString(String string); 
} 

¿Cómo puedo hacer que se comporten correctamente: si en algún lugar en una prueba invoco setString("something"); me gustaría volver getString() "algo". ¿Es factible o hay una mejor manera de manejar estos casos?

+1

¿Hay una razón por la que quiere burlarse 'Dummy' y no se puede simplemente utilizar un objeto ordinario implementarlo? – darrengorman

+1

Lo que @milkplusvellocet dijo. Además, si realmente quiere/necesita probar un setter, está haciendo pruebas y/o setters incorrectos. –

+0

@milkplusvellocet en realidad estoy cortando HttpServletRequest y quiero que la propiedad characterSetEncoding funcione. Hay demasiados métodos para implementar el uso de un objeto regular. Esto me hace pensar, ¿podemos burlarnos de las clases abstractas? Si es así, esa sería una solución para mí. Investigaré mañana, no tengo mi espacio de trabajo conmigo. –

Respuesta

28

También quería que el captador devolviera el resultado de la reciente llamada inicial.

Tener

class Dog 
{ 
    private Sound sound; 

    public Sound getSound() { 
     return sound; 
    } 
    public void setSound(Sound sound) { 
     this.sound = sound; 
    } 
} 

class Sound 
{ 
    private String syllable; 

    Sound(String syllable) { 
     this.syllable = syllable; 
    } 
} 

que utilizó la siguiente para conectar la incubadora al comprador:

final Dog mockedDog = Mockito.mock(Dog.class, Mockito.RETURNS_DEEP_STUBS); 
// connect getter and setter 
Mockito.when(mockedDog.getSound()).thenCallRealMethod(); 
Mockito.doCallRealMethod().when(mockedDog).setSound(Mockito.any(Sound.class)); 
0

En este caso particular para HttpServletRequest stubbing recomiendo encarecidamente el uso de la infraestructura de Spring-Mock: (http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/mock/web/package-summary.html)

Tiene burla integradas para operaciones basadas en web.

utilizan de alguna manera la respuesta a definir su propia respuesta para sus objetos se burlaban (http://mockito.googlecode.com/svn/branches/1.8.5/javadoc/org/mockito/stubbing/Answer.html)

6

puedo pensar en tres enfoques posibles.

  1. No utilice HttpServletRequest directamente en su aplicación; cree una clase contenedora para ello y tenga una interfaz para la clase contenedora. Donde sea que use actualmente HttpServletRequest en la aplicación, use la interfaz en su lugar. Luego, en la prueba, tenga una implementación alternativa de esta interfaz. Entonces, no necesitas un simulacro de Mockito en absoluto.

  2. Tenga un campo en su clase de prueba que almacene el valor al que ha configurado String. Haz dos objetos Mockito Answer; uno que devuelve el valor de este campo cuando se llama al getString, y otro que establece el valor de este campo cuando se llama al setString. Haga un simulacro de la manera habitual y córtelo para usar estas dos respuestas.

  3. Realice una clase abstracta (que puede ser una clase interna estática de su clase de prueba) que implemente la interfaz HttpServletRequest, pero que tenga el campo que desea establecer y defina el captador y el colocador. Luego simula la clase abstracta y pasa el Mockito.CALLS_REAL_METHODS como respuesta predeterminada. Cuando llamas al getter o al setter en el simulacro, el verdadero método se activará, que es el comportamiento que deseas.

Afortunadamente, una de estas tres alternativas satisfará sus necesidades.

+1

HttpSevletRequest es una interfaz en realidad, lo único es que tiene demasiados métodos para implementar como para querer hacer eso. Para la segunda opción, este es quizás el mejor enfoque. Hubiera preferido usar una clase abstracta que solo define esos dos métodos. Publicaré la solución que elegí. –

+0

Vaya, lo siento, olvidé que era una interfaz. No estoy seguro acerca de la opción 1 más; Necesito saber más sobre tu código para saber si puedo hacer que funcione. ¿Quieres probar la opción 2? Me complace ayudarte si lo necesitas. –

+0

En realidad, creo que usar una clase abstracta puede funcionar en Mockito. Todo lo que tendría que hacer es indicar que quiero invocar los "métodos reales" para getter y setter. Encontré este enlace que podría ser interesante: http://marcschwieterman.com/blog/simple-stub-creation-with-mockito-partial-mocks/ –

Cuestiones relacionadas