est-il possible de passer le type d'une interface avec des génériques?
L'interface:
public interface AsyncCallback<T>
Dans ma méthode de test:
Mockito.any(AsyncCallback.class)
Mettre <ResponseX>
derrière ou pour .class
n'a pas fonctionné.
Il existe un moyen de type sécurisé: utilisez-le ArgumentMatchers.any()
et qualifiez-le avec le type:
ArgumentMatchers.<AsyncCallback<ResponseX>>any()
(Matchers.<AsyncCallback<ResponseX>>any()
Matchers
est en fait obsolète, maisArgumentMatchers
a fonctionné.En utilisant Java 8, vous pouvez simplement utiliser
any()
(en supposant l'importation statique) sans argument ou paramètre de type en raison de l'inférence de type améliorée. Le compilateur sait maintenant à partir du type de cible (le type de l'argument de méthode) que vous entendez réellementMatchers.<AsyncCallback<ResponseX>>any()
, qui est la solution pré-Java 8.la source
any()
correspondrait pasAsyncCallback<AnyOtherType>
aussi?AsyncCallback<AnyOtherType>
ne devrait même pas compiler si le type d'argument est 'AsyncCallback <ResponseX>'.when(x.y(any())).thenAnswer(...)
par exemple, oùy
estpublic <T> T y(AsyncCallback<T> arg)
. Peut-être serait-il préférable de vérifier le type de réponse, si c'est ce qui est nécessaire?isA()
. Si l'objet contient unClass
objet correspondant au type et que l'interface l'expose, je suppose que vous pouvez le vérifier dans un matcher personnalisé. Ou par exemple dans le cas d'unCollection
vous pouvez vérifier le type des éléments.Matchers
a été remplacé parArgumentMatchers
dans Mockito v2J'ai dû adopter le mécanisme suivant pour autoriser les génériques:
J'espère que cela aide quelqu'un.
la source
Poster un commentaire de pierrefevrier comme réponse qui pourrait être utile s'il est présent dans une réponse au lieu de commentaires.
Avec les nouvelles versions de Mockito:
(Matchers.<AsyncCallback<ResponseX>>any()
la source
Suite à la réponse de thSoft, mettre l'appel qualifié à any () dans la méthode signifiait que je pouvais supprimer la qualification puisque le type de retour permettait l'inférence:
la source
Vous pouvez simplement le lancer, en ajoutant des avertissements de suppression si vous le souhaitez:
Si Java autorisait les génériques `` génériques '', ils pourraient avoir une méthode comme celle-ci, ce que vous recherchez
la source
You cannot use argument matchers outside of verification or stubbing.
@SuppressWarnings
: pré-java 8, si vous deviez l'assigner à une variable distincte, vous pourriez simplement l'utiliserany()
comme dans la réponse de INtoy. Maintenant, avec java 8,any()
peut être utilisé en ligne sans avoir besoin d'une affectation distincte.J'ai eu un problème similaire en utilisant Spring
Example
:Ici, vous devez utiliser la qualification, la méthode b / c findAll peut prendre plusieurs types, comme
Sort
etIterable
. Vous pouvez également utiliserMockito.any(Example.class)
bien sûr avec le type d'avertissement de sécurité.la source