有 Java 编程相关的问题?

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

静态实用程序类、单元测试和Java。时间

由于我们的客户机仍在使用Java。日期Util,我们必须处理各种转换方法和一个庞大的数据实用程序类。我的目标是简化实用程序类并为其编写单元测试

我设法简化了它,但我遇到了测试用例的问题,因为:

  1. 作为一个实用类,这些方法是静态的,因此没有依赖性 使用Java进行注入。时间时钟
  2. 我们的几个助手方法使用instant。将其转换为请求的格式之前,请执行now()。显然,这使得编写单元测试。。。有问题

以下是我需要编写测试用例的一些方法示例:

     /**
     * Get the current time in any format.
     * @param outFormat
     * @return
     */
    public static Object getNow(TimeFormat outFormat){
        Instant dateObject = Instant.now();
        
        return new InstantConverter().convertTo(dateObject, outFormat);

    }
    
    /**
     * @param value - unit of time 
     * @param unit  - hours, days, etc. Anything higher than days is not supported. 
     * @param format - format returned. 
     */
    public static Object calculateFutureDate(int value, ChronoUnit unit, TimeFormat outFormat) {
        Instant time = Instant.now().plus(value, unit);
        
        return new InstantConverter().convertTo(time, outFormat);
    }

InstantConverter是一个受保护的类,它将即时转换为各种时间输出(localdate、string、epoch、java.util.date等),而TimeFormat是一个枚举,包含我们可以转换为的所有格式

我知道当涉及到单元测试时,最好的做法是远离静态方法。。。但恐怕这不是一个选择

在我的研究中,似乎我唯一的选择是使用powermock或mockito的更高版本来模拟我的静态瞬间。now()方法(类似于:https://rieckpil.de/mocking-static-methods-with-mockito-java-kotlin/

我只是想确保我没有遗漏任何明显的东西,因为我不想再次重构,因为我犯了一个错误

感谢所有花时间阅读本文的人!如果你有任何问题,请告诉我


共 (1) 个答案

  1. # 1 楼答案

    没有什么能阻止您将Clock注入到包含静态实用程序方法的类中

    1. 声明一个private static Clock字段(类变量)。将其初始化为声明中的Clock.systemUTC()Clock.systemDefaultZone()
    2. 让您的静态时间敏感方法使用刚才介绍的Clock
    3. 有一个包私有(默认可访问)静态injectsetClock方法,将Clock注入静态变量
    4. 如果需要,可以使用uninject方法将Clock设置回其初始值

    将单元测试保持在同一个包中,以便它们可以使用包私有注入方法。您可能已经了解到,测试静态实用程序方法的测试方法首先注入所需的Clock,然后调用该方法来测试并验证该方法的返回值。由于Clock是静态的,测试不能并行运行