2015-10-25 3 views
3

Представьте, что мы имеем следующий класс, который я хотел бы тест:JUnit с Java 8 часов

class Times { 

    Clock cl = Clock.systemDefaultZone(); 

    public int changeTime() { 
     LocalDate ld = LocalDate.now(cl); 
     if(ld.getMonth().equals(Month.OCTOBER)) 
      return 1; 
     if(ld.getMonth().equals(Month.NOVEMBER)) 
      return 2; 
     return 0; 
    } 
} 

Как я могу заставить дату быть в ноябре, и утверждают, что метод возвращает 2?

Я использую JUnit и Mockito.

+1

Вы можете использовать соответствующий заводский метод LocalDate, например: LocalDate.of (int year, int month, int dayOfMonth); – dimplex

ответ

5

Предполагая, что имеется сеттер для Clock объекта в Times классе, вы можете сделать что-то вроде этого:

Times times = new Times(); 
Clock fixedClockInNovember = Clock.fixed(Instant.parse("2015-11-01T00:00:00.00Z"), ZoneId.of("UTC")); 
times.setClock(fixedClockInNovember); 
assertEquals(2, times.changeTime()); 

В этом коде, фиксированные часы создаются. Это имитирует постоянное время для данного момента, то есть в ноябре.

Таким образом, любой звонок LocalDate.now(clock) всегда будет возвращать такой же в ноябре.

+0

поэтому без этого сеттера мы не можем менять часы внутри класса времени? –

+0

Ну что ж, вы можете немного отразить магию, но не можете ли вы добавить сеттера? – Tunaki

+0

Да, я думаю, что это лучший вариант ... спасибо –

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