Lorsque Spock @Partagé annotation doit être préféré à un champ statique?
Il n'y a pas grand chose à ajouter, toute la question est dans le titre.
Tenir compte de ces deux instances de la classe Foo utilisé dans un Spock spécification.
@Shared Foo foo1 = new Foo()
static Foo foo2 = new Foo()
Dans l'ensemble, je sais que l'idée derrière @Shared
annotation, mais je suppose que c'est mieux d'utiliser les fonctionnalités de langage, qui dans ce cas serait static
champ.
Sont-t-il des cas dans lesquels on doit la préférence sur les autres ou c'est plutôt une question de goût?
- Autant que je sache, ils sont en fait le même point de vue fonctionnel, mais
@Shared
meilleure montre votre intention
Vous devez vous connecter pour publier un commentaire.
Spock est tout au sujet de expressivité et clarté.
Statique est un mot-clé Java qui montre le fonctionnement interne de la classe (que ce champ est le même pour toutes les instances)
@Partagé est un Spock fonctionnalité qui dit au lecteur que cette variable est la même pour toutes les fonctionnalité de méthodes. C'est un enseignement spécifiquement pour le test unitaire et fait l'unité de test plus clair pour le lecteur.
La même chose peut être dite pour les principaux Spock blocs. Si vous pensez à ce sujet, ils n'ont pas vraiment changer quoi que ce soit sur le code.
Les deux tests unitaires faire exactement la même chose techniquement. La deuxième est cependant de montrer plus clairement l'intention. Le lorsque: et alors: les étiquettes ne sont pas vraiment faire n'importe quoi avec le code autre que de préciser son intention.
Donc, pour résumer, @Partagé est de rendre le test plus lisible. (Voir aussi @Question, @Titre etc., ils existent pour la même raison)
Contrairement à JUnit, où vous devez déclarer la variable de champ statique et d'attribuer de la valeur dans
de sorte qu'il a été initialisé, juste une fois, par suite de tests (pas chaque méthode), dans Spock vous pouvez utiliser le champ de variable et de les annoter avec
@Shared
.Considérons l'exemple suivant:
De course SubclassSpec vous donne la sortie suivante:
Ne peut pas expliquer l'ordre d'impression, mais c'est en raison de l'AST.
@Shared
fait spécification plus lisible et permet à l'avantage d'une instance basée sur des méthodes (comme la suppression).Comme une approche plus exhaustive, voici un exemple de test avec des sorties:
Le plus surprenant pour moi est que la variable dans la classe "
setup()
méthode AINSI QUE la mondiale, instanciées variable obtenir réinitialisé à chaque test (sans doute parce que la classe est à nouveau instancié pour chaque cas de test). Pendant ce temps, lestatic
et la@Shared
variable fonctionner comme prévu. En conséquence, les deux derniers sont également peuvent être consultés danswhere
clauses, qui sont exécutées avant que certains de ceux qui sont inscrites avant dans chaque cas de test.@Test
cas, pas étonnant, même pour JUnit. Pouvez-vous expliquer la dernière phrase? Je n'ai pas l'obtenir.