2012-06-05 19 views
20

¿Es posible simular un solo método de una clase de Java?Cómo simular un único método en java

Por ejemplo:

class A { 
    long method1(); 
    String method2(); 
    int method3(); 
} 


// in some other class 
class B { 
    void someMethod(A a) { 
     // how would I mock A.method1(...) such that a.method1() returns a value of my 
     // choosing; 
     // whilst leaving a.method2() and a.method3() untouched. 
    } 
} 

Respuesta

45

Uso Mockito's mecanismo espía:

A a = new A(); 
A aSpy = Mockito.spy(a); 
Mockito.when(aSpy.method1()).thenReturn(5l); 

El uso de un espía llama al comportamiento predeterminado del objeto envuelto por cualquier método que no se apagó.

Mockito.spy()/@Spy

+16

O, como se documenta, [en algunos casos] (http://mockito.googlecode.com/svn/branches/1.7/javadoc/org/mockito/Mockito.html#doReturn (java.lang.Object)) usted 'necesitaría 'Mockito.doReturn (51) .when (aSpy) .method1();'. – Arjan

+0

solo así. cheers –

+0

Lamentablemente, no se puede espiar una instancia de una clase final de esta manera. :( –

1

Asumiendo que están utilizando jmockit:

public void testCase(@Mocked("methodToBeMocked") final ClassBoBeMocked mockedInstance) { 
      new Expectations() {{ 
        mockedInstance.methodToBeMocked(someParameter); returns(whateverYouLikeItToReturn); 
      }} 

    mockedInstance.callSomemethod(); 
} 
6

Uso del spy() method from Mockito, y se burlan de su método como este:

import static org.mockito.Mockito.*; 

... 

A a = spy(new A()); 
when(a.method1()).thenReturn(10L); 
-2

Simplemente podría crear una subclase de A que anula method1().

+0

Esto no funcionaría, ya que tendría que pasar una instancia existente de A a la subclase de A para poder subclase para devolver a.method2() y a.method3() para llamadas a method2() y method3() respectivamente. Lo que significa que la subclase debería haber reemplazado a method2() y method3(). – auser

+0

@ user63904: ah, entonces quieres para modificar el comportamiento del método 1 INSIDE someMethod() mientras se trabaja con la instancia de A que se ha pasado como parámetro? Correcto, eso no funcionaría entonces. –

Cuestiones relacionadas