Existe um método limpo de zombar de uma classe com parâmetros genéricos? Digamos que eu tenha que zombar de uma classe Foo<T>
que preciso passar para um método que espera a Foo<Bar>
. Eu posso fazer o seguinte com bastante facilidade:
Foo mockFoo = mock(Foo.class);
when(mockFoo.getValue).thenReturn(new Bar());
Assumindo getValue()
retorna o tipo genérico T
. Mas isso vai ter gatinhos quando mais tarde passar para um método esperado Foo<Bar>
. O elenco é o único meio de fazer isso?
Uma outra maneira de contornar isso é usar a
@Mock
anotação. Não funciona em todos os casos, mas parece muito mais sexy :)Aqui está um exemplo:
O
MockitoJUnitRunner
inicializa os campos anotados com@Mock
.fonte
SuppressWarnings
. Os avisos existem por uma razão, é melhor não ter o hábito de suprimi-los. Obrigado!@Mock
vez demock()
: os campos ainda são nulos durante o tempo de construção; portanto, não posso inserir dependências naquele momento e não pode tornar os campos finais. O primeiro pode ser resolvido por um@Before
método não anotado, é claro.Você sempre pode criar uma classe / interface intermediária que satisfaça o tipo genérico que deseja especificar. Por exemplo, se Foo fosse uma interface, você poderia criar a seguinte interface na sua classe de teste.
Nas situações em que Foo é uma classe não final , você pode estender a classe com o seguinte código e fazer o mesmo:
Em seguida, você pode consumir um dos exemplos acima com o seguinte código:
fonte
Foo
seja uma interface ou classe não final, essa parece ser uma solução razoavelmente elegante. Obrigado.Crie um método utilitário de teste . Especialmente útil se você precisar mais de uma vez.
fonte
static <T> T genericMock(Class<? super T> classToMock) { return (T)mock(classToMock); }
nem precisa de uma única supressão :) Mas tenha cuidado,Integer num = genericMock(Number.class)
compila, mas jogaClassCastException
. Isso é útil apenas para oG<P> mock = mock(G.class)
caso mais comum .Concordo que não se deve suprimir avisos em classes ou métodos, pois é possível ignorar outros avisos suprimidos acidentalmente. Mas IMHO é absolutamente razoável suprimir um aviso que afeta apenas uma única linha de código.
fonte
Aqui está um caso interessante: o método recebe coleção genérica e retorna coleção genérica do mesmo tipo base. Por exemplo:
Este método pode ser ridicularizado com a combinação do Mockito anyCollectionOf matcher e a resposta.
fonte