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.
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.
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;
}
}
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'
}
}
Überprüfen Sie als Referenz auch den Fall von Mock und Stub.
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
}
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()
Recommended Posts