Lista ToDo - jak napisać testy jednostkowe

0

Piszę w celu nauki projekt- liste todo , na razie konsolowo. jak napisać testy jednostkowe, pojaśni ktoś np na metodzie addTasks, jak sprawdzić dobrze tą metodę? rozumiem, że można sprawdzić np przekazac null, przekazac np wartosc 3 ale jak napisać taka metode testujaca. pisze w junit

public class Todo {
    static Scanner sc = new Scanner(System.in);
    ArrayList<String> tasks = new ArrayList<String>();
    ArrayList<String> products = new ArrayList<String>();

    void addTasks(){
        System.out.println("Input a count of task");
        int number = sc.nextInt();
        for(int i = 0; i < number; i++ ){
            System.out.println("Input task to todo lists");
            tasks.add(sc.next());
            System.out.print(tasks);
        }
    }
    void removeTask(){
        System.out.println("Input a count tasks to remove");
        int numOfTask = sc.nextInt();
        for(int i = 0; i < numOfTask; i++){
            System.out.println("Input task to remove");
            tasks.remove(sc.next());
            System.out.print(tasks);
        }
    }
    void editTask(){
        System.out.println("Input a count tasks to edit");
        int numEdit = sc.nextInt();
        for(int i = 0; i < numEdit; i++){
            System.out.println("Input number task to edit");
            int task = sc.nextInt();
            System.out.println("input new task");
            String newTask = sc.next();
            tasks.set(task, newTask);
            System.out.print(tasks);
        }
    }

    public static void main(String[] args) {
        Todo td = new Todo();
        td.addTasks();
        td.removeTask();
        td.editTask();

    }
}

1

Mieszasz logikę z interfejsem - na sam początek, aby móc to sensownie przetestować, musiałbyś oddzielić jedno od drugiego.

Czyli w klasie Todo nie powinieneś mieć żadnego System.out.println ani Scannera - tym powinna zajmować się odrębna klasa.

0

A gdzie chcesz tego nulla przekazać? Żadna z metod nie przyjmuje żadnego argumentu ani nic nie zwraca nie wiem jak Ty chcesz to testować...

Poza tym hmmm.... pp co tworzysz instancje klasy w niej samej? Nie wystarczy wywolac te metody bez tworzenia obiektu klasy?

4

Klasa miesza ze sobą 2 odpowiedzialności. IO oraz obsługę listy zadań. Dlatego jest prawie nietestowalna.
Z drugiej strony: się jednak da....
Twoja klasa generalnie bierze coś z input System.in i wyrzuca na System.out. Trzeba potestować czy dla danych inputów daje wymagane outputy.
Na początek warto dodać jako zależności (pola) InputStream i PrintStream ( mogą się nazywać in i out). I trzeba wszystkie wywołania przerobić, żeby nie było System.out.println(...) tylko this.out.println(....). W main wtedy normalnie konstruujesz tą klasę podając System.out i System.in jako argumenty. Powinno wszystko nadal działać tak samo.
Ale teraz będzie testowalne, bo w junitach możesz podać uprzednio nagrane inputy i sprawdzać czy na out poszło co trzeba. Do tego można wykorzystać ByteArrayInputStream i ByteArrayOutputStream.
Przykład:

InputStream input = new ByteArrayInputStream( "2\nzad1\nzad2\n".getBytes());
PrintStream output= new PrintStream( new ByteArratOutputStream(500));
Todo mytodo = new Todo(input, output);
mytodo.addTask();
 assertEquals("Input a count.......", output.toString());

W praktyce lepiej to podzielić na kilka klas i testować osobno. Ale to inna bajka.

1 użytkowników online, w tym zalogowanych: 0, gości: 1