Eu tenho uma ferramenta de linha de comando que executa uma verificação de DNS. Se a verificação do DNS for bem-sucedida, o comando continuará com outras tarefas. Estou tentando escrever testes de unidade para isso usando o Mockito. Aqui está o meu código:
public class Command() {
// ....
void runCommand() {
// ..
dnsCheck(hostname, new InetAddressFactory());
// ..
// do other stuff after dnsCheck
}
void dnsCheck(String hostname, InetAddressFactory factory) {
// calls to verify hostname
}
}
Estou usando o InetAddressFactory para simular uma implementação estática da InetAddress
classe. Aqui está o código da fábrica:
public class InetAddressFactory {
public InetAddress getByName(String host) throws UnknownHostException {
return InetAddress.getByName(host);
}
}
Aqui está o meu caso de teste de unidade:
@RunWith(MockitoJUnitRunner.class)
public class CmdTest {
// many functional tests for dnsCheck
// here's the piece of code that is failing
// in this test I want to test the rest of the code (i.e. after dnsCheck)
@Test
void testPostDnsCheck() {
final Cmd cmd = spy(new Cmd());
// this line does not work, and it throws the exception below:
// tried using (InetAddressFactory) anyObject()
doNothing().when(cmd).dnsCheck(HOST, any(InetAddressFactory.class));
cmd.runCommand();
}
}
Exceção ao executar o testPostDnsCheck()
teste:
org.mockito.exceptions.misusing.InvalidUseOfMatchersException:
Invalid use of argument matchers!
2 matchers expected, 1 recorded.
This exception may occur if matchers are combined with raw values:
//incorrect:
someMethod(anyObject(), "raw String");
When using matchers, all arguments have to be provided by matchers.
For example:
//correct:
someMethod(anyObject(), eq("String by matcher"));
Alguma contribuição sobre como resolver isso?
java
unit-testing
mockito
devang
fonte
fonte
Eu tinha o mesmo problema há muito tempo, muitas vezes precisava misturar Matchers e valores e nunca consegui fazer isso com o Mockito .... até recentemente! Coloquei a solução aqui esperando que ajude alguém, mesmo que este post seja bastante antigo.
Claramente, não é possível usar os Matchers AND valores juntos no Mockito, mas e se houvesse um Matcher aceitando comparar uma variável? Isso resolveria o problema ... e de fato existe: eq
Neste exemplo 'metas' é uma lista existente de valores
fonte
org.mockito.Mockito.eq()
Pode ajudar alguém no futuro: Mockito não suporta zombar de métodos 'finais' (agora). Isso me deu o mesmo
InvalidUseOfMatchersException
.A solução para mim foi colocar a parte do método que não precisava ser 'final' em um método separado, acessível e substituível.
Revise a API do Mockito para o seu caso de uso.
fonte
Apesar de usar todos os matchers, estava recebendo o mesmo problema:
Demorei um pouco para descobrir que o método que eu estava tentando zombar era um método estático de uma classe (por exemplo, Xyz.class) que contém apenas o método estático e eu esqueci de escrever a seguinte linha:
Pode ser que isso ajude outras pessoas, pois também pode ser a causa do problema.
fonte
No meu caso, a exceção foi levantada porque tentei zombar de um
package-access
método. Quando mudei o nível de acesso do método depackage
paraprotected
a exceção foi embora. Por exemplo, dentro da classe Java,o método
String getName(String id)
deve estar noprotected
nível MÍNIMO para que o mecanismo de zombaria (subclasse) possa funcionar.fonte