Existe uma maneira de corresponder a qualquer argumento de classe da rotina de exemplo abaixo?
class A {
public B method(Class<? extends A> a) {}
}
Como posso sempre retornar um, new B()
independentemente de qual classe é passada method
? A tentativa a seguir funciona apenas para o caso específico em que A
é correspondido.
A a = new A();
B b = new B();
when(a.method(eq(A.class))).thenReturn(b);
EDIT : Uma solução é
(Class<?>) any(Class.class)
Class<?>
surpreendente!Respostas:
Mais duas maneiras de fazer isso (veja meu comentário na resposta anterior de @Tomasz Nurkiewicz):
O primeiro baseia-se no fato de que o compilador simplesmente não permite que você passe algo do tipo errado:
Você perde a digitação exata (o
Class<? extends A>
), mas provavelmente funciona como você precisa.O segundo é muito mais envolvido, mas é sem dúvida uma solução melhor se você realmente quiser ter certeza de que o argumento para
method()
é umaA
ou uma subclasse deA
:Onde
ClassOrSubclassMatcher
éorg.hamcrest.BaseMatcher
definido como:Ufa! Eu usaria a primeira opção até que você realmente precise obter um controle mais preciso sobre o que
method()
realmente retorna :-)fonte
if (obj instanceof Class)
bagunça as coisas para mim, então eu a removi.extends BaseMatcher<Class<T>>
para apenasextends BaseMatcher<T>
. Apenas para sua informação, se alguém mais receber erros de compilação, tente isso.matches
função para o seguinte:public boolean matches(Object obj) { if (obj != null) { return targetClass.isAssignableFrom(obj.getClass()); } return false; }
Há outra maneira de fazer isso sem elenco:
Esta solução força o método
any()
a retornar oClass<A>
tipo e não seu valor padrão (Object
).fonte
Matchers
foi descontinuado nas versões mais recentes do Mockito e provavelmente será removido na versão 3.0. EmArgumentMatchers
vez disso, use :when(a.method(ArgumentMatchers.<Class<A>>any())).thenReturn(b);
Se você não tem idéia de qual pacote precisa importar:
OU
fonte
org.mockito.ArgumentMatchers.any
E se:
ou:
fonte
method(A a)
- mas é (efetivamente)method(Class<A> a)
- assim você precisa usar:when(a.method(isA(Class.class))).thenReturn(b);
ouwhen(a.method((Class<A>) notNull())).thenReturn(b);
a solução da millhouse não está mais funcionando com a versão recente do mockito
Esta solução funciona com java 8 e mockito 2.2.9
onde
ArgumentMatcher
é uma instância deorg.mockito.ArgumentMatcher
E o uso
fonte
public static <T> Class<T> subClassOf(Class<T> targetClass) { return argThat(new ClassOrSubclassMatcher<>(targetClass)); }