Powermock:模拟静态最终记录器

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Powermock:模拟静态最终记录器相关的知识,希望对你有一定的参考价值。

我正在尝试编写检查是否已记录某些行的测试。我用谷歌搜索了一段时间,但我无法弄清楚为什么没有更换LOG

要测试的类:

public class Example {
    private static final Logger LOG = LoggerFactory.getLogger(Example.class);

    public void foo(...)
    {
       if(...)
         LOG.warn("Warning");
       //...
    }
}

测试:

@RunWith(PowerMockRunner.class)
@PrepareForTest({LoggerFactory.class})
public class MyTest
{
    @Mock
    Logger logger;

    @InjectMocks
    private final Example example = new Example();

    @Test
    public void test1() {
        PowerMockito.mockStatic(LoggerFactory.class);
        logger = PowerMockito.mock(Logger.class);
        PowerMockito.when(LoggerFactory.getLogger(Example.class)).thenReturn(logger);

        example.foo(...);

        Mockito.verify(logger).warn("Warning");
    }
}

使用SLF4J和PowerMock 1.7.1。

PS:在这个项目中,替换private static final Logger LOG是没有选择的。

答案

您过早地创建主题。在创建主题后,您可以很好地安排模拟。

在安排静态模拟之后创建主题

@RunWith(PowerMockRunner.class)
@PrepareForTest({LoggerFactory.class})
public class MyTest {

    @Test
    public void test1() {
        //Arrange
        Logger logger = PowerMockito.mock(Logger.class);

        PowerMockito.mockStatic(LoggerFactory.class);           
        PowerMockito.when(LoggerFactory.getLogger(Example.class)).thenReturn(logger);

        Example example = new Example();

        //Act
        example.foo(..);

        //Assert
        Mockito.verify(logger).warn("Warning");
    }
}

以上是关于Powermock:模拟静态最终记录器的主要内容,如果未能解决你的问题,请参考以下文章

PowerMock:模拟仅影响一个测试的静态方法

powermock, 强力模拟

Spring启动在集成测试中使用PowerMock模拟静态方法

PowerMock 有啥好的替代品吗?

powermock mock静态方法为啥会执行

PowerMock