Mockito - Aufgaben
Aufgaben zu Modul #J4 - Testing / Mockito
Eine Wörterbuch-Anwendung bewahrt die Einträge in einer Datenbank.
Die Interaktion mit der Datenbank wird durch ein DictionaryRepository umgesetzt.
Ein DictionaryRepository setzt folgendes Interface um:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
| public interface DictionaryRepository {
/**
* Die Methode erhält ein Wort und die Definition dazu und speichert diese als Eintrag in der Datenbank
*
* @Param word das Wort, welche in dem Wörterbuch hinzugefügt werden soll
* @Param definition die Definition des Wortes
* */
void add(String key, String value);
/**
* Die Methode aktualisiert die Definition des Wortes in der Wörterbuch-Datenbank
*
* @Param word das Wort, welche in dem Wörterbuch bereits existiert
* @Param definition die aktualisierte Definition des Wortes
* */
void update(String key, String value);
/**
* Die Methode liefert die Definition für das gegebene Wort aus der Wörterbuch-Datenbank zurück.
*
* @Param word das Wort, dessen Definition gesucht wird
* @Return die Definition des Wortes aus der Wörterbuch-Datenbank, falls vorhanden, ansonsten null
* */
String getDefinition(String word);
}
|
Die Klasse Dictionary beinhaltet die Business-Logik des Wörterbuchs und verwendet ein DictionaryRepository,
um die Einträge in der Datenbank zu speichern und zu finden:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
| public enum DictionaryStatus {
ADDED,
UPDATED,
INVALID,
NOT_FOUND
}
public class Dictionary {
private final DictionaryRepository repository;
public Dictionary(DictionaryRepository repository) {
this.repository = repository;
}
/**
* Die Methode schreibt eine Definition für ein Wort in der Wörterbuch-Datenbank.
* Zuerst wird geschaut, ob das Wort in der Datenbank bereits existiert.
* Falls das Wort noch nicht existiert, wird einen neuen Eintrag in der Datenbank erstellt.
* Falls das Wort bereits existiert, wird seine Definition aktualisiert.
*
* @Param word das Wort, welche in dem Wörterbuch hinzugefügt oder aktualisiert werden soll
* @Param definition die Definition des Wortes
* @Return DictionaryStatus.ADDED falls das Wort neu ist, DictionaryStatus.UPDATED falls das Wort
* bereits vorhanden war und DictionaryStatus.INVALID, falls das Wort ein leerer String ist oder Zahlen beinhaltet
* */
public DictionaryStatus addOrUpdateWord(String word, String definition) {
//TODO gemäss JavaDoc umsetzen
}
/**
* Die Methode sucht nach der Definition des gegebenen Worts.
* Falls das Wort existiert, wird die Definition zurückgeliefert und ansonsten einen
* Text, welcher darauf hinweist, dass das Wort nicht vorhanden ist.
*
* @Param word das Wort, dessen Definition gesucht wird
* @Return die Definition des Wortes, falls das Wort im Wörterbuch existiert. Ansonsten folgenden Text:
* "Das Wort xxx konnte im Wörterbuch nicht gefunden werden" (xxx steht als Platzhalter für das gesuchte Wort)
* */
public String getDefinition(String word) {
//TODO gemäss JavaDoc umsetzen
}
}
|
Aufgabe
Schreibe eine Test-Klasse für Dictionary, welche folgende Tests beinhaltet:
- Tests der Methode addOrUpdateWord:
- Das Wort befindet sich noch nicht in der Datenbank
- Das Wort befindet sich bereits in der Datenbank
- Das Wort ist ein leerer String
- Das Wort beinhaltet Zahlen
- Tests der Methode getDefinition:
- Das gesuchte Wort existiert in der Datenbank
- Das gesuchte Wort existiert nicht in der Datenbank
- Das gesuchte Wort is ungültig: leerer String
- Das gesuchte Wort is ungültig: das Wort beinhaltet Zahlen
Anforderungen
- Schreibe jeweils einen Test und erweitere den Code dann nur soweit bis der Test grün ist. Wiederhole dies für alle Tests (die bestehende Tests müssen weiterhin funktionieren!).
- Der Interface DictionaryRepository darf nicht umgesetzt werden. Für die Tests wird ein Mock oder ein Spy aus dem Mockito-Framework verwendet.
- Jede Test-Methode hat folgendes Namensschema:
1
2
3
| public void given_when_then() {
...
}
|
Wobei:- given die Ausgangslage definiert
- when ist der Name der Methode, welche getestet wird
- then ist das Ergebnis, welche erwartet wird
- Jede Test-Methode prüft, dass alle Methoden eines Mocks/Spy’s welche aufgerufen werden müssen, auch aufgerufen wurden.
- Jede Test-Methode prüft, dass alle Methoden eines Mocks/Spy’s welche NICHT aufgerufen werden sollen, auch nicht aufgerufen wurden.
Hier kannst du zurück zur Theorie.