Existe uma maneira de capturar uma lista de tipos específicos usando mockitos ArgumentCaptore. Isso não funciona:
ArgumentCaptor<ArrayList<SomeType>> argument = ArgumentCaptor.forClass(ArrayList.class);
java
unit-testing
junit
mockito
Andreas Köberle
fonte
fonte
ArrayList
). Você sempre pode usarList
interface, e se você quer representar o fato, de que é co-variante, então você pode usarextends
:ArgumentCaptor<? extends List<SomeType>>
Respostas:
O problema genérico aninhado pode ser evitado com a anotação @Captor :
fonte
MockitoAnnotations.initMocks(this)
o@Before
método do que usar um corredor que exclua a capacidade de usar outro corredor. No entanto, +1, obrigado por apontar a anotação.Sim, esse é um problema genérico geral, não específico de mockito.
Não existe um objeto de classe
ArrayList<SomeType>
e, portanto, você não pode digitar com segurança esse objeto para um método que exija aClass<ArrayList<SomeType>>
.Você pode converter o objeto no tipo certo:
Isso fornecerá alguns avisos sobre lançamentos inseguros e, é claro, seu ArgumentCaptor não pode realmente diferenciar entre
ArrayList<SomeType>
eArrayList<AnotherType>
sem talvez inspecionar os elementos.(Conforme mencionado na outra resposta, embora esse seja um problema genérico geral, existe uma solução específica do Mockito para o problema de segurança de tipo na
@Captor
anotação. Ainda não é possível distinguir entre umArrayList<SomeType>
e umArrayList<OtherType>
.)Editar:
Veja também o comentário de tenshi . Você pode alterar o código original de Paŭlo Ebermann para este (muito mais simples)
fonte
ArgumentCaptor<List<SimeType>> argument = ArgumentCaptor.forClass((Class) List.class);
@SuppressWarnings("unchecked")
anotação acima da linha de definição do captador de argumento. Além disso, transmitir paraClass
é redundante.Class
não é redundante nos meus testes.Se você não tem medo da semântica antiga do estilo java (não genérico seguro), isso também funciona e é razoavelmente simples.
fonte
fonte
Com base nos comentários de @ tenshi e @ pkalinow (também parabéns a @rogerdpack), a seguir é uma solução simples para criar um captador de argumentos de lista que também desativa o aviso "usa operações não verificadas ou não seguras" :
Exemplo completo aqui e construção e teste de ICs correspondentes correspondentes executados aqui .
Nossa equipe vem usando isso há algum tempo em nossos testes de unidade e essa parece a solução mais direta para nós.
fonte
Para uma versão anterior do junit, você pode fazer
fonte
Eu tive o mesmo problema com a atividade de teste no meu aplicativo Android. Eu usei
ActivityInstrumentationTestCase2
eMockitoAnnotations.initMocks(this);
não funcionei. Eu resolvi esse problema com outra classe com o campo respectivamente. Por exemplo:Em seguida, no método de teste de atividade:
fonte
Há um problema em aberto no GitHub do Mockito sobre esse problema exato.
Eu encontrei uma solução simples que não o força a usar anotações em seus testes:
O que acontece aqui é que criamos uma nova classe com a
@Captor
anotação e injetamos o captador nela. Depois, extraímos o captador e o devolvemos do nosso método estático.No seu teste, você pode usá-lo da seguinte maneira:
Ou com uma sintaxe semelhante à de Jackson
TypeReference
:Funciona porque o Mockito não precisa de nenhuma informação de tipo (ao contrário dos serializadores, por exemplo).
fonte