2014-08-31 1 views
10

Sto provando a prendere in giro il metodo statico privato anotherMethod(). Vedere codice qui sottoCome posso prendere in giro il metodo statico privato con PowerMockito?

public class Util { 
    public static String method(){ 
     return anotherMethod(); 
    } 

    private static String anotherMethod() { 
     throw new RuntimeException(); // logic was replaced with exception. 
    } 
} 

Ecco me è il codice di prova

@PrepareForTest(Util.class) 
public class UtilTest extends PowerMockTestCase { 

     @Test 
     public void should_prevent_invoking_of_private_method_but_return_result_of_it() throws Exception { 

      PowerMockito.mockStatic(Util.class); 
      PowerMockito.when(Util.class, "anotherMethod").thenReturn("abc"); 

      String retrieved = Util.method(); 

      assertNotNull(retrieved); 
      assertEquals(retrieved, "abc"); 
     }  
} 

Ma ogni piastrella l'eseguo ottengo questa eccezione

java.lang.AssertionError: expected object to not be null 

Suppongo che sto facendo qualcosa di sbagliato con beffarda cose. Qualche idea come posso risolverlo?

risposta

23

Per questo, è possibile utilizzare PowerMockito.spy(...) e PowerMockito.doReturn(...). Inoltre, è necessario specificare il corridore PowerMock a vostra classe di test, come segue:

@PrepareForTest(Util.class) 
@RunWith(PowerMockRunner.class) 
public class UtilTest { 

    @Test 
    public void testMethod() throws Exception { 
     PowerMockito.spy(Util.class); 
     PowerMockito.doReturn("abc").when(Util.class, "anotherMethod"); 

     String retrieved = Util.method(); 

     Assert.assertNotNull(retrieved); 
     Assert.assertEquals(retrieved, "abc"); 
    } 
} 

Spero che ti aiuta.

-1

non sono sicuro quale versione di PowerMock che si sta utilizzando, ma con la versione successiva, si dovrebbe utilizzare @RunWith(PowerMockRunner.class) @PrepareForTest(Util.class)

Detto questo, trovo usando PowerMock per essere davvero problematico e un segno sicuro di un povero design. Se hai il tempo/l'opportunità di cambiare il design, proverei a farlo prima.

+0

No. Per 'TestNG' ho bisogno di usare le mie annotazioni. – Aaron

4

Se anotherMethod() prende qualsiasi argomento come anotherMethod (parametro), la corretta invocazione del metodo sarà:

PowerMockito.doReturn("abc").when(Util.class, "anotherMethod", parameter);