2012-04-13 7 views
0

Ich habe eine Klasse DurationFormatter wie folgt:Fehler mit Joda Datetime-Formatter

import java.util.Date; 
import org.joda.time.DateTime; 
import org.joda.time.Period; 
import org.joda.time.format.PeriodFormatter; 
import org.joda.time.format.PeriodFormatterBuilder; 

public class DurationFormatter { 

    private final static PeriodFormatter DURATION_FORMATTER = 
    new PeriodFormatterBuilder().appendYears() 
           .appendSuffix("year", "years") 
           .appendSeparator(" ") 
           .appendMonths() 
           .appendSuffix("month", "months") 
           .appendSeparator(" ") 
           .appendDays() 
           .appendSuffix("day", "days") 
           .appendSeparator(" ") 
           .appendHours() 
           .appendSuffix("hour", "hours") 
           .appendSeparator(" ") 
           .appendMinutes() 
           .appendSuffix("minute", "minutes") 
           .appendSeparator(" ") 
           .appendSeconds() 
           .appendSuffix("second", "seconds") 
           .toFormatter(); 

    public static String format(Date start) { 
    StringBuffer result = new StringBuffer(); 
    DURATION_FORMATTER.printTo(result, 
           new Period(new DateTime(start), new DateTime())); 
    return result.toString(); 
    } 

    public static String format(Date start, Date end) { 
    StringBuffer result = new StringBuffer(); 
    DURATION_FORMATTER.printTo(result, 
           new Period(new DateTime(start), 
              end == null 
              ? new DateTime() 
              : new DateTime(end))); 
    return result.toString(); 
    } 

} 

Und das ist meine Einheit Test:

import java.text.ParseException; 
import java.text.SimpleDateFormat; 
import java.util.Date; 

import junit.framework.Assert; 

import org.joda.time.DateTime; 
import org.joda.time.Period; 
import org.junit.Test; 

public class DurationFormatterTest { 

    @Test 
    public void testFormatDate() throws ParseException { 

     int years = 0; 
     int months = 0; 
     int weeks = 0; 
     int days = 0; 
     int hours = 0; 
     int minutes = 0; 
     int seconds = 0; 
     SimpleDateFormat df = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss"); 
     String dateString = "07/27/2010 12:07:34"; 
     Date startDate = (Date) df.parse(dateString); 

     // Find duration 1 
     String duration1 = DurationFormatter.format(startDate); 

     // Parse duration 1 and set values into new Period 
     String[] tokens = duration1.split("[ ]"); 
     for(int index = 0; index < tokens.length; index++) { 
      String token = tokens[index]; 
      if(token.contains("years")) { 
       years = Integer.valueOf(token.replace("years", "")); 
       System.out.println("Years are: " + years); 
      } 
      else if(token.contains("months")) { 
       months = Integer.valueOf(token.replace("months", "")); 
       System.out.println("Months are: " + months); 
      } 
      else if(token.contains("days")) { 
       days = Integer.valueOf(token.replace("days", "")); 
       System.out.println("Days are: " + days); 
      } 
      else if(token.contains("hours")) { 
       hours = Integer.valueOf(token.replace("hours", "")); 
      } 
      else if(token.contains("minutes")) { 
       minutes = Integer.valueOf(token.replace("minutes", "")); 
      } 
      else if(token.contains("seconds")) { 
       seconds = Integer.valueOf(token.replace("seconds", "")); 
      } 
     } 

     Period period = new Period(years, months, weeks, days, hours, minutes, seconds, 0); 

     // User period to initialize new endDate 
     DateTime endDate = new DateTime(startDate).plus(period); 

     // Find duration 2 using new endDate 
     String duration2 = DurationFormatter.format(startDate, endDate.toDate()); 

     // If the durations are the same, then success. 
     Assert.assertEquals(
       "The date of " + duration2 
       + " is equal to " + duration1, 
       duration1, duration2); 
    } 
} 

Das Ergebnis immer Ausgang mit Fehler:

junit. framework.ComparisonFailure: Das Datum von 5days 23hours 5minutes 23seconds ist gleich 1month 5days 23hours 5minutes 23seconds erwartet: < [1month] 5days 23hour s 5minut ...> aber war: < [] 5days 23hours 5minut ...>

Die Zeichenfolge '[1Monat]' fehlt immer. Bitte überprüfe, ob etwas im Code fehlt.

Dank

Antwort

1

in Ihrem Code haben Sie .appendSuffix("month", "months") wo "month" die Singularform ist, "months" die Pluralform ist.

Ihr Test analysiert nur die Pluralformen:

else if(token.contains("months")) { 
    ... 
} 

In diesem Fall wird der Test nicht, weil es nur 1 Monat und somit einzigartig.

Aktualisieren Sie Ihren Testcode, um beide Singular und Plural zu analysieren, und es sollte funktionieren!

Documentation

Verwandte Themen