我的程序有一个日常活动,类似于闹钟事件。说,当它是下午 2 点时(时间是我电脑中的系统时间),为我做点什么。
我想要做的是加快测试周期(我真的不想等待4天看日常并检查错误。)我在Mock object的wiki上阅读,作者确实提到了闹钟程序。我很高兴看到但仍然不知道该怎么做。
我是 Mock Object 的新手,我正在用 Java 编程。所以 JMock 或 EasyMock(或任何类似的)对我来说可能没问题。
谢谢
我的程序有一个日常活动,类似于闹钟事件。说,当它是下午 2 点时(时间是我电脑中的系统时间),为我做点什么。
我想要做的是加快测试周期(我真的不想等待4天看日常并检查错误。)我在Mock object的wiki上阅读,作者确实提到了闹钟程序。我很高兴看到但仍然不知道该怎么做。
我是 Mock Object 的新手,我正在用 Java 编程。所以 JMock 或 EasyMock(或任何类似的)对我来说可能没问题。
谢谢
每当需要获取当前时间时,不要直接使用系统时钟——使用如下接口:
public interface Clock
{
long currentMillis();
}
然后,您可以使用用于生产的系统时钟来实现这一点,并传入一个假货进行测试,您可以在其中将假货设置为您想要的任何时间。
但是,您还需要模拟驱动系统的任何因素 - 您是明确等待特定时间,还是有其他东西调用您的代码?
我必须道歉,因为您已经询问了 java 并且当谈到 java 时我出去吃午饭了,但一种解决方案是模拟 DateTime 对象并将其设置为所需的时间。
在 .NET 中,它看起来像这样:
public static class SystemTime
{
public static Func<DateTime> Now = () => DateTime.Now;
}
SystemTime.Now = () => new DateTime(2000,1,1);
来自:在测试中处理时间
... [A]n 闹钟程序可以让铃声在某个时间响起,可能会从外界获取当前时间。为了测试这一点,测试必须等到闹钟时间才能知道它是否正确敲响了铃声。如果使用模拟对象代替真实对象,则可以对其进行编程以提供响铃时间(无论是否实际是那个时间),以便可以单独测试闹钟程序。
您引用的这个闹钟给出了一个模拟对象的示例。它实际上不是您可以从模拟框架中使用的对象。
基本上你在测试中所做的是伪造时钟事件。究竟如何在某种程度上取决于设计,以及您如何等待事件,但为了保持简单(如果不是纯粹的),我的方法是有一个在触发时间事件时调用的方法,然后测试双方那个。
首先是测试调用该方法并查看定时事件是否符合您的预期。然后模拟该类(使用 JMock 的首选方法是使其成为接口并让您的调用方法实现该接口)。
然后,您将模拟传递给处理时间的类。再次在这里,我将抽象出线程/触发问题(例如检查系统时钟和启动线程)并让模拟返回值基本上立即运行事件。
然后保持实际读取系统时钟并启动线程的真实代码尽可能小,这将是未进行单元测试的区域。
模拟与单元测试有关。对于您所描述的功能,我会将触发器(在您的情况下为闹钟事件)与流程(无论您的“日常工作”在做什么)分开,并对流程功能进行单元测试。
然后将您的注意力引向将调用您的流程功能的调度代码。我建议为此使用Quartz之类的东西,但是如果您要自己承担单元测试的角色,因为它可以与实际的系统时钟一起工作,前提是您根据系统时钟的当前值分配触发时间。将要测试的是触发事件是否发生。