有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何使用模拟对象来模拟日常程序?

我的程序有一个每日例行程序,类似于闹钟事件。比如说,当时间是下午2点(这是我电脑中的系统时间),为我做点什么

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

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

谢谢


共 (4) 个答案

  1. # 1 楼答案

    无论何时需要获取当前时间,不要直接使用系统时钟-使用以下界面:

    public interface Clock
    {
        long currentMillis();
    }
    

    然后,您可以使用一个用于生产的系统时钟来实现这一点,并通过一个用于测试的假时钟,您可以将假时钟设置为您想要的任何时间

    然而,您还需要模拟驱动系统的任何东西——您是在明确地等待特定的时间,还是有其他东西调用您的代码

  2. # 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 alarm clock program which causes a bell to ring at a certain time might get the current time from the outside world. To test this, the test must wait until the alarm time to know whether it has rung the bell correctly. If a mock object is used in place of the real object, it can be programmed to provide the bell-ringing time (whether it is actually that time or not) so that the alarm clock program can be tested in isolation.

    你提到的这个闹钟给出了一个模拟物体的例子。它实际上不是一个可以从模拟框架中使用的对象

  3. # 3 楼答案

    基本上,你在测试中所做的是伪造时钟事件。具体的方式在一定程度上取决于设计,以及您等待事件的方式,但为了保持简单(如果不是纯粹的话),我的方法是在触发时间事件时调用一个方法,然后测试这两个方面

    首先是测试调用该方法,并查看定时事件是否达到预期效果。然后模拟该类(使用JMock,首选方法是将其作为接口,并让调用方法实现该接口)

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

    然后让真正读取系统时钟并启动线程的代码尽可能小,这将是不在单元测试范围内的区域

  4. # 4 楼答案

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

    然后将注意力转向将调用流程功能的调度代码。我建议使用类似于Quartz的方法来实现这一点,但如果你打算扮演你自己的角色,那么单元测试可以与实际的系统时钟一起工作,前提是你根据系统时钟的当前值分配触发时间,因为你要测试的只是触发事件的发生