Spock Framework

Silvio Wangler

Einleitung

Wer ist Silvio Wangler?

  • Entwickler mit Java, Groovy, Spring Hintergrund

  • 38 Jahre alt

  • lebt in Opfikon ZH, geboren und aufgewachsen in Zürich-Albisrieden

  • Ehemann und Vater

Was ist Spock?

  • Ein Testing Framework für Java Applikationen

  • Inspiriert durch JUnit, Mockito, jMock, Groovy, Scala

  • Es lässt einem Spezifikationen für eine bestimmte Klasse oder eine ganze Applikation schreiben

  • Es lässt Tests, durch den Einsatz einer Domain Specific Language, lesbarer werden

Wie schreibe ich einen Test?

    void "Eine Liste ist initial leer"() {
        expect:
        new ArrayList<>().isEmpty() == true
    }

Wie schreibe ich einen Test?

Spock Spezifikationen werden in Groovy Klassen implementiert.

Wie schreibe ich einen Test?

package ch.silviowangler.spock.intro

import spock.lang.Specification

class SimpleSpockWithoutCommentsSpec extends Specification {

    void "Eine Liste ist initial leer"() {
        expect:
        new ArrayList<>().isEmpty() == true
    }
}

Berechnen wir Fakultäten

3! = 3 * 2 * 1 = 6

Berechnen wir Fakultäten

    @Unroll
    void "Die Fakultät von #number ist #result"()
    {
        expect: 'Die Fakultät wird korrekt berechntet'
        Factorial.of(number) == result

        where: 'Datentabelle'
        number || result
        0L     || 1L
        1L     || 1L
        2L     || 2L
        3L     || 6L
    }

Anschauliche Resultate

junit runner factorial

Blöcke in Spock

Was bedeuten die Blöcke given, expect, when, usw. in Spock?

Blocks2Phases

Arbeiten mit Mocks

package ch.silviowangler.spock.booking;

/**
 * @author Silvio Wangler
 */
public class BookingService {

  // teure Ressource, wollen wir im Test besser mocken
  private BookingBackend bookingBackend;

  public BookingService(BookingBackend bookingBackend) {
    this.bookingBackend = bookingBackend;
  }

  public boolean bookEvent(String eventId, int amount) {
    try {
      this.bookingBackend.bookEvent(eventId, amount);
      return true;
    } catch (BookingException e) {
      return false;
    }
  }
}

Arbeiten mit Mocks

    void "Buche 2 Ticket für eine Veranstaltung"(){

        given:
        def backend = Mock(BookingBackend)
        BookingService bookingService = new BookingService(backend)

        when: 'zwei Tickets für die Veranstalung 22 gebucht werden'
        def result = bookingService.bookEvent('22', 2)

        then: 'ist die Transaktion erfolgreich'
        result

        and:
        1 * backend.bookEvent('22', 2)
        0 * _
    }

Arbeiten mit Mocks

    void "Simuliere Fehler beim Buchen"(){

        given:
        def backend = Mock(BookingBackend)
        BookingService bookingService = new BookingService(backend)
        def ex = new BookingException()

        when: 'zwei Tickets für die Veranstalung 22 gebucht werden'
        def result = bookingService.bookEvent('22', 2)

        then: 'ist die Transaktion nicht erfolgreich'
        !result

        and:
        1 * backend.bookEvent('22', 2) >> { throw ex }
        0 * _
    }

Unterlagen zu dieser Präsentation

The End

Vielen Dank für Ihre Aufmerksamkeit.