2017-10-19 1 views
2

Ich habe ein Problem mit der Liste der gewünschten Objekte von Spock Groovy verspottet Schnittstelle Rückkehr:Wie Liste zurückzukehren für mock in groovy spock Test

public interface SomeRepository { 
    List<SomeObject> getAll(); 
} 

Deshalb möchte ich, dass verspotten in Klasse:

@CompileStatic 
class SomeProcessor { 
    private final SomeRepository repository 

    SomeProcessor(SomeRepository repository) { 
     this.repository = repository 
    } 

    List<SomeObject> getAll() { 
     return repository.all 
    } 
} 

Und ich habe diesen Test:

class SomeProcessorSpec extends Specification { 
    private final SomeRepository repository = Mock(SomeRepository) 

    @Subject private final SomeProcessor processor = new SomeProcessor(repository) 

    def 'should collect items from repository'() { 
     given: 
      List<SomeObject> expected = [new SomeObject(), new SomeObject()] 
      repository.all >> expected 

     when: 
      List<SomeObject> actual = processor.all 

     then: 
      assertEquals(expected, actual) 
    } 
} 

Wenn ich versuche, diesen Test ich eine Assertion Fehler angezeigt auszuführen:

junit.framework.AssertionFailedError: Expected :[[email protected], [email protected]] Actual :null

So bedeutet es, dass aus repository.all Methode zurückgegeben es null und nicht meine erwartete Liste, die ich ist verwirrend. Und die Frage ist: Wie kann man tatsächlich eine Liste von verspotteten Instanzen zurückgeben, wenn man mit spock und groovy testet?

+0

'repository.all >> erwartet 'sieht aus wie Entfernung für mich. versuch es mit 'repository.all = new ArrayList (expected)' – injecteer

+0

zu ersetzen Ich habe deinen Code 1: 1 getestet, das einzige, was ich geändert habe, ist 'Object' anstelle von' SomeObject' und es funktioniert genauso, wie du es erwartest Arbeit. Ich habe es mit Spock 1.0-groovy-2.4 und 1.1-groovy-2.4 versucht und beide haben gut funktioniert. – Vampire

+0

Btw, ist dieser genaue Code, der nicht für Sie arbeitet oder ein kurzes PoC, das versucht, Ihr Problem zu widerspiegeln? Vielleicht haben Sie ein ähnliches Problem - https://github.com/kiview/spring-spock-mock-beans-demo/issues/1? –

Antwort

3

Sie können versuchen, den Stubbing-Teil in die Interaktionsprüfphase zu verschieben, z.

def 'should collect items from repository'() { 
    given: 
     List<SomeObject> expected = [new SomeObject(), new SomeObject()] 

    when: 
     List<SomeObject> actual = processor.all 

    then: 
     1 * repository.all >> expected 

    and: 
     expected == actual 
} 

Auch Sie haben nicht JUnit verwenden assertEquals - Groovy können Sie beide Objekte mit == Operator vergleichen.

Ich habe Ihr Beispiel in einer einfachen Spock-basierten App überprüft und es hat gut funktioniert. Ich habe es mit Spock 0.7-groovy-2.0, 1.0-groovy-2.4 und 1.2-groovy-2.4-SNAPSHOT getestet, arbeitete mit allen Spock-Versionen. Wie auch immer, ich hatte einige ähnliche Probleme in der Vergangenheit und Stubbing als Interaktions-Check hat den Trick in diesen Fällen. Ich hoffe es hilft.

+0

danke für den Hinweis zur Interaktionskontrolle –

0

Nach White-Box-Test besser zu testen, genau das gleiche, was implementiert ist. processor.all liefert das Ergebnis von repository.all wie es ist. Also, besser, diese Tatsache zu testen.

Basierend auf dem richtigen Code zur Verfügung gestellt von Szymon Stepniak der Test vereinfacht werden kann:

def 'should collect items from repository'() { 
    given: 
     def expected = [] 

    when: 
     def actual = processor.all 

    then: 
     1 * repository.all >> expected 

    and: 'make sure we got the same expected list instance' 
     actual.is(expected) 
} 

wo durch .is() wir die gleichen Referenzen überprüfen.

Als Ergebnis ist es nicht das, was die Liste hat, es kann nur leer sein.

Verwandte Themen