2017-10-06 5 views
1

Étant donné une méthode avec un paramètre dans Java, par ex.Spock: Renvoie le paramètre d'entrée dans Stubs

public class Foo { 
    public Bar theBar(Bar bar) { /*... */ } 
} 

Lorsque stubbing/moqueur foo, comment puis-je dire à accepter tout argument et le retourner? (Groovy)

def fooStub = Stub(Foo) { 
    theBar(/*what to pass here*/) >> { x -> x } 
} 

Comme vous pouvez le voir, je passé la fonction d'identité. Cependant je ne sais pas ce qu'il faut passer comme argument. _ ne fonctionne pas parce que c'est un ArrayList et donc pas de type Bar

+0

Avez-vous '@ CompileStatic' ou' @ TypeChecked' sur votre modèle? Pourriez-vous poster votre code entier, il n'y a aucune raison pour que '_' ne fonctionne pas. –

Répondre

0

Je ne suis pas sûr de savoir ce que vous voulez dire. _ est la bonne chose à passer. Pourquoi pensez-vous que c'est un ArrayList? Il est de type Object et peut être utilisé pour n'importe quoi.

+0

Cela signifie que Java a le mauvais type (pas 'Bar'), n'est-ce pas? – user3001

+0

Alors? Spock est basé sur Groovy, vous ne pouvez pas utiliser Spock avec Java. – Vampire

2

Vous pouvez stub Foo classe comme suit:

Foo foo = Stub(Foo) 
foo.theBar(_ as Bar) >> { Bar bar -> bar } 

Et voici exemple complet:

import groovy.transform.Immutable 
import spock.lang.Specification 

class StubbingSpec extends Specification { 

    def "stub that returns passed parameter"() { 
     given: 
     Foo foo = Stub(Foo) 
     foo.theBar(_ as Bar) >> { Bar bar -> bar } 

     when: 
     def result = foo.theBar(new Bar(10)) 

     then: 
     result.id == 10 
    } 

    static class Foo { 
     Bar theBar(Bar bar) { 
      return null 
     } 
    } 

    @Immutable 
    static class Bar { 
     Integer id 
    } 
} 
+0

Avez-vous essayé la même chose avec 'Foo' et' Bar' étant des classes Java? – user3001

+0

@ user3001 Oui, cela fonctionne exactement de la même façon lorsque 'Foo' et' Bar' sont des classes Java, juste testé cet exemple et obtenu le même résultat. –