【问题标题】:How to unit test date related methods? [duplicate]如何对日期相关的方法进行单元测试? [复制]
【发布时间】:2017-06-20 09:30:14
【问题描述】:

我有如下方法,

public static boolean isBetweenMonthDays(int startDayOfMonth,
        int endDayOfMonth) {

    LocalDate today = LocalDate.now();

    if (today.getDayOfMonth() >= startDayOfMonth
        && today.getDayOfMonth() <= endDayOfMonth) {
        return true;
    }

    return false;
    }

这是实用程序类中的一个简单方法,但也有许多其他复杂的方法,结果取决于今天的日期,所以我的断言在某些日期会失败。

对此类方法进行单元测试的首选是什么?

更新: 这些单元测试是否被认为是不好的做法,因为大多数人都建议注入 LocalDate 依赖项并使类可测试?

我很犹豫,因为它是一个静态实用程序类,并且客户端只能处理整数?

@Test
    public void testIsBetweenMonthDays_success_true() {

    LocalDate today = LocalDate.now();

    boolean result = ResponseMatchingUtil.isBetweenMonthDays(10, 25);

    if (today.getDayOfMonth() >= 10 && today.getDayOfMonth() <= 25)
        assertTrue(result);
    else
        assertFalse(result);

    }

    @Test
    public void testIsBetweenMonthDays_success_false() {

    LocalDate today = LocalDate.now();

    boolean result = ResponseMatchingUtil.isBetweenMonthDays(4, 10);

    if (today.getDayOfMonth() >= 4 && today.getDayOfMonth() <= 10)
        assertTrue(result);
    else
        assertFalse(result);

    }

【问题讨论】:

  • 我会说你应该模拟日期。
  • 移除对当前日期的依赖:注入today
  • @AndyTurner:这是一种具有静态实用方法的实用类。
  • @SabirKhan 这与其可测试性完全无关。不知何故,您需要能够获得可以控制的日期、时间等,您可以通过注入这些日期、时间等的源来做到这一点。请注意,“注入”并不是指“使用依赖注入框架” (必然):我的意思是将LocalDate 作为参数传递给方法。

标签: java unit-testing java-8


【解决方案1】:

重构它,让它变得可测试:

public static boolean isBetweenMonthDays(int startDayOfMonth,
        int endDayOfMonth, LocalDate date) {

    if (date.getDayOfMonth() >= startDayOfMonth
        && date.getDayOfMonth() <= endDayOfMonth) {
        return true;
    }

    return false;
    }

public static boolean isBetweenMonthDays(int startDayOfMonth,
        int endDayOfMonth) {

    return isBetweenMonthDays(startDayOfMonth, endDayOfMonth, LocalDate.now());
    }

【讨论】:

  • 所以客户使用isBetweenMonthDays(int startDayOfMonth, int endDayOfMonth) & 我单元测试isBetweenMonthDays(int startDayOfMonth,int endDayOfMonth, LocalDate date) ?
  • 没错。双参数方法不需要测试,因为它只委托给三参数方法,使用LocalDate.now作为第三个参数。
  • 我将只进行一项修改 - 这将使可测试方法的可访问性变为 protected 而不是 public 。这种方法在代码覆盖率方面确实有缺点。
猜你喜欢
  • 2017-01-08
  • 1970-01-01
  • 2016-04-12
  • 2018-06-09
  • 2018-05-26
  • 1970-01-01
  • 2021-07-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多