【问题标题】:How to use mock object mimicing a daily routine program?如何使用模拟对象模仿日常程序?
【发布时间】:2009-07-17 13:37:25
【问题描述】:

我的程序有一个日常活动,类似于闹钟事件。说,当它是下午 2 点时(时间是我电脑中的系统时间),为我做点什么。

我想做的是加快测试周期(我真的不想等待4天看日常并检查错误。)我在wiki of Mock object上阅读,作者确实提到了闹钟程序.我很高兴看到,但仍然不知道该怎么做。

我是 Mock Object 的新手,我正在使用 Java 编程。所以 JMock 或 EasyMock(或任何类似的)对我来说可能没问题。

谢谢

【问题讨论】:

    标签: java mocking alarm dailybuilds routines


    【解决方案1】:

    当你需要获取当前时间时,不要直接使用系统时钟——使用如下接口:

    public interface Clock
    {
        long currentMillis();
    }
    

    然后,您可以使用系统时钟来实现这一点以用于生产,并传入一个假货进行测试,您可以在其中将假货设置为您想要的任何时间。

    但是,您还需要模拟驱动系统的任何因素 - 您是明确等待特定时间,还是有其他东西调用您的代码?

    【讨论】:

    • 我认为你的方法适用于我的情况,因为我只是在等待特定时间进行一些日常工作。
    【解决方案2】:

    我不得不道歉,因为您已经询问了 java 并且当谈到 java 时我出去吃午饭了,但一种解决方案是模拟 DateTime 对象并将其设置为所需的时间。

    在 .NET 中它看起来像这样:

    public static class SystemTime
    {
        public static Func<DateTime> Now = () => DateTime.Now;
    }
    
    SystemTime.Now = () => new DateTime(2000,1,1);
    

    发件人:Dealing With Time In Tests


    ... [A]n 闹钟程序,它会导致 在某个时间响铃可能 从外部获取当前时间 世界。为了测试这一点,测试必须 等到闹钟时间才知道 是否已按铃 正确。如果使用模拟对象 实物的位置,可以是 编程以提供铃声 时间(是否实际上是那个时间 或不),使闹钟 程序可以单独测试。

    您引用的这个闹钟给出了一个模拟对象的示例。它实际上不是您可以在模拟框架中使用的对象。

    【讨论】:

      【解决方案3】:

      基本上,您在测试中所做的是伪造时钟事件。究竟如何在某种程度上取决于设计,以及您如何等待事件,但为了保持简单(如果不是纯粹的),我的方法是有一个在触发时间事件时调用的方法,然后测试双方那个。

      首先是测试调用方法并查看定时事件是否符合您的预期。然后模拟该类(使用 JMock 的首选方法是使其成为接口并让您的调用方法实现该接口)。

      然后您将模拟传递给处理时间的类。再次在这里,我将抽象出线程/触发问题(例如检查系统时钟和启动线程)并让模拟返回值基本上立即运行事件。

      然后将实际读取系统时钟并启动线程的真实代码保持尽可能小,这将是不进行单元测试的区域。

      【讨论】:

        【解决方案4】:

        模拟与单元测试有关。对于您所描述的功能,我会将触发器(在您的情况下为闹钟事件)与流程(无论您的“日常”在做什么)分开,并对流程功能进行单元测试。

        然后将您的注意力引向将调用您的流程功能的调度代码。我建议为此使用Quartz 之类的东西,但是如果您要role-your-own,它的单元测试可以使用实际的系统时钟,前提是您根据系统时钟的当前值,因为您将要测试的只是触发事件发生。

        【讨论】:

        • 酷,这很简单 :-) 重新测试 Quartz 没有意义,只需按照我的建议测试您的功能即可。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-09
        • 1970-01-01
        相关资源
        最近更新 更多