Java_UT_Mock系列之-06Powermock与Logger

简介

日志几乎是所有应用所必备的模块。 在单元测试中,有时候也需要与日志类打交道。笔者用以下案例来介绍如何mock日志类,并完成相关代码行的覆盖。截图为IDE中覆盖率插件的分析结果。

image

测试代码

具体测试代码如下:

import org.junit.BeforeClass;

import org.junit.Test;

import org.junit.runner.RunWith;

import org.mockito.Mockito;

import org.powermock.core.classloader.annotations.PrepareForTest;

import org.powermock.modules.junit4.PowerMockRunner;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import demo.org.powermock.examples.LoggerDemo;

import static org.mockito.Mockito.*;

import static org.powermock.api.mockito.PowerMockito.mock;

import static org.powermock.api.mockito.PowerMockito.*;

import static org.powermock.api.mockito.PowerMockito.when;

@RunWith(PowerMockRunner.class)

@PrepareForTest({LoggerFactory.class})

public class TestLoggerDemo {

    private static Logger loggerMock;

    @BeforeClass

    public static void setup() {

        mockStatic(LoggerFactory.class);

        loggerMock = mock(Logger.class);

        when(LoggerFactory.getLogger(any(Class.class))).thenReturn(loggerMock);

    }

    @Test

    public void testLoggerInfo() {

    //when(loggerMock.isDebugEnabled()).thenReturn(true);

    LoggerDemo loggerDemo = new LoggerDemo();

    loggerDemo.toInt("100");

    //notify here is using atLeastOnce() because that loggerMock is static and all the call will be counted.

        verify(loggerMock, atLeastOnce()).info(Mockito.anyString());

    }

    @Test

    public void testLoggerDebugEnabled() {

    when(loggerMock.isDebugEnabled()).thenReturn(true);

    LoggerDemo loggerDemo = new LoggerDemo();

    loggerDemo.toInt("100");

        verify(loggerMock, times(1)).debug(Mockito.anyString());

    }

    @Test

    public void testLoggerError() {

    //when(loggerMock.isDebugEnabled()).thenReturn(true);

    LoggerDemo loggerDemo = new LoggerDemo();

    loggerDemo.toInt("出错啦");

        verify(loggerMock, times(1)).error(Mockito.anyString());

    }

}

有几个问题:

1. 关于是直接修改logger还是 通过LoggerFactory。 本案例采用了后者,技术要点是对于静态方法的Mock。避免了前者去通过反射修改私有final 变量的复杂性。

2. 由于logger是一个静态变量,在不同用例中的所有类似logger.info的方法调用次数都会被记录。本案例中,各测试用例分别会执行logger.info,所以第一个用例中如果采用以下assert会失败,

    verify(loggerMock, time(1)).info(Mockito.anyString()); 

除非控制用例执行顺序。所以采用了现有的模糊匹配方式。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,828评论 19 139
  • 欢迎来到小于的王者地盘,小于已经更新了王者峡谷71位英雄全新的推荐出装以及铭文搭配(新英雄百里玄策的教学已经 上线...
    王者小于帮阅读 4,136评论 0 1
  • 这几天简单研究了一下微信和QQ的交互设计,发现了不少有趣的点,下面分享我的一些想法。 首先是架构方面 微信使用的是...
    7win7阅读 12,171评论 22 35
  • 席慕容曾经说过 凡是美丽的 不肯也不会 为谁停留 那我就 把你 我的 故事和爱情 写在纸上 然后 珍藏在心间
    欲呼无声阅读 1,355评论 0 3

友情链接更多精彩内容