0

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

4

1 回答 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"));
    }
}

静态方法的验证分两个步骤执行。在这里解释

于 2019-03-02T17:52:29.240 回答