Как издеваться над определенным методом при выполнении junit?

Ниже приведен мой метод, который дает мне дату недавнего Monday или недавнего Thursday в формате 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? Я никогда не издевался над этим раньше, поэтому я столкнулся с какой-то проблемой?

Может ли кто-нибудь привести простой пример, если это возможно, на моем примере?


person Community    schedule 02.03.2014    source источник
comment
Я предлагаю вам прочитать об easymock   -  person Iłya Bursov    schedule 02.03.2014
comment
mockito — еще одна фиктивная структура.   -  person xp500    schedule 02.03.2014
comment
@ xp500: Можете ли вы привести пример, если это возможно, на основе моей кодовой базы, с помощью которой я смогу лучше понять? Спасибо за помощь.   -  person    schedule 02.03.2014
comment
Если вы проводите модульное тестирование getDate(), вы не должны издеваться над ним. Вы хотите издеваться над экземпляром Calendar?   -  person Sotirios Delimanolis    schedule 02.03.2014
comment
@SotiriosDelimanolis: Да, я думаю, ты прав.. Я не должен насмехаться над getDate. Это должен быть экземпляр календаря. Можете ли вы привести пример моего кода? Это поможет мне лучше понять..   -  person    schedule 02.03.2014


Ответы (1)


Если бы это был мой код, я бы извлек переменную Calendar в другой метод, перегружая метод так, чтобы была одна версия, которая принимает Calendar в качестве параметра, и одна версия без аргументов, например:

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

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

Таким образом, вы можете писать тесты, реализующие вашу логику в getDate, без использования моков. Если вы действительно хотите охватить версию метода без аргументов, вы можете использовать PowerMock для имитации метода getInstance календаря (вот вопрос с примерами об этом).

person Nathan Hughes    schedule 02.03.2014
comment
Это правильный способ сделать это. +1. В любом случае вам не следует пытаться тестировать Calendar.getInstance(), если только вы не работаете в Oracle и не разрабатываете ее новую версию. Это отличная иллюстрация рефакторинга вашего кода, позволяющая разделить части, которые вы должны тестировать, и части, которые вам не следует тестировать. С другой стороны, getDate() — ужасное название для этих методов. - person Dawood ibn Kareem; 03.03.2014