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!"! !!
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.
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.
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.
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!'
}
}
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.
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.
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.
C'est pourquoi c'est une contre-mesure,
@ CompileStatic
à la classe de testJe 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.
Dans IDEA, quand je suis allé dans l'environnement Java-Spock,
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