Java 如何在执行junit时模拟某个方法?

Java 如何在执行junit时模拟某个方法?,java,unit-testing,junit,mockito,powermock,Java,Unit Testing,Junit,Mockito,Powermock,下面是我的方法,它以YYYYMMDD的格式为我提供最近的星期一或最近的星期四的日期 今天是星期六,所以它应该以yyyyymmdd的格式返回星期四的日期,所以它将是-2014027 public static String getDate() { Calendar cal = Calendar.getInstance(); try { int dow = cal.get(Calendar.DAY_OF_WEEK); switch (dow) {

下面是我的方法,它以
YYYYMMDD
的格式为我提供最近的
星期一
或最近的
星期四
的日期

今天是星期六,所以它应该以
yyyyymmdd
的格式返回星期四的日期,所以它将是-
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
方法?我从来没有嘲笑过它,所以我面临一些问题


如果可能,有人能在我的示例中提供一个简单的示例吗?

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

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

public static String getDate(Calendar cal} {
// your example code
}
这样,您就可以编写测试,在getDate中执行您的逻辑,而不必使用任何模拟。
如果您真的想介绍该方法的无参数版本,那么可以使用PowerMock来模拟Calendar的getInstance方法()。

我建议您阅读另一个模拟framework@xp500:如果可能的话,您能否在我的代码基础上提供一个示例,以便我更好地理解?谢谢你的帮助。如果你在单元测试
getDate()
,你不应该嘲笑它。你想模拟日历实例吗?@SotiriosDelimanolis:是的,我想你是对的。。我不应该嘲笑
getDate
。它应该是日历实例。。你能提供一个关于我的代码的例子吗?这将帮助我更好地理解……这是正确的做法+1.无论如何,您不应该尝试测试Calendar.getInstance(),除非您为Oracle工作,并且正在开发新版本的Oracle。这是重构代码的一个很好的例子,在应该测试的部分和不应该测试的部分之间引入了一个中断。不过,另一方面,
getDate()
对于这些方法来说是个糟糕的名字。