J'ai quelques Java trucs comme ça:
public interface EventBus{
void fireEvent(GwtEvent<?> event);
}
public class SaveCommentEvent extends GwtEvent<?>{
private finalComment oldComment;
private final Comment newComment;
public SaveCommentEvent(Comment oldComment,Comment newComment){
this.oldComment=oldComment;
this.newComment=newComment;
}
public Comment getOldComment(){...}
public Comment getNewComment(){...}
}
et testez le code comme ceci:
def "...."(){
EventBus eventBus=Mock()
Comment oldComment=Mock()
Comment newCommnet=Mock()
when:
eventBus.fireEvent(new SaveCommentEvent(oldComment,newComment))
then:
1*eventBus.fireEvent(
{
it.source.getClass()==SaveCommentEvent;
it.oldComment==oldComment;
it.newComment==newComment
}
)
}
Je veux vérifier que la eventBus.fireEvent(..)
est appelée une fois avec un événement de type SaveCommentEvent
et les paramètres de construction oldComment
et newComment
.
Le code s'exécute sans erreur mais le problème est:
Après avoir changé les éléments de fermeture de
{
it.source.getClass()==SaveCommentEvent;
it.oldComment==oldComment; //old==old
it.newComment==newComment //new==new
}
À
{
it.source.getClass()==Other_Class_Literal;
it.oldComment==newComment; //old==new
it.newComment==oldComment //new==old
}
Pourtant, le code s'exécute sans erreur? Apparemment, la fermeture n'a pas fait ce que je voulais, alors la question est: comment faire la capture d'argument?
J? ai compris:
SaveCommentEvent firedEvent
given:
...
when:
....
then:
1 * eventBus.fireEvent(_) >> {arguments -> firedEvent=arguments[0]}
firedEvent instanceof SaveModelEvent
firedEvent.newModel == newModel
firedEvent.oldModel == oldModel
then:
1*eventBus.fireEvent(
{
it.source.getClass()==SaveCommentEvent;
it.oldComment==oldComment;
it.newComment==newComment
}
)
Dans votre code, it
est une Groovy Closure Implicit Variable référence à une fausse interface eventBus qui n'a pas de champs. Comment pouvez-vous les vérifier?
De plus, je pense que l'ordre des événements qui doivent se produire pour utiliser Spock Mocks n'est pas nécessairement intuitif. Je l'écrirais ici, sauf que ce ne serait pas aussi bon que Explication de Kenneth Kousen .
Même idée avec @ Alex Luya mais mettez les assertions dans la fermeture et utilisez assert
sur chacune d'elles. cf. Spock Framework Reference Documentation .
then:
1 * eventBus.fireEvent(_) >> {
def firedEvent = it[0]
assert firedEvent instanceof SaveModelEvent
assert firedEvent.newModel == newModel
assert firedEvent.oldModel == oldModel
}
Dans la réponse de @ alex-luya ci-dessus, j'ai trouvé que la variable firedEvent
a besoin du @Shared
annotation.
Ensuite, je peux capturer la valeur et exécuter mes vérifications sur la valeur en dehors de la fermeture.