2017-07-21 3 views
0

J'ai le test spockSpock donné, quand, alors, où l'interaction contrôle ne fonctionne pas

def "setXandSave saves the parcel with the chosen xValue"() { 
    given: 
    jpaRepository.findOne(parcelId) >> parcel 

    when: 
    repository.setXandSave(parcelId, xValue) 

    then: 
    1 * parcel.setX(xValue) 
    1 * jpaRepository.save(parcel) 

    where: 
    parcelId | parcel     | xValue 
    10L  | Mock(ParcelEntity.class) | "a" 
    20L  | Mock(ParcelEntity.class) | "B" 
} 

suivant, je reçois une erreur « Trop peu pour les invocations: .. » pour la ligne 1 * parcel.setX(xValue).

Est-ce que je fais quelque chose de mal ou est-ce une limitation de Spock? J'ai débogué la méthode setXandSave lors de l'exécution du test et est en effet appelée. Mais spock dit

Unmatched invocations (ordered by similarity): 

None 

Toute aide sur la façon de déboguer le problème est également apprécié.

+0

Si je me souviens bien que vous auriez à bouchonner 'jpaRepository.findOne (parcelId) >> parcel' dans' puis: 'bloc. –

+0

Pourriez-vous partager un peu plus de code, par ex. la création du référentiel et la méthode 'setXandSave'. En outre, pourquoi créez-vous le faux dans le bloc où et pas dans le bloc donné? –

Répondre

1

Je ne vois pas de raison d'avoir where bloquer ici dans votre cas. La deuxième colonne a la duplication et peut être extraite de la table. Du point de vue du test, il n'y a pas non plus de différence entre les paires 10/'a' et '20'/'B'. Ainsi, nous pouvons simplifier votre test:

def "setXandSave saves the parcel with the chosen xValue"() { 
    given: 
    def parcelId = 10L 
    def xValue = 'a' 

    and: 
    def parcel = Mock(ParcelEntity) 
    jpaRepository.findOne(parcelId) >> parcel 

    when: 
    repository.setXandSave(parcelId, xValue) 

    then: 
    1 * parcel.setX(xValue) 
    1 * jpaRepository.save(parcel) 
}