é possível passar o tipo de uma interface com genéricos?
A interface:
public interface AsyncCallback<T>
No meu método de teste:
Mockito.any(AsyncCallback.class)
Colocar para <ResponseX>
trás ou por .class
não funcionou.
Existe uma maneira segura de digitar: use ArgumentMatchers.any()
e qualifique-a com o tipo:
ArgumentMatchers.<AsyncCallback<ResponseX>>any()
(Matchers.<AsyncCallback<ResponseX>>any()
Matchers
está realmente obsoleto, masArgumentMatchers
funcionou.Usando o Java 8, você pode simplesmente usar
any()
(assumindo importação estática) sem argumento ou parâmetro de tipo devido à inferência de tipo aprimorada. O compilador agora sabe do tipo de destino (o tipo do argumento do método) que você realmente quer dizerMatchers.<AsyncCallback<ResponseX>>any()
, que é a solução pré-Java 8.fonte
any()
combinariaAsyncCallback<AnyOtherType>
?AsyncCallback<AnyOtherType>
nem deve ser compilado se o tipo de argumento for 'AsyncCallback <ResponseX>'.when(x.y(any())).thenAnswer(...)
por exemplo, ondey
estápublic <T> T y(AsyncCallback<T> arg)
. Talvez seja melhor verificar o tipo na resposta, se é isso que é necessário?isA()
. Se o objeto contiver umClass
objeto correspondente ao tipo e a interface expuser isso, acho que você poderá verificá-lo em um correspondente personalizado. Ou, por exemplo, no caso de um,Collection
você pode verificar o tipo dos elementos.Matchers
foi substituído porArgumentMatchers
no Mockito v2Eu tive que adotar o seguinte mecanismo para permitir genéricos:
Espero que isso ajude alguém.
fonte
A postagem do comentário pierrefevrier como resposta, que pode ser útil se estiver presente em uma resposta em vez de comentários.
Com novas versões do Mockito:
(Matchers.<AsyncCallback<ResponseX>>any()
fonte
Além da resposta da thSoft, colocar a chamada qualificada para any () no método significava que eu poderia remover a qualificação, pois o tipo de retorno permitia a inferência:
fonte
Você pode simplesmente transmiti-lo, adicionando avisos de supressão, se desejar:
Se o Java permitisse genéricos 'genéricos', eles poderiam ter um método como este, que é o que você está procurando
fonte
You cannot use argument matchers outside of verification or stubbing.
@SuppressWarnings
: pré-java 8, se você fosse atribuí-lo a uma variável separada, você poderia usarany()
como na resposta do INtoy. Agora, com o java 8,any()
pode ser usado em linha sem a necessidade de uma atribuição separada.Eu tive um problema semelhante usando o Spring
Example
:Aqui, você deve usar a qualificação, o método findAll b / c pode levar vários tipos, como
Sort
eIterable
. Você também pode usar, éMockito.any(Example.class)
claro, com o aviso de segurança de tipo.fonte