Я использую JodaTime # DateTime
, и мне нужно высмеивать его поведение. Поскольку невозможно напрямую имитировать JodaTime # DateTime
, я создаю для него интерфейс
Clock.java
public interface Clock {
DateTime getCurrentDateTimeEST();
DateTime getFourPM_EST();
DateTime getSevenPM_EST();
}
JodaTime. java
public class JodaTime implements Clock {
@Override
public DateTime getCurrentDateTimeEST() {
return new DateTime(DateTimeZone.forID("EST"));
}
@Override
public DateTime getFourPM_EST() {
DateTime current = getCurrentDateTimeEST();
return new DateTime(current.getYear(), current.getMonthOfYear(),
current.getDayOfMonth(), 16, 0, 0, 0, DateTimeZone.forID("EST"));
}
@Override
public DateTime getSevenPM_EST() {
DateTime current = getCurrentDateTimeEST();
return new DateTime(current.getYear(), current.getMonthOfYear(),
current.getDayOfMonth(), 19, 0, 0, 0, DateTimeZone.forID("EST"));
}
}
Вот метод, который я хочу протестировать
public class PrintProcessor{
Clock jodaTime;
public PrintProcessor(){
jodaTime = new JodaTime();
}
...
public String getPrintJobName(Shipper shipper){
String printJobName = null;
//Get current EST time
if(jodaTime.getCurrentDateTimeEST().isBefore(jodaTime.getFourPM_EST()) ||
jodaTime.getCurrentDateTimeEST().isAfter(jodaTime.getSevenPM_EST())){ //Before 4PM EST and after 7PM EST
switch(shipper){
case X:
...
}else if(jodaTime.getCurrentDateTimeEST().isBefore(jodaTime.getSevenPM_EST())){ //Between 4PM-7PM EST
switch(shipper){
case X:
...
}
return printJobName;
}
}
Как видите, printJobName
зависит от текущего времени дня относительно временного интервала [16: 00-19: 00] EST и грузоотправителя. имя. Поскольку отправитель будет передан через параметр, мы можем без проблем провести модульное тестирование. Но мне нужно поиздеваться над временем. Итак, вот что я пробую
@Test
public void testGetPrintJobNameBeforeFourPM(){
DateTime current = new DateTime(DateTimeZone.forID("EST"));
Clock clock = mock(Clock.class);
//Always return 6pm when I try to ask for the current time
when(clock.getCurrentDateTimeEST()).thenReturn(new DateTime(current.getYear(), current.getMonthOfYear(),
current.getDayOfMonth(), 18, 0, 0, 0, DateTimeZone.forID("EST")));
//Test for Fedex
String printJobName = printProcessor.getPrintJobName(Shipper.X);
assertEquals("XNCRMNCF", printJobName);
}
Тест должен провалиться, так как я прохожу в 18:00, но XNCRMNCF
- это имя до 16:00. Мне нужно также издеваться над printProcessor
. Если то, что у меня есть, не так. Как мне это исправить? Я пытаюсь научиться писать Java-код высокого уровня, прошу вас сильно критиковать мой код. Я действительно хочу изучить