# Tests:
### Power Assertions
Genau wie in Java, gibt es in Groovy auch das Schlüsselwort `assert`. Im Gegensatz zu Java sind Assertions in Groovy jedoch standardmäßig aktiviert. Sie erleichtern die Fehlersuche und das Debugging und zeigen eine Übersicht des Ausdrucks mitsamt der **aktuellen** Variablenwerten. Der Entwickler sieht also genau, welcher Teil des Ausdrucks das Problem verursacht hat.
````Groovy
def a = 1
def b = 2
def c = 3
// Ausdruck liefert 9 statt 10
assert a + b * c == 10
````
Es kann während der Auswertung von Power-Assertions zu inkonsistenten Fehlermeldungen kommen. Das liegt daran, dass bei den Power-Assertions nur die Referenzen auf die Variablen gespeichert. Werden diese Werte also verändert, werden nur die aktuellen Werte angezeigt, da über die Referenz auf die Variable zugegriffen wird.
````Groovy
def getLastAndRemove(list) {
return list.remove(list.size() - 1)
}
def list = [1, 2, 3]
assert getLastAndRemove(list) == 4
````
````Groovy
assert [[1,2,3,3,3,3,4]].first().unique() == [1,2,3]
````
---
## Spock:
- Groovy bietet nicht nur Support für JUnit 5 (und älter), sondern liefert auch einen eigenen Satz an Testmethoden, um die testgetriebene Programmierung zu vereinfachen.
Ein Beispiel hierfür wäre Spock. Mit Spock kann man sowohl Java, als auch Groovy Code testen. Getestet wird mit sogenannten Spezifikationen. Die Testklasse muss also von `spock.lang.Specification` erben.
````Groovy
class StackSpec extends Specification {
def "Ein Element zum Stack hinzufuegen führt zur erhoehung von size"() {
setup: "Eine neue Stack-Instanz wurde erstellt"
def stack = new Stack()
when:
stack.push 42
then:
stack.size() == 1
}
}
````
##### Erklärung:
- Der Name der Testmethode muss ein String sein, der beschreibt, was beim Testen erwartet wird.
- Das Schlüsselwort `setup` dient dazu, lokale Variablen zu initialisieren, die für den Test gebraucht werden (vgl. **@BeforeEach** Annotation, JUnit)
3. Das `when` Schlüsselwort beschreibt den Codeabschnitt, der zu einem bestimmten Verhalten führen soll
4. `then` beschreibt das erwartete Verhalten.