Mockito: Wie zum Hohn eine Schnittstelle der JodaTime

Benutze ich JodaTime#DateTime, und ich müssen zu verspotten sein Verhalten. Da es nicht möglich ist, direkt zu mock JodaTime#DateTime erstelle ich eine Schnittstelle von it

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")); 
    }   
}

Hier ist die Methode, die ich testen möchte

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;
  }
}

Wie Sie sehen können die printJobName sind abhängig von der aktuellen Zeit des Tages relativ zum Zeitintervall [4PM-7PM] EST und den Namen des Versenders. Da der Absender sein pass über die parameter können wir die unit-Tests ist es kein problem. Aber ich müssen zu verspotten die Zeit. So, hier ist was ich versuchen

@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);
}

Sollte der test scheitern, da ich den pass in 6PM, aber XNCRMNCF ist der name für die vor 4 Uhr. Muss ich mock printProcessor als gut. Wenn das, was ich habe, ist falsch. Wie soll ich es beheben? Ich bin versucht zu lernen, schreiben von high-level-java-code, bitte sehr kritisiert zu meinem code. Ich möchte wirklich lernen

InformationsquelleAutor Thang Pham | 2011-05-18

Schreibe einen Kommentar