静态实用程序类、单元测试和Java。时间
由于我们的客户机仍在使用Java。日期Util,我们必须处理各种转换方法和一个庞大的数据实用程序类。我的目标是简化实用程序类并为其编写单元测试
我设法简化了它,但我遇到了测试用例的问题,因为:
- 作为一个实用类,这些方法是静态的,因此没有依赖性 使用Java进行注入。时间时钟李>
- 我们的几个助手方法使用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 楼答案
没有什么能阻止您将
Clock
注入到包含静态实用程序方法的类中private static Clock
字段(类变量)。将其初始化为声明中的Clock.systemUTC()
或Clock.systemDefaultZone()
李>Clock
李>inject
或setClock
方法,将Clock
注入静态变量李>uninject
方法将Clock
设置回其初始值李>将单元测试保持在同一个包中,以便它们可以使用包私有注入方法。您可能已经了解到,测试静态实用程序方法的测试方法首先注入所需的
Clock
,然后调用该方法来测试并验证该方法的返回值。由于Clock
是静态的,测试不能并行运行