web-dev-qa-db-fra.com

Comment faire la capture d'arguments avec le framework Spock?

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?

22
Alex Luya

J? ai compris:

    SaveCommentEvent firedEvent

    given:
     ...

    when:
     ....

    then:
    1 * eventBus.fireEvent(_) >> {arguments -> firedEvent=arguments[0]}
    firedEvent instanceof SaveModelEvent
    firedEvent.newModel == newModel
    firedEvent.oldModel == oldModel
40
Alex Luya
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 .

9
jeremyjjbrown

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
    }
1
ryu1kn

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.

1
Werd