我有这样的方法:
public Date getCurrentUtcDateTime() {
// Return UTC time
}
我想用JUnit为它创建一个单元测试。
assertEquals( ??????
什么是正确的方法?
如果我编写单元测试代码来计算UTC当前时间,那就不好了,因为我基本上会重写整个函数。除此之外,两个日期时间的毫秒数也不相同。
如果我只是检查结果是否为空,那就不好了 - 结果可能仍然是错误的。
我还应该尝试什么?为这个函数编写单元测试的正确方法是什么?
答案 0 :(得分:1)
如果我编写单元测试代码来计算UTC当前时间,那就不好了,因为我基本上会重写整个函数
有时这是你测试某些东西的唯一方法。也许还有另一种方法可以用来同时获得?即使用Joda-time而不是标准的Java类,反之亦然。
一种测试方法可能是(伪代码):
startTime = getUTCTimeUsingAlternativeMethod();
resultTime = classUnderTest.getCurrentUtcDateTime();
endTime = getUTCTimeUsingAlternativeMethod();
validateThat(startTime <= resultTime);
validateThat(resultTime <= endTime);
但是作为Jon points out in the comments,这个简单的方法可能不需要测试。您可以更好地花时间测试其他方法。
答案 1 :(得分:0)
所以我多次遇到这个问题。在很多情况下,获得前后时间(如建议的)效果很好。但是,在将时间转换为字符串或某些需要确切时间才能创建良好测试的情况下,我遇到了这方面的问题。出于这个原因,我创建了一个控制时间的机制(而不是时空连续体)。
我有一个名为DateSupplier的课程,其中包含getCurrentTime()
和getCurrentDateTime
等方法。默认行为返回new Date()
。
然后我有一个JUnit规则DateController,可用于明确控制DateSupplier
返回的内容。 DateController
规则位于测试库中,因此不应使用生产代码进行部署。每次测试后,它会将DateSupplier
的行为设置为返回正确的当前Date
的默认行为。
public Date getCurrentUtcDateTime() {
// Return UTC time
Date date = DateSupplier.getCurrentDate();
}
public class MyTest{
@Rule
public DateController dateController = new DateController();
private Date currentTime;
@Before
public void setup(){
dateController.setCurrentTimeToNow();
currentTime = DateSupplier.getCurrentTime();
}
@Test
public void myTest(){
Date value = getCurrentUtcDateTime();
// verify
Date utcDate = // convert currentTime to UTC
assertThat(value, equalTo(utcDate));
}
}