首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >模拟System.nanoTime()

模拟System.nanoTime()
EN

Stack Overflow用户
提问于 2022-06-20 08:32:41
回答 4查看 163关注 0票数 3

我们可以使用时钟来模拟调用,比如System.currentTimeMillis(),使用Clock.millis()并注入一个模拟时钟实现。

是否有类似的方法可以轻松地模拟System.nanoTime()

EN

回答 4

Stack Overflow用户

发布于 2022-06-20 09:49:27

使用您自己的封装

代码语言:javascript
复制
interface NanoTimer {
  long nanoTime();
  static NanoTimer system() {
    return System::nanoTime;
  }
}

这样,您就可以轻松地编写自己的模拟程序。

或者,除了秒表之外,我看不到任何用例,所以我想您可能想看看番石榴的Stopwatch

票数 2
EN

Stack Overflow用户

发布于 2022-06-20 09:48:43

您可以使用Google的Ticker类来实现这一点。

或者,如果您只是想正确地度量时间,您可以使用Stopwatch作为额外的功能和更好的API,它的构造函数是一个Ticker实例。

如果您发现其中的任何其他实用程序都很有用,那么guava-testlib中甚至还有一个guava-testlib。否则,写假币显然是很容易的。

票数 1
EN

Stack Overflow用户

发布于 2022-11-16 05:12:42

您可以在单元测试期间使用接口进行依赖项注入:

代码语言:javascript
复制
public class YourClass {
    private static TimeSupplier timeSupplier = System::nanoTime;

    @VisibleForTesting
    public static void setTimeSupplier(TimeSupplier timeSupplier) {
        YourClass.timeSupplier = timeSupplier;
    }

    @FunctionalInterface
    interface TimeSupplier {
        long nanoTime();
    }
    
    // Just use timeSupplier.nanoTime() instead of the static nanoTime calls
}

然后,您可以简单地用一个常量(例如,Mockito)对超时进行存根:

代码语言:javascript
复制
YourClass.TimeSupplier timeSupplier = mock(YourClass.TimeSupplier.class);
when(timeSupplier.nanoTime()).thenReturn(20221116L);
YourClass.setTimeSupplier(timeSupplier);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72684249

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档