2016-09-20 4 views
1

Я использую PowerMockito, чтобы издеваться над статическим методом, чтобы получить лучшее покрытие линии. Тест проходит, но Cobertura по-прежнему показывает обратную линию как красную. Я не уверен, что я использую PowerMockito неправильно. Любые подсказки?Mocking Static method using PowerMockito

MUT

public static Object getBean(String beanName) { 
    return AppContext.getApplicationContext().getBean(beanName); 
} 

тест Junit

@RunWith (PowerMockRunner.class) 
@PrepareForTest ({AppContext.class}) 

private ApplicationContext applicationContext; 

@Test 
public void testGetBean() throws Exception { 
    String beanName = "junitBean"; 
    applicationContext = Mockito.mock(ApplicationContext.class); 

    PowerMockito.mockStatic(AppContext.class); 

    AppContext.setApplicationContext(applicationContext); 
    PowerMockito.when(AppContext.getApplicationContext()).thenReturn(applicationContext); 
    PowerMockito.when(AppContext.getApplicationContext().getBean(beanName)).thenReturn(Object.class); 

    AppContext.getBean(beanName); 
} 
+0

Вы аннотировали свой тестовый класс, чтобы использовать лидера powerermock? – azurefrog

+0

Я только что обновил свой вопрос. Да, у меня есть аннотации. – Jaykumar

ответ

1

издеваться статические методы, PowerMock должен изменить Java байт-код вашего класса после того, как он был собран. Инструменты покрытия кода работают одинаково - они «инструмент» (google для «байт-кода инструментария») байт-код для сбора информации о том, какие строки кода были запущены.

Учитывая, что здесь есть две вещи, изменяющие уже скомпилированный код в соответствии с их собственными потребностями, неудивительно, что они плохо работают вместе. Фактически, другие средства покрытия имеют одинаковую проблему, например. this issue на странице PowerMock GitHub.

Как раз такие причины, что издевательские статические методы - плохая идея, и это должно быть сделано только в исключительных обстоятельствах. В большинстве случаев вы можете либо обернуть вызов статического метода в интерфейсе, либо передать экземпляр интерфейса тестируемому объекту или еще лучше (если код находится под вашим контролем) удалить статический метод и заменить его экземпляром метод.

Вы также можете просто передать экземпляр ApplicationContext непосредственно в конструктор вашего тестируемого класса.