【问题标题】:How to Stop static initialization with PowerMockito如何使用 PowerMockito 停止静态初始化
【发布时间】:2019-02-28 19:16:02
【问题描述】:

我正在开发一个用于工作的 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】:

    为了抑制静态初始化,您应该使用@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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-14
      • 2017-03-14
      • 2014-04-15
      • 2013-04-29
      • 2011-01-12
      • 1970-01-01
      • 2019-04-15
      • 2014-05-19
      相关资源
      最近更新 更多