Separate Funktion für JUnit-Test

Saheeda

Top Contributor
Hallo,

ich bastel gerade an einem Kalender. Er funktioniert soweit gut, sowohl über die Konsoleneingabe, als auch die jeweiligen Testfälle.

Mir gefällt aber nicht, dass ich für die Testfälle Extracode benötige bzw. nur eins läuft: Test oder "User-Programm".


Ein Test sieht z.B. so aus:
Java:
@Test
    public void testNewEntry(){
        int year = 2008;
        int month = 12;
        int day = 25;
        int hour = 15;
        String toDo = "test";
        String result = Calendar.newEntry(year, month, day, hour, toDo);
        assertEquals("Done", result);
}

Im Programm gehört dazu:

Java:
public static void setData() {
        System.out.println("Welches Jahr? ");
        int year = in.nextInt()-2000;
        while (year < 0 || year > 9) {
            System.out.println("Jahr ungültig");
            year = in.nextInt()-2000;
        }
        System.out.println("Welcher Monat? (als Zahl)");
        int month = in.nextInt()-1;
        while (month < 0 || month > 11) {
            System.out.println("Monat ungültig");
            month = in.nextInt()-1;
        }
        System.out.println("Welcher Tag? ");
        int day = in.nextInt()-1;
        while (day < 0 || day > 30) {
            System.out.println("Tag ungültig");
            day = in.nextInt()-1;
        }
        System.out.println("Wie viel Uhr(Stunde)? ");
        int hour = in.nextInt();
        while (hour < 0 || hour > 23) {
            System.out.println("Stunde ungültig");
            hour = in.nextInt();
        }
        System.out.println("Welcher Termin? ");
        String toDo = in.next();

        calendar[year][month][day][hour] = toDo;
        System.out.println("");
        menu();

    }


public static String newEntry(int year, int month, int day, int hour, String toDo) {

        int yearToSave = year-2000;
        int monthToSave = month-1;
        int dayToSave = day-1;
        int hourToSave = hour;
        String toDoSave = toDo;

        if (yearToSave < 0 || yearToSave > 9) {
            return "Year Invalid";
        }

        if (monthToSave < 0 || monthToSave > 11) {
            return "Month Invalid";
        }

        if (dayToSave < 0 || dayToSave > 30) {
            return "Day Invalid";
        }
        if (hourToSave < 0 || hourToSave > 23) {
            return "Hour Invalid";
        }

        calendar[yearToSave][monthToSave][dayToSave][hourToSave] = toDoSave;
        return "Done";
    }


Die obere Funktion setData liest die Funktionswerte aus der Konsole, prüft sie auf Plausibilität und gibt sie schließlich ins Arrays Calendar.
newEntry macht so ziemlich dasselbe, nur dass sie ihre Werte vom Test übergeben bekommt.

Kann man das irgendwie zusammenfassen? Mir fiele nur noch Auskommentieren der jeweiligen Zeilen ein.
 
Du solltest atomarer programmieren. Das bedeutet, dass du für jede Aufgabe eine eigene Methode bzw. Klasse hast. Das führt dazu, dass die erste Methode überflüssig ist. Am Ende der ersten Methode solltest du schlicht und einfach die zweite Methode aufrufen.

Im Idealfall lagerst du die erste Methode sogar in eine eigene Klasse aus.
 
@ChristianK

Du meinst, in der ersten Funktion nur die Daten aufnehmen und erst in der zweiten ins Array speichern?
Ist das denn nicht unnötige (Rechen-) Arbeit, die Daten doppelt überprüfen zu lassen?
Und so viele Zeilen spare ich damit ja auch nicht :-/
 
Ja, etwa so meine ich das. Du hast einerseits eine Klasse, die Inputs aus der Kommandozeile entgegen nimmt (was du damit anstellst, ist dieser Klasse egal). Da kannst du den Input bereits validieren (oder auch nicht). Dann hast du eine Klasse, die das Management des Arrays übernimmt (CRUD-Operationen). Und du hast eine Klasse, die die beiden anderen zusammenführt (also Input aus der einen Klasse holen und der anderen übergeben).

Das bedeutet vielleicht etwas mehr Arbeit, du kannst dafür die Komponenten auch lose koppeln. Und somit auch viel besser testen.
 

Zurück
Oben