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