[JAVA] Mock seulement quelques méthodes avec Spock

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.

Aperçu

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.

Classe testée

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;
  }
}

Utilisez Spy for Mock pour certaines méthodes

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'
    }
}

Utilisation correcte avec Mock et Stub

Pour référence, vérifiez également le cas de Mock et Stub.

Pour Mock

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
}

Pour Stub

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()

Résumé

--Utilisez Spy pour réécrire certaines méthodes --Utiliser correctement avec Mock et Stub --Spock est amusant

référence

Recommended Posts

Mock seulement quelques méthodes avec Spock
Méthodes statiques simulées avec PowerMock
Rendre System.out Mock avec Spock Test Framework
Mock Enum avec PowerMock
Comment se moquer de certaines méthodes de la classe testée
Mock le constructeur avec PowerMock
Rationalisez les tests Java avec Spock
Méthodes statiques simulées dans Mockito 3.4