[JAVA] Verspotten Sie nur einige Methoden mit Spock

Dieser Artikel ist der 25. Tag von G * Adventskalender Adventskalender 2016. Am Tag zuvor war @ hikarirus Verwenden eines HTTP-Clients mit Grails (natürlich einen Test schreiben).

G * hat erst vor ungefähr einem halben Jahr angefangen, Spock zu berühren, aber da der letzte Tag frei war, werde ich den Sprung wagen und ihn veröffentlichen. Obwohl ich wenig Erfahrung habe, habe ich festgestellt, dass die Flexibilität von Groovy / Spock beim Testen effektiv ist.

Überblick

Ich werde darüber schreiben, wie man nur einige Methoden mit Spock verspottet.

Es wird davon ausgegangen, dass Sie nur die Nichtzielmethode verspotten möchten, wenn die Testzielmethode eine andere Methode desselben Objekts aufruft.

Die zu testende Klasse ist in Java geschrieben.

Getestete Klasse

public class Name {

  private String firstName;
  private String lastName;

  public Name(String firstName, String lastName) {
    this.firstName = firstName;
    this.lastName = lastName;
  }

  public String getFullName() {
    return getFirstName() + " " + getLastName();
  }

  public String getFirstName() {
    return firstName;
  }

  public String getLastName() {
    return lastName;
  }
}

Verwenden Sie Spy for Mock für einige Methoden

Mit Spy können nur einige Methoden ersetzt werden.

class NameSpec extends Specification {
    def "Versuchen Sie es mit Spy"() {
        setup:
        //Spionieren Sie, indem Sie das Konstruktorargument übergeben
        def spiedName = Spy(Name, constructorArgs: ['Taro', 'Yamada'])
        //Schreiben Sie nur einige Methoden neu
        spiedName.getFirstName() >> 'Hanako'

        expect:
        //Umgeschriebene Methode
        spiedName.getFirstName() == 'Hanako'
        //Die Methode, die nicht neu geschrieben wurde, funktioniert wie sie ist
        spiedName.getLastName() == 'Yamada'
        //Intern aufgerufene Methoden funktionieren genauso gut
        spiedName.getFullName() == 'Hanako Yamada'
    }
}

Ordnungsgemäße Verwendung mit Mock and Stub

Überprüfen Sie als Referenz auch den Fall von Mock und Stub.

Für Mock

Mock verspottet das gesamte Objekt. Alle Mock-Verhaltensweisen sollten explizit sein (falls erforderlich).

def "Versuchen Sie es mit Mock" () {
    setup:
    def mockedName = Mock(Name)
    //Schreiben Sie nur einige Methoden neu
    mockedName.getFirstName() >> 'Taro'

    expect:
    //Umgeschriebene Methode
    mockedName.getFirstName() == 'Taro'
    //Ungeschriebene Methoden bewirken nichts
    mockedName.getLastName() == null
    //Tun Sie nichts, auch nicht für intern aufgerufene Methoden
    mockedName.getFullName() == null
}

Für Stub

Das gesamte Objekt von Stub wird zu Stub. Sie können den Stub-Wert (Rückgabewert) neu schreiben. Die nicht geschriebene Methode gibt einen geeigneten Wert zurück, z. B. ein leeres Zeichen oder ein Dummy-Objekt.

def "Versuchen Sie es mit Stub"() {
    setup:
    def stubbedName = Stub(Name)
    //Schreiben Sie nur einige Methoden neu
    stubbedName.getFirstName() >> 'Taro'

    expect:
    //Umgeschriebene Methode
    stubbedName.getFirstName() == 'Taro'
    //Die nicht geschriebene Methode gibt einen geeigneten Wert zurück
    stubbedName.getLastName() == ''
    //Ignorieren Sie intern aufgerufene Methoden und geben Sie einen geeigneten Wert zurück
    stubbedName.getFullName() == ''
}

Bitte beachten Sie, dass im Fall von Stub eine Ausnahme auftritt, wenn Sie die Anzahl der mit Mock oder Spy möglichen Anrufe testen.

//InvalidSpecException ausgelöst
1 * stubbedName.getFirstName()

Zusammenfassung

Referenz

Recommended Posts

Verspotten Sie nur einige Methoden mit Spock
Verspotten Sie statische Methoden mit PowerMock
Machen Sie System.out Mock mit dem Spock Test Framework
Mock Enum mit PowerMock
Wie man einige Methoden der zu testenden Klasse verspottet
Verspotten Sie den Konstruktor mit PowerMock
Optimieren Sie Java-Tests mit Spock
Verspotten Sie statische Methoden in Mockito 3.4