unit-testing - 是否可以在单元测试中模拟时间?

标签 unit-testing time mocking

this问题...我正在尝试对以下场景进行单元测试:

我有一个类,它允许调用一个方法来执行某些操作,如果它失败,请等待一秒钟并调用该方法。

假设我想调用一个方法 DoSomething()...但是如果 DoSomething() 抛出异常,我希望能够重试最多调用它 3 次,但在每次尝试之间等待 1 秒。在这种情况下,单元测试的目的是验证当我们调用 DoSomething() 3 次并在每次重试之间等待 1 秒时,总时间是否大于等于 3 秒。

不幸的是,我想测试它的唯一方法是使用秒表计时......它有两个副作用......

  • 执行测试需要 3 秒...而且我通常喜欢我的测试以毫秒为单位运行
  • 运行测试的时间有 +/- 10 毫秒左右的差异,这可能会导致测试失败,除非我考虑到这种差异。

  • 如果有一种方法可以模拟这种对时间的依赖,以便我的测试能够运行得更快并且结果相当一致,那就太好了。不幸的是,我想不出这样做的方法……所以我想我会问一下,看看你们中是否有人遇到过这个问题……

    最佳答案

    你可以做一个 Waiter提供方法的类,Wait(int)等待指定的时间量。对此方法进行测试,然后在您的单元测试中,传入一个模拟版本,该版本仅跟踪要求等待多长时间,但立即返回。

    例如(C#):

    interface IWaiter
    {
        void Wait(int milliseconds);
    }
    
    class Waiter : IWaiter
    {
        public void Wait(int milliseconds)
        {
            // not accurate, but for the sake of simplicity:
            Thread.Sleep(milliseconds);
        }
    }
    
    class MockedWaiter : IWaiter
    {
        public void Wait(int milliseconds)
        {
            WaitedTime += milliseconds;
        }
        public int WaitedTime { get; private set; }
    }
    

    关于unit-testing - 是否可以在单元测试中模拟时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1309571/

    相关文章:

    unit-testing - Angular 2——模拟——没有 HTTP 提供者

    java - 我可以在 Citrus 静态响应适配器负载中使用 Citrus 变量吗?

    c# - 如何模拟 Entity Framework 导航属性智能?

    java - PowerMock 和 Mockito 的静态模拟不起作用

    unit-testing - PHPUnit - 从命令行中的代码覆盖率中排除一些目录

    go - 解析格式为 HHMMSS00 的时间

    java - Android:获取原子时间

    java - 路径测试和分支测试

    java - 如何断言方法是用 mockito 调用的

    c++ - std::chrono 重复调用 QueryPerformanceFrequency?