【问题标题】:How to mock a certain method while doing junit?如何在做junit时模拟某种方法?
【发布时间】:2014-03-02 01:21:20
【问题描述】:

下面是我的方法,它以YYYYMMDD 的格式为我提供最近的Monday 或最近的Thursday 的日期。

今天是星期六,所以它应该以 YYYYMMDD 的格式返回星期四的日期,所以它将是 - 2014027

public static String getDate() {

    Calendar cal = Calendar.getInstance();

    try {
        int dow = cal.get(Calendar.DAY_OF_WEEK);
        switch (dow) {
        case Calendar.THURSDAY:
        case Calendar.FRIDAY:
        case Calendar.SATURDAY:
        case Calendar.SUNDAY:
        while (cal.get(Calendar.DAY_OF_WEEK) != Calendar.THURSDAY) {
            cal.add(Calendar.DATE, -1);
        }
        break;
        case Calendar.MONDAY:
        case Calendar.TUESDAY:
        case Calendar.WEDNESDAY:
        while (cal.get(Calendar.DAY_OF_WEEK) != Calendar.MONDAY) {
            cal.add(Calendar.DATE, -1);
        }
        break;
        }
    } catch (Exception ex) {
        // log error
    }

    return toDateFormat.format(cal.getTime());
}

所以我的问题是,我如何模拟 Calendar getInstance 方法以便我可以轻松地 junit getDate 方法?我以前从未嘲笑过它,所以我遇到了一些问题?

如果可能的话,谁能在我的例子中提供一个简单的例子?

【问题讨论】:

  • 我建议你阅读easymock
  • mockito 是另一个模拟框架
  • @xp500:如果可能的话,您能否根据我的代码库提供一个示例,以便我能够更好地理解?感谢您的帮助。
  • 如果你在单元测试getDate(),你不应该嘲笑它。你想模拟Calendar 实例吗?
  • @SotiriosDelimanolis:是的,我想你是对的......我不应该嘲笑getDate。它应该是日历实例。你能根据我的代码提供一个示例基础吗?这将帮助我更好地理解..

标签: java unit-testing junit mockito powermock


【解决方案1】:

如果这是我的代码,我会将 Calendar 变量提取到另一个方法中,重载该方法,以便有一个版本将 Calendar 作为参数,一个版本不带参数,如下所示:

public static String getDate() {
    return getDate(Calendar.getInstance());
}

public static String getDate(Calendar cal} {
// your example code
}

通过这种方式,您可以编写测试以在 getDate 中执行您的逻辑,而无需使用任何模拟。 如果您真的想涵盖该方法的无参数版本,那么您可以使用 PowerMock 来模拟 Calendar 的 getInstance 方法 (here's a question with examples of that)。

【讨论】:

  • 这是正确的做法。 +1。无论如何,您都不应该尝试测试 Calendar.getInstance(),除非您为 Oracle 工作,并且您正在开发它的新版本。这是重构代码的一个很好的例子,在你应该测试的部分和你不应该测试的部分之间引入一个中断。不过,另一方面,getDate() 是这些方法的糟糕名称。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多