有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java JUnit系统日期

我正在尝试为我正在工作的项目中的一些实用程序类设置单元测试,其中一个类有一个基于当前时间进行确定的方法

public String firstDay() {
    Date dateDuJour = new Date();
    int jourCourant = dateDuJour.getDate();
    if (jourCourant == 1)
        return "firstDay";
    else
        return "otherDay";
}

我怎样才能解决单元测试的问题?一个被使用的方法,术语new Date()

编辑

我不会为了获得更好的Cobertura结果,或者为了确保某些东西能够通过单元测试而修改工作代码


共 (3) 个答案

  1. # 1 楼答案

    我认为if语句不应该进行单元测试。无论如何,只要使用new Date(),代码就不可测试,因为测试结果将取决于测试运行的星期几。(另外,您不应该使用不推荐使用的Date.getDate()

    我将你的方法分为三种:

    private void doSomeAction(Date date) {
      Calendar cal = Calendar.getInstance();
      cal.setTime(date);
      if (cal.get(Calendar.DAY_OF_MONTH) == 1) {
        doSomeActionForFirstDay();
      } else {
        doSomeActionForOtherDays();
      }
    }
    
    public void doSomeActionForFirstDay() {
      // IMPLEMENT AND TEST THIS ONE
    }
    
    public void doSomeActionForOtherDays() {
      // IMPLEMENT AND TEST THIS ONE
    }
    

    只测试第二和第三种方法。如果您碰巧在代码中经常使用习惯用法doSomeAction(new Date()),您可以添加第四种方法:

    public void doSomeActionToday() {
      doSomeAction(new Date());
    }
    

    这显然不需要任何测试

    (或者您可以查看these ways来操纵从System.currentTimeMillis()读取的时间)

  2. # 2 楼答案

    为了更好的可测试性,将Date对象作为参数传递,而不是在内部调用new Date():

    public String firstDay(Date dateDuJour) {
        int jourCourant = dateDuJour.getDate();
        if (jourCourant == 1)
            return "firstDay";
        else
            return "otherDay";
    }
    

    您的通话将从firstDay()更改为firstDay(新日期()

    更改代码后,可以轻松地传递模拟日期对象,以测试可能的情况

  3. # 3 楼答案

    I would not modify working code in order to get a better Cobertura result, or to make sure something can pass a unit test.

    即使是工作代码也可以修改,以使其更易于测试Dependency Injection模式解决了这样的场景。基本思想很简单:依赖关系从依赖对象传递到提供服务的对象