Cet article est le 25ème jour du Calendrier de l'Avent G * Advent Calendar 2016. La veille était @ hikariru Utilisation d'un client HTTP avec Grails (bien sûr, écriture d'un test).
G * n'a commencé à toucher Spock qu'il y a environ six mois, mais comme le dernier jour était gratuit, je vais franchir le pas et le poster. Bien que j'aie peu d'expérience, j'ai réalisé que la flexibilité de Groovy / Spock est efficace dans les tests.
J'écrirai sur la façon de simuler uniquement certaines méthodes avec Spock.
Il est supposé que vous souhaitez Mock uniquement la méthode non cible lorsque la méthode cible de test appelle une autre méthode du même objet.
La classe à tester est écrite en Java.
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;
}
}
En utilisant Spy, seules certaines méthodes peuvent être remplacées.
class NameSpec extends Specification {
def "Essayez Spy"() {
setup:
//Espionner en passant l'argument du constructeur
def spiedName = Spy(Name, constructorArgs: ['Taro', 'Yamada'])
//Réécrire uniquement certaines méthodes
spiedName.getFirstName() >> 'Hanako'
expect:
//Méthode réécrite
spiedName.getFirstName() == 'Hanako'
//La méthode qui n'a pas été réécrite fonctionne telle quelle
spiedName.getLastName() == 'Yamada'
//Les méthodes appelées en interne fonctionnent également bien
spiedName.getFullName() == 'Hanako Yamada'
}
}
Pour référence, vérifiez également le cas de Mock et Stub.
Mock se moquera de l'objet entier. Tous les comportements simulés doivent être explicites (si nécessaire).
def "Essayez Mock" () {
setup:
def mockedName = Mock(Name)
//Réécrire uniquement certaines méthodes
mockedName.getFirstName() >> 'Taro'
expect:
//Méthode réécrite
mockedName.getFirstName() == 'Taro'
//Les méthodes non réécrites ne font rien
mockedName.getLastName() == null
//Ne rien faire même pour les méthodes appelées en interne
mockedName.getFullName() == null
}
L'objet entier de Stub devient Stub. Vous pouvez réécrire la valeur de stub (valeur de retour). La méthode non réécrite renvoie une valeur appropriée telle qu'un caractère vide ou un objet factice.
def "Essayez Stub"() {
setup:
def stubbedName = Stub(Name)
//Réécrire uniquement certaines méthodes
stubbedName.getFirstName() >> 'Taro'
expect:
//Méthode réécrite
stubbedName.getFirstName() == 'Taro'
//La méthode non réécrite renvoie une valeur appropriée
stubbedName.getLastName() == ''
//Ignorer les méthodes appelées en interne et renvoyer une valeur appropriée
stubbedName.getFullName() == ''
}
Veuillez noter que dans le cas de Stub, une exception se produira si vous testez le nombre d'appels possibles avec Mock ou Spy.
//InvalidSpecException levée
1 * stubbedName.getFirstName()
--Utilisez Spy pour réécrire certaines méthodes --Utiliser correctement avec Mock et Stub --Spock est amusant
Recommended Posts