Spock vérification d'une exception levée par la maquette de concert avec des simulations de l'interaction

Le problème que j'ai rencontré, c'est quand j'ai essayer de vérifier dans le then bloc qu'une exception a été levée, et que l'appel sur une maquette a été faite.

Oeil à la configuration ci-dessous:

class B {
    def b(A a) {
        a.a()
    }
}

class A {
    def a() {
    }
}

def "foo"() {
    given:
    def a = Mock(A)
    a.a() >> { throw new RuntimeException() }
    B b = new B()

    when:
    b.b(a)

    then:
    thrown(RuntimeException)
    1 * a.a()
}

Le test ci-dessus échoue avec le message: Expected exception java.lang.RuntimeException, but no exception was thrown, mais le réglage du code de la maquette explicitement lève l'exception.

Assez drôle, si vous supprimez la dernière ligne: 1 * a.a() le test passe. Je n'ai pas eu de problème similaire lors de la mise en place un autre assertions dans le bloc qui ne se vérifient pas les exceptions.

Aucune idées de ce qu'il se passe?

Alors que @Opale réponse est bonne, je serais question de savoir pourquoi c'est une bonne idée. Généralement (certainement pas dans tous les cas, mais beaucoup), vous avez uniquement besoin de vérifier une interaction se produit lorsque la méthode en question n'a pas d'effet direct sur le code sous test. Une méthode qui retourne une valeur ou lève une exception.
Le code de la question a été inspiré par un cas réel dans lequel je voulais vérifier qu'une méthode d'écriture à une base de données est appelée, et si une erreur est levée, elle est propagée. Il pourrait y avoir d'autres raisons de cette exception particulière, j'ai donc nécessaire de vérifier que l'interaction avec le simulacre est la raison pour laquelle il.

OriginalL'auteur jarzeb | 2015-04-30