Réponses:
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, mais ArgumentMatchers
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éellement Matchers.<AsyncCallback<ResponseX>>any()
, qui est la solution pré-Java 8.
any()
correspondrait pas AsyncCallback<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
est public <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 un Class
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'un Collection
vous pouvez vérifier le type des éléments.
Matchers
a été remplacé par ArgumentMatchers
dans Mockito v2
J'ai dû adopter le mécanisme suivant pour autoriser les génériques:
import static org.mockito.Matchers.any;
List<String> list = any();
when(callMyMethod.getResult(list)).thenReturn(myResultString);
J'espère que cela aide quelqu'un.
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()
Vous pouvez simplement le lancer, en ajoutant des avertissements de suppression si vous le souhaitez:
@SuppressWarnings("unchecked")
AsyncCallback<ResponseX> callback = Mockito.any(AsyncCallback.class)
Si Java autorisait les génériques `` génériques '', ils pourraient avoir une méthode comme celle-ci, ce que vous recherchez
private static <T, E> T<E> mock(Class<T<E>> clazz)
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'utiliser any()
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
:
Mockito.when(repo.findAll(Mockito.<Example<SrvReqToSupplierComment>>any()))
.thenReturn(Lists.emptyList());
Ici, vous devez utiliser la qualification, la méthode b / c findAll peut prendre plusieurs types, comme Sort
et Iterable
. Vous pouvez également utiliser Mockito.any(Example.class)
bien sûr avec le type d'avertissement de sécurité.