2011-02-01 10 views
12

utilizo PowerMock 1.4.7 y 4.8.2 JUnitPowerMock: El imitar de métodos estáticos (+ devolver valores originales en algunos métodos particulares)

necesito para burlarse solamente algunos métodos estáticos y quiero que los demás (del misma clase) solo para devolver el valor original. Cuando me burlo con mockStatic y no llamo a when().doReturn(), todos los métodos estáticos devuelven sus valores predeterminados, como null al devolver el objeto o falso al devolver booleanos ... etc. Así que trato de usar thenCallRealMethod explícitamente en cada método estático para devolver la implementación predeterminada (significa no burlarse/sin falsificaciones) pero no sé cómo llamarlo en cada posible variación de argumentos (= Quiero para cada posible llamada de entrada método original). Solo sé cómo simular una variación concreta de argumento.

Respuesta

27

Puede utilizar un espía en su clase estática y métodos sólo específicas simuladas:

@RunWith(PowerMockRunner.class) 
@PrepareForTest(MyStaticTest.MyStaticClass.class) 
public class MyStaticTest { 

public static class MyStaticClass { 
    public static String getA(String a) { 
     return a; 
    } 
    public static String getB(String b) { 
     return b; 
    } 
} 

@Test 
public void should_partial_mock_static_class() throws Exception { 
    //given 
    PowerMockito.spy(MyStaticClass.class); 
    given(MyStaticClass.getB(Mockito.anyString())).willReturn("B"); 
    //then 
    assertEquals("A", MyStaticClass.getA("A")); 
    assertEquals("B", MyStaticClass.getA("B")); 
    assertEquals("C", MyStaticClass.getA("C")); 
    assertEquals("B", MyStaticClass.getB("A")); 
    assertEquals("B", MyStaticClass.getB("B")); 
    assertEquals("B", MyStaticClass.getB("C")); 
} 

} 
+1

Aunque esto funciona, tenga cuidado al usar los argumentos de matcher. Si tuviera que usar _Mockito.any() _ y está tratando de anclar el método de un espía, se invoca el real getB() impl durante la evaluación de la declaración de stubbing. Si getB() no puede manejar argumentos nulos, se lanzará un NPE. –

12

También puede utilizar la API de tropezar:

stub(method(MyStaticClass.class, "getB")).toReturn("B"); 

Editar:

Para utilizar stub y method importan métodos estáticos de estos paquetes:

  1. org.powermock.api.support.membermodification.MemberModifier
  2. org.powermock.api.support.membermodification.MemberMatcher

Para obtener más información consulte la documentation.

+0

Este enfoque funcionó para mí, pero la respuesta de denis.solonenko no. Es difícil entender cuándo usar doReturn, when, given y stub, que todos pretenden hacer sobre lo mismo. Cada uno funciona a veces y no a los demás –

+0

Este enfoque funcionó para mí mientras hacía burlas parciales con la clase Estática. – srinannapa

+1

Gracias, agregue el alcance del método 'stub' – Mrusful