2013-08-04 3 views
-1

Я использую Mockito и у меня есть класс дат и я хочу, чтобы иметь возможность издеваться этот класс даты в моем тестовом классе, поэтому я попытался следующие:Может не издеваться Дата Класс

MVDate date = Mockito.mock(MYDate.class); 
    Mockito.when(date.get(Calendar.MONTH)).thenReturn(5); 

MyDate Класс:

public class MYDate extends GregorianCalendar implements Comparable<Calendar> { 

public MYDate() { 
     setTime(new Date()); 
    } 

} 

но при попытке напечатать new MYDate(); он всегда печатает текущую дату. , пожалуйста, сообщите, как мне высмеять класс календаря, чтобы я мог тестировать определенную дату для всех методов, которые создают новый экземпляр данных.

+2

a Дата не является календарем ... – assylias

+1

Можете ли вы опубликовать часть своего кода, чтобы мы могли видеть, что происходит?Если вы выполняете 'new Date()', то вы не будете использовать свой макет 'Calendar'. –

+0

@ Давид Уоллес и обновил вопрос. –

ответ

4

Я бы использовал класс Factory для создания объектов Date, вместо использования new Date(). У вас есть второй конструктор для MyDate, где вы можете пройти Factory. Затем используйте макет Factory, который вы можете настроить, чтобы вернуть любую дату, которая вам нравится.

public class DateFactory{ 
    public Date makeDate(){ 
     return new Date(); 
    } 
} 

----------------------------------- 

public class MyDate extends GregorianCalendar implements Comparable<Calendar>{ 

    public MyDate(){ 
     this(new DateFactory()); 
    } 

    MyDate(DateFactory factory){ 
     setTime(factory.makeDate()); 
    } 
} 
+0

вы можете поделиться, как я могу использовать DateFactory в тесте? –

+0

Как я уже говорил. Вы издеваетесь над фабрикой. Вы заглушите его, чтобы вернуть любую дату, которую хотите вернуть, когда вы вызываете 'makeDate'. В вашем тесте вы используете второй конструктор 'MyDate' и переходите на издеваемую фабрику. –

0

В вашем коде вы издеваетесь над определенным методом «cal.get()».

assertEquals(cal.get(Calendar.MONTH), 5); 

В этом случае приведенное выше утверждение будет истинным, но cal.getTime() вернет что-то другое. Вы имели в виду, чтобы вместо этого mock cal.getTime()?

+0

я обновил вопрос –

1

Поэтому очень важно написать единичные тесты против кода, который получает текущую дату. Я много раз боролся с ним и, наконец, написал решение. Мое решение состоит в том, чтобы иметь DateSupplier, который завершает вызов new Date(). Затем у меня есть тестовый класс под названием DateController, который позволяет модульным тестам контролировать, какое значение возвращается DateSupplier.

Вот ссылки: DateSupplier

DateController

DateSupplier записывается с помощью метода static, чтобы получить Date. Это предотвращает необходимость копирования экземпляров ко всем экземплярам.

DateController записывается как Rule, опирающийся поведение DateSupplier назад к поведению по умолчанию возвращения new Date().

+0

'DateSupplier' можно назвать более элегантным:' Clock'. – bowmore

+0

@John B, какой jar я должен использовать для аннотации ParametersAreNonnullByDefault на jboss? также могу ли я использовать пример без этой аннотации? –

+0

Да, аннотация - это просто документация. Он предоставляется в 'jsr305' –

0

Java 8 java.time.Clock Класс

в Java 8 Новый java.time.* package включает Clock класса для этой цели насмешливой даты и время, в процессе разработки и тестирования.

Joda время

Насколько я помню, популярная Joda-Time структура также имеет средство для подделки часов.

Преобразование

Вы можете легко конвертировать между даты и времени объектов обеих этих структур и класса java.util.Date по мере необходимости для взаимодействия.

Смежные вопросы