如何使用PowerMockito停止静态初始化

问题描述 投票:0回答:1

我正在开发一个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中抛出它的行,位于类中任何方法之外的静态初始化程序块中。

mockito classcastexception powermockito static-initialization static-initializer
1个回答
0
投票

为了抑制静态初始化,你应该使用@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"));
    }
}

静态方法的验证分两步进行。它解释了here

© www.soinside.com 2019 - 2024. All rights reserved.