java JUnit系统日期
我正在尝试为我正在工作的项目中的一些实用程序类设置单元测试,其中一个类有一个基于当前时间进行确定的方法
public String firstDay() {
Date dateDuJour = new Date();
int jourCourant = dateDuJour.getDate();
if (jourCourant == 1)
return "firstDay";
else
return "otherDay";
}
我怎样才能解决单元测试的问题?一个被使用的方法,术语new Date()
编辑
我不会为了获得更好的Cobertura结果,或者为了确保某些东西能够通过单元测试而修改工作代码
# 1 楼答案
我认为
if
语句不应该进行单元测试。无论如何,只要使用new Date()
,代码就不可测试,因为测试结果将取决于测试运行的星期几。(另外,您不应该使用不推荐使用的Date.getDate()
)我将你的方法分为三种:
只测试第二和第三种方法。如果您碰巧在代码中经常使用习惯用法
doSomeAction(new Date())
,您可以添加第四种方法:这显然不需要任何测试
(或者您可以查看these ways来操纵从
System.currentTimeMillis()
读取的时间)# 2 楼答案
为了更好的可测试性,将Date对象作为参数传递,而不是在内部调用new Date():
您的通话将从firstDay()更改为firstDay(新日期()
更改代码后,可以轻松地传递模拟日期对象,以测试可能的情况
# 3 楼答案
即使是工作代码也可以修改,以使其更易于测试Dependency Injection模式解决了这样的场景。基本思想很简单:依赖关系从依赖对象传递到提供服务的对象