Considere este código:
public class DummyClass {
public List<? extends Number> dummyMethod() {
return new ArrayList<Integer>();
}
}
public class DummyClassTest {
public void testMockitoWithGenerics() {
DummyClass dummyClass = Mockito.mock(DummyClass.class);
List<? extends Number> someList = new ArrayList<Integer>();
Mockito.when(dummyClass.dummyMethod()).thenReturn(someList); //Compiler complains about this
}
}
O compilador reclama da linha para a qual está tentando stub o comportamento dummyMethod()
. Alguma dica sobre como proceder para stubbing métodos que retornam um tipo com curingas limitados?
java
unit-testing
generics
mockito
bounded-wildcard
Shikhar Mishra
fonte
fonte
Respostas:
Você também pode usar o método seguro não-tipo doReturn para essa finalidade,
conforme discutido no grupo do google de Mockito.
Embora isso seja mais simples
thenAnswer
, observe novamente que não é do tipo seguro. Se você está preocupado com a segurança do tipo, a resposta da millhouse está correta.detalhes adicionais
Para ficar claro, aqui está o erro observado do compilador,
Acredito que o compilador tenha atribuído o primeiro tipo de curinga durante a
when
chamada e não poderá confirmar que o segundo tipo de curinga nathenReturn
chamada é o mesmo.Parece
thenAnswer
que esse problema não ocorre porque ele aceita um tipo de curinga ethenReturn
usa um tipo não curinga, que deve ser capturado. Do OngoingStubbing de Mockito ,fonte
Suponho que você queira carregar
someList
alguns valores conhecidos; aqui está uma abordagem que usaAnswer<T>
junto com um método auxiliar de modelo para manter tudo seguro para o tipo:fonte
Eu bati a mesma coisa ontem. As duas respostas de @ nondescript1 e @millhouse me ajudaram a descobrir uma solução alternativa. Eu praticamente usei o mesmo código que o @millhouse, exceto que o tornei um pouco mais genérico, porque meu erro não foi causado por um
java.util.List
, mas pelocom.google.common.base.Optional
. Meu pequeno método auxiliar, portanto, permite qualquer tipoT
e não apenasList<T>
:Com este método auxiliar, você pode escrever:
Isso compila muito bem e faz a mesma coisa que o
thenReturn(...)
método.Alguém sabe se o erro que o compilador Java emite é um bug do compilador ou se o código está realmente incorreto?
fonte
Mockito.when(dummyClass.dummyMethod()).thenAnswer(x -> someList)
, então não há necessidade para o método de utilitárioEstou transformando o comentário do fikovnik em uma resposta aqui para dar mais visibilidade, pois acho que é a solução mais elegante usando o Java 8+.
A documentação do Mockito recomenda o uso
doReturn()
(como sugerido na resposta aceita) apenas como último recurso.Em vez disso, para contornar o erro do compilador descrito na pergunta, a
when()
abordagem Mockito recomendada pode ser usada comthenAnswer()
um lambda (em vez de um método auxiliar):fonte
Embora o método de utilidade proposto por Marek Radonsky funcione, há também uma outra opção que nem exige a expressão lambda (IMHO de aparência estranha) sugerida por fikovnik:
Como essa resposta a uma pergunta semelhante mostra, você também pode usar o seguinte:
fonte