Mockito: Überprüfung mit generischen Parametern

Lesezeit: 3 Minuten

Mit Mockito kann ich Folgendes tun:

verify(someService).process(any(Person.class));

Aber wie schreibe ich das, wenn process nimmt ein Collection<Person> stattdessen? Verstehe nicht wie man es richtig schreibt. Bekomme nur Syntaxfehler…

Versuchen:

verify(someService).process(Matchers.<Collection<Person>>any());

Tatsächlich hat IntelliJ diesen Fix automatisch vorgeschlagen, als ich tippte any()… Leider können Sie in diesem Fall keinen statischen Import verwenden.

  • Danke, es funktioniert … aber Gott, es sieht schrecklich aus, es muss einen schöneren Weg geben, das zu korrigieren …

    – Cristiano Fontes

    10. Januar 2013 um 19:01 Uhr


  • Daumen hoch für die einzige Lösung, die die Frage wie angegeben beantwortet, anstatt auf den Sonderfall übereinstimmender Container abzuzielen.

    – Adam Parkin

    15. November 2013 um 4:07 Uhr

  • Diese Antwort ist nun falsch. Die folgende Antwort bietet eine bessere Lösung.

    – Taucher

    26. Oktober 2015 um 18:58 Uhr

  • Ich kann mich irren, aber ich glaube nicht, dass dies die richtige Antwort ist. Obwohl die Warnung entfernt wird, wechselt die Überprüfung von „any(Collection.class)“ zu any(), wodurch nichts überprüft wird. Zumindest bevor es einen Klassencheck gab. Ist es nicht?

    – Gabriel Falcone

    16. März 2017 um 23:06 Uhr

  • Matchers ist veraltet, sollte jetzt verwendet werden ArgumentMatchers.

    – Strahl

    12. August 2019 um 16:54 Uhr

Versuchen :

verify(someService).process(anyCollectionOf(Person.class));

Seit Version 1.8 Mockito stellt sich vor

public static <T> Collection<T> anyCollectionOf(Class<T> clazz);

  • Für andere, die dazu kommen und es brauchen, gibt es zusätzlich zu anyCollectionOf() auch eine anyListOf(), siehe: stackoverflow.com/a/10512526/908677

    – Elijah Lofgren

    16. August 2016 um 18:47 Uhr


  • anyCollectionOf(Class clazz) wird in Mockito 3.0 und Java8 entfernt. Es wird eine neue Methode geben: anyOptional(Class class) siehe: github.com/mockito/mockito/issues/308

    – Naxos84

    9. Januar 2018 um 11:15 Uhr


Wenn Sie eine eigene Methode verwenden, können Sie sogar den statischen Import verwenden:

private Collection<Person> anyPersonCollection() {
    return any();
}

Dann können Sie verwenden

verify(someService).process(anyPersonCollection());

Als Alternative zur akzeptierten Antwort können Sie Folgendes versuchen:

verify(someService).process(Mockito.<SomeGenericClass<Person>>any());

Wo ich verwendet habe org.mockito.Mockito Anstatt von Matchers.

Benutzer-Avatar
Waldheinz

Sie können dies wegen Typlöschung nicht ausdrücken. Selbst wenn Sie es in Code ausdrücken könnten, hatte Mockito keine Chance, es zur Laufzeit zu überprüfen. Sie könnten eine Schnittstelle wie erstellen

interface PersonCollection extends Collection<Person> { /* nothing */ }

stattdessen und verwenden Sie dies im gesamten Code.

Bearbeiten: Ich habe mich geirrt, Mockito hat jedeSammlungVon(..) was du willst.

  • Eigentlich ist es könnte mit einem “Type Literal”-Objekt ausgedrückt werden, wenn die API dies akzeptiert hat: any(new TypeLiteral<Collection<Person>>() {}). Natürlich nicht schön, aber es funktioniert, da alle Typinformationen zur Laufzeit verfügbar sind (über Reflection oder eine Bytecode-Bibliothek).

    – Rogerio

    30. Mai 2011 um 11:49 Uhr

  • @Rogerio: Du hast Recht, und es scheint, dass Mockito dies jetzt tatsächlich unterstützt. Habe es lange nicht benutzt…

    – Waldheinz

    30. Mai 2011 um 11:56 Uhr

  • Eigentlich ist es könnte mit einem “Type Literal”-Objekt ausgedrückt werden, wenn die API dies akzeptiert hat: any(new TypeLiteral<Collection<Person>>() {}). Natürlich nicht schön, aber es funktioniert, da alle Typinformationen zur Laufzeit verfügbar sind (über Reflection oder eine Bytecode-Bibliothek).

    – Rogerio

    30. Mai 2011 um 11:49 Uhr

  • @Rogerio: Du hast Recht, und es scheint, dass Mockito dies jetzt tatsächlich unterstützt. Habe es lange nicht benutzt…

    – Waldheinz

    30. Mai 2011 um 11:56 Uhr

1145900cookie-checkMockito: Überprüfung mit generischen Parametern

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy