2015-01-24 3 views
9

Я использую PowerMockito для издевательства частного вызова метода (privateApi), но он по-прежнему делает вызов privateApi, который, в свою очередь, делает другой thirdPartCall. Я попадаю в проблему, когда thirdPartyCall выдает исключение. Насколько я понимаю, если я издеваюсь над privateApi, он не должен разбираться в деталях реализации метода и возвращать макет ответа.Мощный частный метод с использованием PowerMockito

public class MyClient { 

    public void publicApi() { 
     System.out.println("In publicApi"); 
     int result = 0; 
     try { 
      result = privateApi("hello", 1); 
     } catch (Exception e) { 
      Assert.fail(); 
     } 
     System.out.println("result : "+result); 
     if (result == 20) { 
      throw new RuntimeException("boom"); 
     } 
    } 

    private int privateApi(String whatever, int num) throws Exception { 
     System.out.println("In privateAPI"); 
     thirdPartyCall(); 
     int resp = 10; 
     return resp; 
    } 

    private void thirdPartyCall() throws Exception{ 
     System.out.println("In thirdPartyCall"); 
     //Actual WS call which may be down while running the test cases 
    } 
} 

Вот тестовый пример:

@RunWith(PowerMockRunner.class) 
@PrepareForTest(MyClient.class) 
public class MyclientTest { 

    @Test(expected = RuntimeException.class) 
    public void testPublicAPI() throws Exception { 
     MyClient classUnderTest = PowerMockito.spy(new MyClient()); 
     PowerMockito.when(classUnderTest, "privateApi", anyString(), anyInt()).thenReturn(20); 
     classUnderTest.publicApi(); 
    } 
} 

консоли трассировки:

In privateAPI 
In thirdPartyCall 
In publicApi 
result : 20 

ответ

17

Вам просто нужно изменить макет вызова метода использовать doReturn.

Example Partial Mocking of Private Method

Код испытания

@RunWith(PowerMockRunner.class) 
@PrepareForTest(MyClient.class) 
public class MyClientTest { 

    @Test(expected = RuntimeException.class) 
    public void testPublicAPI() throws Exception { 
     MyClient classUnderTest = PowerMockito.spy(new MyClient()); 

     // Change to this 

     PowerMockito.doReturn(20).when(classUnderTest, "privateApi", anyString(), anyInt()); 

     classUnderTest.publicApi(); 
    } 
} 

консоли след

In publicApi 
result : 20 
+0

Привет спасибо за Ваш ответ вы можете, пожалуйста, взгляните на мой вопрос, который связан с этим : http://stackoverflow.com/questions/35561709/can-not-mock-the-private-method-with-moc kito –

+0

как насчет частных частных методов? –

+0

не могли бы вы дать некоторый код для void с частными методами, используя powerMockito? @cID –

Смежные вопросы