Mockito.any () pass Interface met Generics

is het mogelijk om het type interface door te geven met generieke geneesmiddelen?

De interface:

public interface AsyncCallback

In mijn testmethode:

Mockito.any(AsyncCallback.class)

Putting behind or for .class didnt work.

106

6 antwoord

Er is een soort veilige manier: gebruik ArgumentMatchers.any() en kwalificeer het met het type:

ArgumentMatchers.>any()

zoals pierrefevrier vermeld in de reacties, met de nieuwe versies van Mockito is het

Matchers.>any()
205
toegevoegd
Dit is niet echt veiliger omdat de werkelijke methode sowieso alleen met het correct getypte argument kan worden aangeroepen. Het was alleen nodig om te voldoen aan de pre-java8-compiler die dit soort gevolgtrekking ontbeerde.
toegevoegd de auteur herman, de bron
Ik gebruikte zoiets als ResponseEntity >> responseEntity = Matchers. >>> any (); En het keert altijd nul terug
toegevoegd de auteur Arun, de bron
Ik bevestig dat dit antwoord werkt en onderdrukt de waarschuwing correct.
toegevoegd de auteur kevinarpe, de bron
Matchers is eigenlijk verouderd, maar ArgumentMatchers werkte.
toegevoegd de auteur guijob, de bron
De eerste die ArgumentMatchers gebruikte, werkte voor mij en de tweede die Matchers gebruikt is verouderd. Ik had wat verwarring over wat ResponseX is. kreeg echter het antwoord zelf, in mijn geval schreef ik als volgt: ArgumentMatchers. > any ()
toegevoegd de auteur Barani r, de bron
Met nieuwe versies van Mockito: (Matchers. > any()
toegevoegd de auteur pierrefevrier, de bron

Using Java 8, you can simply use any() (assuming static import) without argument or type parameter because of enhanced type inference. The compiler now knows from the target type (the type of the method argument) that you actually mean Matchers.>any(), which is the pre-Java 8 solution.

47
toegevoegd
@MatthewRead Het gebruik van AsyncCallback zou niet eens moeten compileren als het argumenttype 'AsyncCallback ' is.
toegevoegd de auteur herman, de bron
@MatthewRead Vanwege het wissen kan het werkelijke type tijdens runtime niet worden gecontroleerd door Mockito. U kunt dus niet eens isA() gebruiken. Als het object een Class -object bevat dat overeenkomt met het type en de interface dit blootlegt, denk ik dat u dit in een aangepaste matcher kunt controleren. Of bijvoorbeeld in het geval van een Verzameling zou u het type elementen kunnen controleren.
toegevoegd de auteur herman, de bron
Matchers is vervangen door ArgumentMatchers in Mockito v2
toegevoegd de auteur bheussler, de bron
Zou any() ook niet overeenkomen met AsyncCallback ?
toegevoegd de auteur Matthew Read, de bron
Ik vraag me af over een situatie waarin het argumenttype ook generiek is, maar je wilt het alleen maar bespotten voor één concreet type (of het voor verschillende typen op verschillende manieren bespotten). Gegeven wanneer (xy (any ())). ThenAnswer (...) bijvoorbeeld, waar y is public T y (AsyncCallback arg) . Misschien is het beter om het type in het antwoord te controleren, als dat is wat nodig is?
toegevoegd de auteur Matthew Read, de bron
Ah, je hebt helemaal gelijk. Ik was eigenlijk gewoon meer aan het lezen over het wissen van het type en om de een of andere reden heb ik het hier niet mee verbonden. Bedankt voor het uitleggen!
toegevoegd de auteur Matthew Read, de bron

Ik moest het volgende mechanisme aannemen om generieken toe te staan:

import static org.mockito.Matchers.any;
List list = any();
when(callMyMethod.getResult(list)).thenReturn(myResultString);

Ik hoop dat dit iemand helpt.

11
toegevoegd
Zie mijn antwoord: dit is niet langer nodig met Java 8.
toegevoegd de auteur herman, de bron

Een pierrefevrier-reactie plaatsen als antwoord, wat handig kan zijn als het in een antwoord voorkomt in plaats van opmerkingen.

With new versions of Mockito: (Matchers.>any()

3
toegevoegd
ik heb zijn opmerking toegevoegd aan het oorspronkelijke antwoord
toegevoegd de auteur Joerg, de bron

Je kunt het gewoon casten, en onderdrukwaarschuwingen toevoegen als je wilt:

@SuppressWarnings("unchecked")    
AsyncCallback callback = Mockito.any(AsyncCallback.class)

Als Java 'generieke' generieke geneesmiddelen zou toestaan, zouden ze een methode zoals deze kunnen hebben waarnaar u op zoek bent

private static  T mock(Class> clazz)
1
toegevoegd
Het is geen goed idee om @SuppressWarnings te gebruiken: pre-java 8, als je het zou toewijzen aan een aparte variabele, zou je gewoon any() kunnen gebruiken zoals in theINtoy's antwoord. Nu met java 8 kan any() inline worden gebruikt zonder de noodzaak van een afzonderlijke toewijzing.
toegevoegd de auteur herman, de bron
Toen ik dit probeerde, ontving ik een fout in mijn test: U kunt geen argument-matchers gebruiken buiten verificatie of stubbing.
toegevoegd de auteur kevinarpe, de bron
@kevinarpe als u meerdere matchers voor argumenten hebt, moeten deze in de juiste volgorde worden aangeroepen zoals de Java-taal aangeeft.
toegevoegd de auteur TWiStErRob, de bron

Naar aanleiding van het antwoord van thSoft kon het plaatsen van de gekwalificeerde call voor elke() in methode ervoor zorgen dat ik de kwalificatie kon verwijderen, aangezien het retourneringstype inferentie toestaat:

private HashMap anyStringStringHashMap() {
    return Matchers.any();
}
0
toegevoegd