Dans quelle mesure IDEA peut nous aider avec Java-Spock

introduction

L'autre jour, un sujet comme "Que fait l'outil de refactoring de l'EDI lors de l'écriture avec Java test Spock?" Est venu, alors j'ai cherché. S'il vous plaît laissez-nous savoir s'il y a des erreurs ou des histoires comme "J'aimerais pouvoir faire ça dans un tel cas!"! !!

Mise en place: écriture de tests Java dans Spock

Vous rédigez des tests Java dans d'autres langues en premier lieu?

JUnit est un framework de test Java bien connu, mais vous pouvez rencontrer des cas difficiles lors de l'examen de la maintenabilité. Par conséquent, même pour les services implémentés en Java, il existe une option pour écrire des cas de test dans d'autres langages. Il y a beaucoup de discussions ici [^ 1], et un exemple est le sujet de l'écriture de tests Java dans Spock.

Qu'est-ce que Spock

Un cadre de test implémenté dans Groovy. Groovy a des utilisateurs enthousiastes [^ 2], par exemple, le père de Jenkins, Kawaguchi, a déclaré ["Il n'est plus possible de ne pas écrire de tests JUnit dans Groovy"](http://d.hatena.ne. jp / kkawa / 2011212).

Spock utilise pleinement les fonctionnalités de Groovy et vous permet d'écrire de manière plus concise que JUnit. Pour écrire du code Java dans Spock, voir Articles Qiita et Livres -with-spock) etc. sortent, et je pense que cela augmentera encore à l'avenir.

Combien vous pouvez emprunter la puissance de l'IDE

Désormais, lors de l'écriture de tests Java dans Groovy, le problème est de savoir à quel point l'EDI peut être de votre côté. Parce que Groovy est un langage dynamique, il est facile d'imaginer des situations où les changements automatiques de signature de méthode ne fonctionnent pas [^ 3]. Cette fois, c'est un rapport que je l'ai examiné. L'IDE utilisé cette fois est IntelliJ IDEA 2016.3.4.

Java-Spock avec IDEA

Code à utiliser cette fois

Cette fois, je vais essayer diverses choses en utilisant code github TDDBC.

Le code de production est Java


public class SampleOfJava {

    public String say() {
        return "Hello TDD BootCamp!";
    }

}

Le code de test est Groovy(Spock)


class SampleSpec extends Specification {

    def "should return 'Hello TDD BootCamp!' in Java"() {

        given:
        def sut = new SampleOfJava()

        when:
        String actual = sut.say()

        then:
        actual == 'Hello TDD BootCamp!'

    }

}

Renommer la méthode

Tout d'abord, renommons la méthode que vous utiliserez souvent. Renommons la méthode say. Vous pouvez utiliser shift + F6.

Renommer


    public String shout() { //Je l'ai renommé pour crier
        return "Hello TDD BootCamp!";
    }

Le code de test a également été renommé automatiquement.

        given:
        def sut = new SampleOfJava()

        when:
        String actual = sut.shout() //Renommé

        then:
        actual == 'Hello TDD BootCamp!'

Tout d'abord, il n'y a pas de problème.

Changements de signature

Ensuite, essayez de changer la signature. L'écran de refactorisation s'ouvre avec command + F6, essayez donc d'ajouter plusieurs paramètres comme indiqué ci-dessous.

Type Name
String addedString
Integer addedInteger

Bien entendu, la signature du code de production a été modifiée.

Changements de signature


    public String say(String addedString, Integer addedInteger) { //Ajouter deux arguments
        return "Hello TDD BootCamp!";
    }

La signature du code de test a également changé. Mais ce n'est pas très poli. .. ..

        when:
        String actual = sut.say(,) //Des arguments ont été ajoutés, mais j'ai l'impression que je veux que vous fassiez quelque chose d'un peu plus

Si vous n'aimez pas cela, c'est un peu mieux si vous incluez la Valeur par défaut que vous pouvez saisir plus tôt sur l'écran de refactoring.

        when:
        String actual = sut.say("DEFAULT", i) //Si vous entrez la valeur par défaut, cela ressemble un peu plus à ça

J'aimerais une autre voix, mais faisons-le.

Soyez prudent lorsque vous ajoutez un seul argument

J'essayais et j'ai remarqué une partie délicate. C'est lors de la modification de la signature pour augmenter l'argument de un seul </ b>. Par exemple, lorsque j'ai augmenté les arguments avec l'outil de refactorisation comme indiqué ci-dessous, le code de production a changé.

Modifier la signature (ajouter un seul argument)


    public String say(String anotherParameter) { //Argument ajouté
        return "Hello TDD BootCamp!";
    }

Est-ce le code de test? ?? Cela n'a pas été changé.

        when:
        String actual = sut.say() //Les arguments n'augmentent pas orz

Je suis auteur-compositeur parce que je peux réussir le test en fonction de la manière dont je l'écris. La raison en est que dans Groovy, lors de l'appel d'une méthode avec un argument, même si l'appelant l'appelle sans définir d'argument, null est automatiquement défini et il est mesuré correctement. [^ 4]. En d'autres termes, le code précédent

        when:
        String actual = sut.say(null) //Null est attribué automatiquement

Est équivalent à. Donc, il semble que IDEA le sache et n'ajoute pas l'argument de l'appelant avec l'élan que "ça va". (Peut-être que c'est un bug) C'est assez effrayant.

Contre-mesures

C'est pourquoi c'est une contre-mesure,

  1. Entrez le paramètre par défaut lors de la refactorisation
  2. Ajoutez @ CompileStatic à la classe de test

Je pense que oui. J'ai déjà abordé 1. donc ça va, mais un peu plus sur 2. Groovy est un langage dynamique, mais il a également la possibilité de compiler statiquement. C'est l'annotation @CompileStatic. Si vous ajoutez ceci, même si le système de refactorisation échoue, vous obtiendrez une erreur de compilation, alors soyez conscient. Cela dit, ce n'est pas une bonne solution car l'outil de refactorisation ne fonctionne pas.

Résumé

Dans IDEA, quand je suis allé dans l'environnement Java-Spock,

  • Vous pouvez utiliser des outils de refactorisation fréquemment utilisés tels que renommer et modifier les signatures sans aucun problème de base.
  • Notez que changer la signature avec un argument est délicat.

C'était une histoire que je comprenais. Personnellement, je recommande fortement la configuration Java-Spock, mais si vous le faites, faisons attention aux détails.

[^ 1]: C'est un peu vieux, mais http://devtesting.jp/pekema/?0002%2FHotlinks est bien organisé. [^ 2]: Bien sûr, je suis l'un d'entre eux. [^ 3]: La raison en est qu'il n'est pas décidé si la méthode de la signature qui existe jusqu'au moment de l'exécution est appelée. Puisqu'il peut être méta-programmé, il est conceptuellement possible que des méthodes soient ajoutées dynamiquement juste avant l'exécution. [^ 4]: je l'ai complètement oublié, mais j'en ai écrit dans Qiita il y a longtemps. http://qiita.com/PoohSunny/items/a1de52653d09133de4ad

Recommended Posts

Dans quelle mesure IDEA peut nous aider avec Java-Spock
Comment puis-je remplir efficacement un tableau?
Comment enregistrer même si la clé externe est nulle