2016-10-14 6 views
2
Class to be tested 
    public class ClassUnderTest { 
    public void functionA() { 
     functionB(); 
     functionC(); 
    } 
    private void functionB() { 
    } 
    private void functionC() { 
    } 
} 

Test ClassPowerMock не проверяя личные звонки более чем один раз

@RunWith(PowerMockRunner.class) 
public class TestClass { 
     @Test 
     public void testFunctionA() throws Exception { 
      ClassUnderTest classUnderTest = PowerMockito.spy(new ClassUnderTest()); 
      classUnderTest.functionA(); 
      PowerMockito.verifyPrivate(classUnderTest).invoke("functionB"); 
      PowerMockito.verifyPrivate(classUnderTest).invoke("functionC"); 
     } 
    } 

При выполнении тестового класса я получаю следующее сообщение об ошибке,

org.mockito.exceptions.misusing.UnfinishedVerificationException: 
Missing method call for verify(mock) here: 
-> at org.powermock.api.mockito.PowerMockito.verifyPrivate(PowerMockito.java:312) 

Example of correct verification: 
    verify(mock).doSomething() 

Also, this error might show up because you verify either of: final/private/equals()/hashCode() methods. 
Those methods *cannot* be stubbed/verified. 
Mocking methods declared on non-public parent classes is not supported. 

Если одна проверка комментируется то тестовая версия работает нормально.

+0

Здравствуйте @bharanitharan, у вас есть какие-либо решения? У меня такая же проблема ... – Abdelhafid

ответ

2

Вы должны добавить ClassUnderTest в PrepareForTest.

@RunWith(PowerMockRunner.class) 
@PrepareForTest(ClassUnderTest.class) 
public class TestClass { 

@Test 
public void testFunctionA() throws Exception { 
    ClassUnderTest classUnderTest = PowerMockito.spy(new ClassUnderTest()); 
    classUnderTest.functionA(); 

    PowerMockito.verifyPrivate(classUnderTest).invoke("functionB"); 
    PowerMockito.verifyPrivate(classUnderTest).invoke("functionC"); 
} 

Я просто добавил sysouts в частных методов & запустить тестовый класс.

0

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

Понимаете, идея приватная такова: она может быть изменена. Хороший модульный тест работает с , наблюдая поведение вашего класса - вы вызываете общедоступные методы с разными аргументами; и вы проверяете результаты возвращения. Или, может быть, вы используете инъекцию зависимостей, чтобы предоставлять издеваемым объектам свой тестовый класс - когда вашему тестовому коду нужны эти другие методы для выполнения своей работы.

Но вы должны действительно не начать проверку частных методов. Дело в том, что эти частные методы должны делать что-то, что можно наблюдать снаружи. Либо они работают над окончательным значением «возврат»; или они изменяют некоторое внутреннее состояние, которое может быть проверено другими способами. Другими словами: если те частные методы не вызывают никакого другого воздействия на ваш класс под контролем - какова была бы их цель?

+0

Я согласен с вашей точкой зрения, что вы не должны тестировать частные методы. Но в этом случае мне просто нужно проверить, был ли вызван частный метод или нет. – bharanitharan

0

Вы можете попробовать добавить две строки кода

@RunWith(PowerMockRunner.class) 
 
public class TestClass { 
 
     @Test 
 
     public void testFunctionA() throws Exception { 
 
      ClassUnderTest classUnderTest = PowerMockito.spy(new ClassUnderTest()); 
 
      PowerMockito.doNothing().when(classUnderTest, "functionB"); 
 
      PowerMockito.doNothing().when(classUnderTest, "functionC"); 
 
      classUnderTest.functionA(); 
 
      PowerMockito.verifyPrivate(classUnderTest).invoke("functionB"); 
 
      PowerMockito.verifyPrivate(classUnderTest).invoke("functionC"); 
 
     } 
 
    }