2011-11-29 22 views
16

Quiero burlarse de un método heredado protegida. No puedo llamar a este método directamente desde el código de Java, ya que se hereda de la clase que en otro paquete. No puedo encontrar una manera de especificar que este método de ramal en when(...)burla método protegido

package a; 

public class A() { 
    protected int m() {} 
} 

package b; 

public class B extends a.A { 
    // this class currently does not override m method from a.A 
    public asd() {} 
} 

// test 
package b; 

class BTest { 
    @Test 
    public void testClass() { 
     B instance = PowerMockito.spy(new B()); 
     PowerMockito.when(instance, <specify a method m>).thenReturn(123); 
     //PowerMockito.when(instance.m()).thenReturn(123); -- obviously does not work 
    } 
} 

Miré PowerMockito.when anulaciones y esto parece que todos ellos son sólo para los métodos privados!

Cómo especificar método protegido?

+0

@AndroidKiller, código actualizado con el nombre de la clase. En realidad podrían ser de Mockito, pero utilizo powermock y estos métodos tienen el mismo significado allí –

+0

Esa es la razón por la que siempre debemos preferir la composición a la herencia. Si no puede simplemente redefinir este método en su código probado, al igual que lo hará con el código heredado. – Brice

Respuesta

24

Cáscara de nuez: No siempre se puede usar when para espías; use doReturn.

Suponiendo que las importaciones estáticas de spy y doReturn (tanto PowerMockito):

@RunWith(PowerMockRunner.class) 
@PrepareForTest(B.class) 
public class BTest { 
    @Test public void testClass() throws Exception { 
     B b = spy(new B()); 
     doReturn(42).when(b, "m"); 
     b.asd(); 
    } 
} 

También @PrepareForTest(A.class) y podrían configurar el doReturn en when(a, "m"). Lo que tiene más sentido depende de la prueba real.

+0

guau, gracias. Curiosamente, cuando traté de usar la instancia de Method en lugar del método, fallaba el stubbing con el mensaje de excepción sobre el número incorrecto de argumentos. Pero con el nombre de cadena todo funciona perfectamente. –

+0

@mishanesterenko Sí, a veces puede ser un poco complicado. Otra opción es siempre subclasificar 'B' para los fines de la prueba. No siempre es una opción, pero es menos "mágico" que modificar bytecode;) –

+0

¿Qué harías si configuras el retorno de Methode? Digamos 'm' es un set-Methode como void m (MySpecialParser parser). Este analizador se usa para analizar mi texto. ¿Cómo puedo burlarlo? – Kayser

Cuestiones relacionadas