2013-02-01 4 views
27

Sto configurando i metodi statici di una classe. Devo farlo in un metodo di installazione JUnit brevettato @Before -annotato.PowerMock, simulare un metodo statico, POI chiamare i metodi reali su tutte le altre statiche

Il mio obiettivo è impostare la classe per chiamare i metodi reali, eccetto per quei metodi che ho preso in giro esplicitamente.

In sostanza:

@Before 
public void setupStaticUtil() { 
    PowerMockito.mockStatic(StaticUtilClass.class); 

    when(StaticUtilClass.someStaticMethod(antString())).thenReturn(5); // mock out certain methods... 

    // Now have all OTHER methods call the real implmentation??? How do I do this? 
} 

Il problema che sto funzionando in è che all'interno StaticUtilClass il metodo public static int someStaticMethod(String s) getta purtroppo RuntimeException se fornito con un valore null.

quindi non posso semplicemente andare via evidente di chiamare i metodi reali come la risposta predefinita nel modo seguente:

@Before 
public void setupStaticUtil() { 
    PowerMockito.mockStatic(StaticUtilClass.class, CALLS_REAL_METHODS); // Default to calling real static methods 

    // The below call to someStaticMethod() will throw a RuntimeException, as the arg is null! 
    // Even though I don't actually want to call the method, I just want to setup a mock result 
    when(StaticUtilClass.someStaticMethod(antString())).thenReturn(5); 
} 

ho bisogno di impostare la risposta predefinita per chiamare i metodi reali su tutti gli altri metodi statici dopo Prendo in giro i risultati del metodo che mi interessa prendere in giro.

È possibile?

risposta

50

Quello che stai cercando si chiama parziale beffardo.

In PowerMock è possibile utilizzare il metodo mockStaticPartial.

In PowerMockito è possibile utilizzare stubbing, che stub solo il metodo definito e lasciare altri invariato:

PowerMockito.stub(PowerMockito.method(StaticUtilClass.class, "someStaticMethod")).toReturn(5); 

Inoltre, non dimenticare la

@PrepareForTest(StaticUtilClass.class) 
+0

Non vedo neanche un stub() o un metodo mockStaticPartial() nella mia classe PowerMockito. Versione 1.5. Nella mia versione 1.9.5 della classe Mockito, vedo un metodo stub() qui: http://docs.mockito.googlecode.com/hg/org/mockito/Mockito.html#stub(T) leggendo comunque i documenti che ho trovato questo: http://docs.mockito.googlecode.com/hg/org/mockito/Mockito.html#when(T) che rileva che ** when() è un successore di stub deprecato (Object) **, quindi I non pensate che quel metodo sia destinato a essere usato più, e non farebbe quello che mi serve a prescindere. –

+0

mockStaticPartial è definito per EasyMock - Non ho capito che stavi chiedendo esplicitamente per Mockito - http://powermock.googlecode.com/svn/docs/powermock-1.5/apidocs/org/powermock/api/easymock/PowerMock. html – zibi

+1

lo stub è definito in MemberModifier che è una superclasse di PowerMockito - è lì! - http://powermock.googlecode.com/svn/docs/powermock-1.5/apidocs/org/powermock/api/support/membermodification/MemberModifier.html#stub%28java.lang.reflect.Method%29 – zibi