2017-02-03 11 views
2

У меня есть класс, который имеет частный метод и вызывает другой частный метод в своем теле. Поэтому я хочу вызвать первый частный метод и высмеять второй. Вот пример:PowerMockito вызывает реальный метод, а не издевается над личным

public class ClassWithPrivateMethod { 

    private int count; 

    public ClassWithPrivateMethod() { 
    } 

    private void countDown() { 
     while (isDecrementable()) 
      count--; 
    } 

    private boolean isDecrementable() { 

     throw new IllegalArgumentException(); 
//  if (count > 0) return true; 
//  return false; 
    } 
} 

И тестовый класс:

@RunWith(PowerMockRunner.class) 
@PrepareForTest(ClassWithPrivateMethodTest.class) 
public class ClassWithPrivateMethodTest { 

    private int count; 
    private ClassWithPrivateMethod classWithPrivateMethod; 

    @Before 
    public void setUp() throws Exception { 
     count = 3; 
     classWithPrivateMethod = PowerMockito.spy(new ClassWithPrivateMethod()); 
    } 

    @Test 
    public void countDown() throws Exception { 

     Whitebox.setInternalState(classWithPrivateMethod, "count", count); 
     PowerMockito.doReturn(true, true, false).when(classWithPrivateMethod, "isDecrementable"); 

     Whitebox.invokeMethod(classWithPrivateMethod, "countDown"); 

     int count = Whitebox.getInternalState(classWithPrivateMethod, "count"); 

     assertEquals(1, count); 

     PowerMockito.verifyPrivate(classWithPrivateMethod, times(3)).invoke("isDecrementable"); 
    } 
} 

я вызван первый частный метод, Whitebox.invokeMethod(classWithPrivateMethod, "countDown"); и притворной второй, как это, PowerMockito.doReturn(true, true, false).when(classWithPrivateMethod, "isDecrementable");. Как вы видите, метод isDecrementable должен возвращать значения true, true, false при вызове, но PowerMockito вызывает реальный метод.

Я использую эти зависимости:

<dependency> 
    <groupId>junit</groupId> 
    <artifactId>junit</artifactId> 
    <version>4.12</version> 
</dependency> 
<dependency> 
    <groupId>org.powermock</groupId> 
    <artifactId>powermock-api-mockito</artifactId> 
    <version>1.6.5</version> 
</dependency> 
<dependency> 
    <groupId>org.powermock</groupId> 
    <artifactId>powermock-module-junit4</artifactId> 
    <version>1.6.5</version> 
    <scope>test</scope> 
</dependency> 
<dependency> 
    <groupId>org.mockito</groupId> 
    <artifactId>mockito-core</artifactId> 
    <version>1.10.19</version> 
</dependency> 

Что случилось с моим испытанием?

ответ

4

Я нашел ошибку в этой строке:

@PrepareForTest(ClassWithPrivateMethodTest.class) 

Оно должно быть:

@PrepareForTest(ClassWithPrivateMethod.class)