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

标签 java unit-testing junit mockito powermock

下面是我的方法,它以 YYYYMMDD 的格式给出最近的星期一或最近的星期四的日期。

今天是星期六,因此它应该以 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 方法?我以前从未 mock 过它,所以我遇到了一些问题?

任何人都可以在我的示例中提供一个简单的示例吗?

最佳答案

如果这是我的代码,我会将 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 )。

关于java - 如何在执行junit时模拟某个方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22122687/

相关文章:

java - JUnit 5,如何从 BeforeEach 回调中获取参数化测试参数?

java - 在 junit 中测试当前的 java 时间戳

Spring - 单元测试

java - Dialog View 如何与其 Activity 的 View 层次结构集成

java - 如何优化我的代码来处理这个特殊事件

java - Java wait() 方法究竟是如何工作的?

java - Spring 3.2.4 中测试 Controller 的替代方案

unit-testing - 如何在 Swift 中对 NSFetchedResultsController 进行单元测试

java - 如何在给定 Oracle SQL 字符串的情况下提取选定的列?

c# - 如何伪造/单元测试Azure存储队列?