2011-02-01 15 views
12

Io uso PowerMock 1.4.7 e 4.8.2 JUnitPowerMock: beffardo di metodi statici (+ restituire i valori originali in alcuni metodi particolari)

ho bisogno di prendere in giro solo alcuni metodi statici e voglio che gli altri (dal stessa classe) solo per restituire il valore originale. Quando simulo con e non chiami when().doReturn() tutti i metodi statici restituiscono i loro valori di default - come null quando restituiscono l'oggetto o falso quando si restituisce booleano ... ecc. Quindi cerco di usare thenCallRealMethod esplicitamente su ogni metodo statico per restituire implementazione predefinita (significa che non beffardo/no falsi), ma non so come chiamare su ogni possibili variazioni argomenti (= quello che voglio per ogni possibile chiamata in ingresso metodo originale). So solo come deridere la variazione di argomenti concreti.

risposta

27

È possibile utilizzare una spia sul tuo classe statica e solo metodi specifici finte:

@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

Sebbene funzioni, prestare attenzione quando si utilizzano gli argomenti di corrispondenza. Se si dovesse usare _Mockito.any() _ e si sta provando a stubare il metodo di una spia, l'impl reale getB() viene invocata durante la valutazione dell'istruzione di stub. Se getB() non riesce a gestire argomenti nulli, verrà generato un NPE. –

12

È possibile anche utilizzare l'API stubbing:

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

Edit:

Per utilizzare stub e method importare staticamente i metodi da questi pacchetti:

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

Per maggiori informazioni fare riferimento al documentation.

+0

Questo approccio ha funzionato per me, ma la risposta di denis.solonenko no. È difficile capire quando usare doReturn, when, given e stub, che tutti pretendono di fare circa la stessa cosa. Ciascuno funziona a volte e non altri –

+0

Questo approccio ha funzionato per me mentre facevo il mocking parziale con la classe statica. – srinannapa

+1

Grazie, per favore aggiungi lo scope metodo 'stub' – Mrusful