2016-02-29 3 views
0

Я использую PowerMockito для насмешливого частного метода. Но вместо этого насмехается, что это называется. Мне нужно проверить странный метод(), который вызывает privateMethod().Вызывается частный метод, а не издевается

Вот мой класс для тестирования:

public class ExampleService { 
    public String strangeMethod() { 
     privateMethod(); 
     return "Done!"; 
    } 

    private String privateMethod() { 
     throw new UnsupportedOperationException(); 
    } 
} 

Мой метод испытания:

@Test 
public void strangeMethodTest() throws Exception { 
    ExampleService exampleService = PowerMockito.spy(new ExampleService()); 
    PowerMockito.when(exampleService, "privateMethod").thenReturn(""); 
    exampleService.strangeMethod(); 
} 

В результате теста я получаю UnsupportedOperationException. Это означает, что вызывается privateMethod().

+1

Вы уверены, что вам это нужно в первую очередь? Это кажется довольно грязным, метод приватен по какой-то причине. – Neijwiert

+1

Попробуйте аннотировать тестовый класс с помощью '@PrepareForTest ({ExampleService .class})' и '@RunWith (PowerMockRunner.class)' – troig

ответ

2

Когда вы используете PowerMockito.spy(new ExampleService());, все вызовы методов сначала будут делегированы экземпляру реального класса. Что почему вы получите UnsupportedOperationException в строке:

PowerMockito.when(exampleService, "privateMethod").thenReturn("");

Если вы хотите, чтобы избежать вызова метода реального, а затем использовать PowerMockito.mock(ExampleService.class); и doCallRealMethod/thenCallRealMethod для метода, который не должен быть издевались.

Этот пример показывает, что частный метод издевались:

Класс:

public class ExampleService { 
    public String strangeMethod() { 

     return privateMethod(); 
    } 

    private String privateMethod() { 
     return "b"; 
    } 
} 

Тест:

@PrepareForTest(ExampleService.class) 
@RunWith(PowerMockRunner.class) 
public class TestPrivate { 

    @Test 
    public void strangeMethodTest() throws Exception { 
     ExampleService exampleService = PowerMockito.spy(new ExampleService()); 
     PowerMockito.when(exampleService, "privateMethod").thenReturn("a"); 
     String actual = exampleService.strangeMethod(); 

     assertEquals("a",actual); 
    } 

} 
+0

В моем примере все еще используется «шпион». Таким образом, реальный метод все еще называется один раз, когда он насмехается. Как я уже упоминал выше, вам нужно использовать «PowerMockito.mock», чтобы избежать вызова реального метода. –

+0

Но если я высмеиваю свой объект exampleService, как я могу проверить, что этот метод возвращает «Done!»? – Sviatlana

+1

Используйте doCallRealMethod или thenCallRealMethod для 'strangeMethod'. Пример: 'PowerMockito.when (exampleService.strangeMethod()). ThenCallRealMethod()'. Извините, я со своего мобильного телефона, поэтому имена методов могут быть немного неправильными или иметь опечатки. –

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