var _gaq = _gaq || []; _gaq.push(['_setAccount', 'UA-333696-1']); _gaq.push(['_trackPageview']); _gaq.push(['_trackPageLoadTime']); (function() { var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); })();
  • 2008年04月05日

    【翻译】时间是随机的

    分类:

    原文链接

     

    一个方法如何能被有效地测试当它的输入不能被确定?考虑Java中的此方法:

    /** 返回一个日期对象,表示现在的下一分钟开始 */

    public Date nextMinuteFromNow() {

      long nowAsMillis = System.currentTimeMillis();

      Date then = new Date(nowAsMillis + 60000);

      then.setSeconds(0);

      then.setMilliseconds(0);

      return then;

    }

     

    有效地测试此方法有两个障碍:

    1.     没有简便方法测试极限场景;你的系统时钟提供输入条件支配。

    2.     nextMinuteFromNow()返回时, 时间已变化。这意味着测试不将是一个断言,它将是一个推测,并可能生成低频率、难以再现的失败。。。片状!类加载和垃圾收集暂停,例如,可以影响这。

     

    是否System.currentTimeMillis(),开始看起来有点像一个随机数字提供函数?这是因为它是!当前的时间还是未确定性的其他源;nextMinuteFromNow()的结果不能很容易地从其输入确定。幸运的是,这很容易解决:使当前时间作为一个输入参数,你可以控制它。

    public Date minuteAfter(Date now) {

      Date then = new Date(now.getTime() + 60000);

      then.setSeconds(0);

      then.setMilliseconds(0);

      return then;

    }

     

    //保留原来的功能

    @Deprecated public Date nextMinuteFromNow() {

      return minuteAfter(new Date(System.currentTimeMillis()));

    }

     

    编写minuteAfter()的测试是一项比编写nextMinuteFromNow()的测试更容易的任务:

    public void testMinuteAfter () {

      Date now = stringToDate("2012-12-22 11:59:59.999PM");

      Date then = minuteAfter(now);

      assertEquals("2012-12-23 12:00:00.000AM", dateToString(then));

    }

     

    这仅是解决此问题的一种方法。还可以使用依赖注入和可变的单例。

    分享到:

    历史上的今天:

    版权的终结 2006年04月05日
    WCDMA协议业务总结 2006年04月05日