2016-03-18 4 views
1

Im пытается сделать простой, как, например, может, который можно найти на странице официального PowerMock в (here) .I»делать частичную издеваться этого класса:Powermock частный раскорчевка gows неправильно

public class Simple { 


    public String doMe() { 
     return privateMethod(); 
    } 

    private String privateMethod() { 
     return "POWERMOCK sucks"; 

    } 

} 

И написал простой тест класс:

@RunWith(PowerMockRunner.class) 
@PrepareForTest(Simple.class) 
public class ProcessorTest { 

    @Test 
    public void doMe() throws Exception { 
     Simple spy = PowerMockito.spy(new Simple()); 
     PowerMockito.doReturn("hello").when(spy, "privateMethod"); 
     String res = spy.doMe(); 

     PowerMockito.verifyPrivate(spy, Mockito.times(1000)).invoke(
       "privateMethod"); 
     Assert.assertEquals(res, "hello"); 
    } 


} 

Но результат таков:

java.lang.AssertionError: expected [hello] but found [null] 
Expected :hello 
Actual :null 
<Click to see difference> 


    at org.testng.Assert.fail(Assert.java:94) 

Так Powermo ck не только не высмеивает privateMethod и возвращает «null», это нормально, так как он был вызван 1000 раз, когда это было не так.

Это получить еще более жуткое, если я пытаюсь возиться с насмешливым, как это:

PowerMockito.doReturn(1).when(spy, "privateMethod"); 

Так что я пытаюсь вернуть Integer вместо строки из privateMethod. Тогда я получаю это:

org.mockito.exceptions.misusing.WrongTypeOfReturnValue: 
Integer cannot be returned by doMe() 
doMe() should return String 
*** 

Так по какой-то причине Powermock пытается издеваться общественный doMe метод.

Любой понимает, что происходит? Я не.

Спасибо.

Моя среда:

Java 1.8, Mockito 1.10.19, Powermock 1.6.2

+0

Я не могу воспроизвести вашу проблему, используя фрагмент кода. Пожалуйста, см. Мой пример в [Github] (https://github.com/thekingnothing/stackoverflow/tree/master/q36086167) –

+0

, какая у вас конфигурация? – Anton

+0

Я использую: JDK «1.8.0_74» для MacOS, а все другие библиотеки имеют ту же версию, что и вы. Вы можете проверить это на Github –

ответ

0

Хорошо, я нашел решение, проблема заключалась в том, что JUnit-х @RunWith фактически не сделать трюк, так что я должен был простирайтесь от PowerMockTestCase, чтобы заставить его работать. Тест теперь выглядит так, и он работает как шарм:

@PrepareForTest(Simple.class) 
public class ProcessorTest extends PowerMockTestCase { 
    @Test 
    public void doMe() throws Exception { 
     Simple spy = PowerMockito.spy(new Simple()); 
     PowerMockito.doReturn("hello").when(spy, "privateMethod"); 

     String res = spy.doMe(); 

     PowerMockito.verifyPrivate(spy, Mockito.times(1)).invoke(
       "privateMethod"); 
     Assert.assertEquals(res, "hello"); 
    } 
} 
Смежные вопросы