java - 如何测试应返回特定日期的日期函数

标签 java date testing

我有以下功能:

public static Date getFirstOfLastMonth() {
    Calendar cal = Calendar.getInstance();
    cal.add(Calendar.MONTH, -1);
    cal.set(Calendar.DAY_OF_MONTH, 1);

    return cal.getTime();
}

如何编写一个单元测试来检查该函数返回的值是否与预期值相同,而不使用相同的逻辑来生成预期值?

最佳答案

请参阅其他答案以获取使用 JodaTime 或 Java 8 的建议。不过,这可以使用 java.util.Calendar 来完成。

关键是更改您的方法以传递日期,而不是让它假定当前时间。也许也可以考虑重命名此方法以反射(reflect)其新语义,请参阅 Andreas 对 getFirstOfPreviousMonth 的建议。

您需要将其调用为 getFirstOfLastMonth(new Date()) 以保留现有行为,甚至可能使用默认方法

public static Date getFirstOfLastMonth() {
     return getFirstOfPreviousMonth(new Date());
}

public static Date getFirstOfPreviousMonth(Date now) {
    Calendar cal = Calendar.getInstance();
    cal.setTime(now);
    cal.add(Calendar.MONTH, -1);
    cal.set(Calendar.DAY_OF_MONTH, 1);

    return cal.getTime();
}

然后进行一些测试,您可以使用日历来检查结果:

@Test
public void previousYear() {
    Calendar input = Calendar.getInstance();
    input.clear();
    input.set(2009, Calendar.JANUARY, 5);

    Date result = getFirstOfLastMonth(input.getTime());

    Calendar output = Calendar.getInstance();
    output.setTime(result);
    assertThat(output.get(Calendar.YEAR), is(2008));
    assertThat(output.get(Calendar.MONTH), is(Calendar.DECEMBER));
    assertThat(output.get(Calendar.DAY_OF_MONTH), is(1));
}

关于java - 如何测试应返回特定日期的日期函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40664910/

相关文章:

java - 使 ArrayList 大小等于 Java 中可用的其他数组列表

java - TreeSet 与 LinkedHashSet 和 TreeMap 相比 LinkedHashMap 增加了多少成本?

java - Spring - 停止 bean 初始化

objective-c - 比较 Objective-C 中的时间和日期

java - 如何在尝试实现可测试代码的同时防止过度工程?

javascript - node.js 模拟 sendmailer 传输器内部函数

javascript - Mocha 'before each hook' 消息为红色。我怎么知 Prop 体出了什么问题?

Java 从集合中删除会导致 IllegalStateException

Java 日期到字符串解析/验证需要帮助

javascript - 使用 JS 服务器时间而不是客户端时间来避免这种行为,即用户可以通过更改本地计算机时钟来操纵结果