Как остановить статическую инициализацию с помощью PowerMockito - PullRequest
0 голосов
/ 28 февраля 2019

Я работаю над API для работы, мы используем общую библиотеку для нескольких проектов для целей нашей структуры ведения журналов.Используемый класс использует все статические методы для своих вызовов.

Я пытаюсь выполнить модульное тестирование вызова API, я не могу заставить его вызывать что-либо в классе Logging, иначе это не удастся.

Я пытался использовать Powermock, но он не работает на

PowerMockito.mockStatic(LoggingFramework.class); 
Mockito.when(LoggingFramework.startACall(anyString())).thenReturn("someTimestamp");

, возвращая

ClassCastException: org.apache.logging.slf4j.SLF4JLoggerContext cannot be cast to org.apache.logging.log4j.core.LoggerContext

строку в LoggingFramework, которая его выбрасывает, находится внутри статического блока инициализаторавне каких-либо методов в классе.

1 Ответ

0 голосов
/ 02 марта 2019

Чтобы подавить статическую инициализацию, вы должны использовать @ SuppressStaticInitializationFor .Поэтому ваш код будет выглядеть так:

@RunWith(PowerMockRunner.class)
@SuppressStaticInitializationFor("so.LoggingFramework") //here goes fully-qualified name of a class
public class LoggingFrameworkTest {
    @Test
    public void test() {
        //given:
        PowerMockito.mockStatic(LoggingFramework.class);
        Mockito.when(LoggingFramework.foo(anyString())).thenReturn("stub");

        //when:
        String foo = LoggingFramework.foo("ignored");

        //then:
        PowerMockito.verifyStatic(LoggingFramework.class, Mockito.times(1));
        LoggingFramework.foo(anyString()); //two-step verification of a static method

        assertThat(foo, equalTo("stub"));
    }
}

Проверка статического метода выполняется в два этапа.Объясняется здесь

...