Mockito.any () passa Interface com Genéricos

170

é 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 .classnão funcionou.

lrxw
fonte

Respostas:

306

Existe uma maneira segura de digitar: use ArgumentMatchers.any()e qualifique-a com o tipo:

ArgumentMatchers.<AsyncCallback<ResponseX>>any()
thSoft
fonte
4
Confirmo que esta resposta funciona e suprime corretamente o aviso.
Kevinarpe
1
Isso não é realmente mais seguro, pois o método real só pode ser chamado com o argumento digitado corretamente. Era apenas necessário satisfazer o compilador pré-java8 que não possuía esse tipo de inferência de tipo.
herman
Eu usei algo como este ResponseEntity <Lista <Mapa <String, Objeto >>> responseEntity = Matchers. <ResponseEntity <Lista <Mapa <String <Objeto >>>> any (); E sempre retorna null
Arun
6
Com novas versões do Mockito:(Matchers.<AsyncCallback<ResponseX>>any()
pierrefevrier
15
Matchersestá realmente obsoleto, mas ArgumentMatchersfuncionou.
guijob
67

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 dizer Matchers.<AsyncCallback<ResponseX>>any(), que é a solução pré-Java 8.

herman
fonte
Também não any()combinaria AsyncCallback<AnyOtherType>?
Matthew Leia
@MatthewRead O uso AsyncCallback<AnyOtherType>nem deve ser compilado se o tipo de argumento for 'AsyncCallback <ResponseX>'.
herman
1
Estou pensando em uma situação em que o tipo de argumento também é genérico, mas você só deseja zombar para um tipo concreto (ou zombar para vários tipos de maneiras diferentes). Dado, when(x.y(any())).thenAnswer(...)por exemplo, onde yestá public <T> T y(AsyncCallback<T> arg). Talvez seja melhor verificar o tipo na resposta, se é isso que é necessário?
Matthew Leia
2
@MatthewRead Devido à exclusão, o tipo real não pode ser verificado em tempo de execução pelo Mockito. Então você nem pode usar isA(). Se o objeto contiver um Classobjeto 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, Collectionvocê pode verificar o tipo dos elementos.
herman
1
Matchersfoi substituído por ArgumentMatchersno Mockito v2
bheussler,
15

Eu tive que adotar o seguinte mecanismo para permitir genéricos:

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

Espero que isso ajude alguém.

theINtoy
fonte
3
Veja a minha resposta: isso não é mais necessário com o Java 8.
herman
5

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()

ceder
fonte
1
i acrescentou o seu comentário à resposta original
Joergi
2

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:

private HashMap<String, String> anyStringStringHashMap() {
    return Matchers.any();
}
JWGS
fonte
0

Você pode simplesmente transmiti-lo, adicionando avisos de supressão, se desejar:

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

Se o Java permitisse genéricos 'genéricos', eles poderiam ter um método como este, que é o que você está procurando

private static <T, E> T<E> mock(Class<T<E>> clazz)
Garrett Hall
fonte
Quando eu tentei isso, eu recebi um erro no meu teste:You cannot use argument matchers outside of verification or stubbing.
kevinarpe
Não é uma boa ideia usar @SuppressWarnings: pré-java 8, se você fosse atribuí-lo a uma variável separada, você poderia usar any()como na resposta do INtoy. Agora, com o java 8, any()pode ser usado em linha sem a necessidade de uma atribuição separada.
herman
@kevinarpe, se você tiver vários correspondentes de argumento, eles deverão ser chamados em ordem, conforme especificado na linguagem Java.
TWIStErRob 16/03
0

Eu tive um problema semelhante usando o Spring Example:

Mockito.when(repo.findAll(Mockito.<Example<SrvReqToSupplierComment>>any()))
            .thenReturn(Lists.emptyList());

Aqui, você deve usar a qualificação, o método findAll b / c pode levar vários tipos, como Sorte Iterable. Você também pode usar, é Mockito.any(Example.class)claro, com o aviso de segurança de tipo.

Gagarwa
fonte