Java_UT_Mock系列之-02Powermock与操作系统时间Date

测试场景

在笔者测试的某些系统中,存在一些与时间相关的系统功能。如某个程序会在每天的指定时间,如下午6点被触发,完成与外部公司的数据交换。
在系统测试时,往往需要通过修改linux的系统时间等操作来触发上述功能进而完成测试过程。这时非常不方便的,而且有时候还会因为修改了操作系统时间忘记改回,导致其它应用产生问题,如连接超时等。
而在单元测试时,为了不受外部约束,保证测试用例的健壮性,需要对系统时间进行mock。如以下的一个被测方法

public long getDoubleTime(){
        return new Date().getTime();
    }

将返回当前的系统时间。实际程序中,再将获得时间与预设定的时间进行比较,即可完成按时间触发某项工作的功能。

Mock实现

我们希望能mock掉Date类,让其能返回任意给定的预设时间,从而简化UT。但对于述代码进行分析后我们发现,UT所面临的问题是,由于时间的获取是在一个 new Date()这样的内部匿名对象中完成,无法采用mockito等普通mock工具实现mock。
因此,需要使用Powermock来完成这一需求。测试样例如下:

@Test
public void testMockTime() throws Exception {
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    sdf.setTimeZone(TimeZone.getTimeZone("GMT+8:00"));
    Date NOW = sdf.parse("2018-06-16 00:00:01");
    // everytime we call new Date() inside a method of any class
    // declared in @PrepareForTest we will get the NOW instance
    PowerMockito.whenNew(Date.class).withNoArguments().thenReturn(NOW);
//Test
SystemClass systemClass = new SystemClass();
//long time=systemClass.getDoubleTime();
assertEquals(systemClass.getDoubleTime(),NOW.getTime());
}

上述代码的核心是以下的一行代码,

 PowerMockito.whenNew(Date.class).withNoArguments().thenReturn(NOW);

每当SUT中调用了无参的Date()构造方法来new 出Date类的实例时,将返回一个预设的NOW时间。这样,我们就可以去触发那些只在指定时间才能触发的功能了。

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

相关阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,922评论 19 139
  • Mock 方法是单元测试中常见的一种技术,它的主要作用是模拟一些在应用中不容易构造或者比较复杂的对象,从而把测试与...
    熊熊要更努力阅读 28,824评论 2 25
  • 门,打开…… 风就进来了。 心门,打开…… 阳光就进来了。 那开门的钥匙, 不在你手里, 在你心里的某个角落里。
    小剧在成长阅读 215评论 0 6
  • 前言:最近美团收购摩拜单车,作为一个创业时代的热点问题,引发各个媒体纷纷关注,不少大v从各个角度做出了评论和分析,...
    萌语心晴阅读 265评论 0 1
  • 上午去厂里领了工资,由于1月份只发到20号,且货不多,只有2k多,领的现金,装在标准信封里面,牛皮纸的粗糙质感,让...
    瞿桂林阅读 53评论 0 0

友情链接更多精彩内容