【问题标题】:Unit Test for ScheduledThreadPoolExecutorScheduledThreadPoolExecutor 的单元测试
【发布时间】:2016-03-09 12:56:55
【问题描述】:

假设我有这样的方法

public void scheduleCleanup(String parameter) {
    final SomeObject someObject = new SomeObject(parameter);
    ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(1);
    executor.schedule((Runnable) () -> cleanupService.startCleanup(someObject),
                CLEANUP_TIMEOUT_SEC, TimeUnit.SECONDS);
}

这意味着cleanupService.startCleanup(someObject)CLEANUP_TIMEOUT_SEC 之后被调用,这实际上来自一些属性文件。

对我来说很清楚我可以创建SomeObject 并为cleanupService.startCleanup(someObject) 编写单元测试,但是我如何使用scheduleCleanup 方法呢?

  1. 我认为我需要模拟它,但在这种情况下你是怎么做的呢?
  2. 是否可以避免模拟,在这种情况下最好的方法是什么?

【问题讨论】:

    标签: java unit-testing junit mocking


    【解决方案1】:

    我猜你想避免在单元测试中使用/调用 ScheduledThreadPoolExecutor。我会用 ScheduledExecutorService 替换 ScheduledThreadPoolExecutor 并将其注入到类中:

    @Inject ExecutorService executor;
    
    public void scheduleCleanup(String parameter) {
       final SomeObject someObject = new SomeObject(parameter);
       executor.schedule((Runnable) () -> cleanupService.startCleanup(someObject),
                CLEANUP_TIMEOUT_SEC, TimeUnit.SECONDS);
    }
    

    然后您可以简单地验证executor.schedule(Runnable, long, TimeUnit) 是否在适当的位置被调用。

    【讨论】:

    • 这对于单元测试scheduleCleanup 方法很有用,但除非我读错了,否则这不是问题所在
    • @blgt 那它在问什么?
    • 测试cleanupService.startCleanup,不管是什么。也许OP可以澄清
    • @forty-2,谢谢你的回答。这是一个非常有趣的想法,并且可能非常有益,但是,在这种情况下,我们需要更改生产代码,并且我们知道我们不应该更改它来满足测试需求。
    • @blgt,我在问如何测试 scheduleCleanup 方法。我提到我很清楚如何为 startCleanup 编写测试。关键是我们有一些方法(例如 startCleanup),它会在一段时间后被 scheduleCleanup 调用,但 scheduleCleanup 也可以被调用多次。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 2010-11-25
    • 2012-01-08
    相关资源
    最近更新 更多