Tengo una herramienta de línea de comandos que realiza una verificación de DNS. Si la comprobación de DNS tiene éxito, el comando continúa con otras tareas. Estoy tratando de escribir pruebas unitarias para esto usando Mockito. Aquí está mi 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
}
}
Estoy usando InetAddressFactory para burlarse de una implementación estática de la InetAddress
clase. Aquí está el código para la fábrica:
public class InetAddressFactory {
public InetAddress getByName(String host) throws UnknownHostException {
return InetAddress.getByName(host);
}
}
Aquí está mi caso de prueba de unidad:
@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();
}
}
Excepción al ejecutar la testPostDnsCheck()
prueba:
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"));
¿Alguna aportación sobre cómo resolver esto?
java
unit-testing
mockito
devang
fuente
fuente
Tuve el mismo problema durante mucho tiempo, a menudo necesitaba mezclar Matchers y valores y nunca pude hacerlo con Mockito ... ¡hasta hace poco! Puse la solución aquí esperando que ayude a alguien, incluso si esta publicación es bastante antigua.
Claramente, no es posible usar Matchers AND valores juntos en Mockito, pero ¿qué pasa si un Matcher acepta comparar una variable? Eso resolvería el problema ... y de hecho hay: eq
En este ejemplo, 'metas' es una lista de valores existente
fuente
org.mockito.Mockito.eq()
Podría ayudar a alguien en el futuro: Mockito no admite la burla de los métodos 'finales' (en este momento). Me dio lo mismo
InvalidUseOfMatchersException
.La solución para mí fue poner la parte del método que no tenía que ser 'final' en un método separado, accesible y reemplazable.
Revise la API de Mockito para su caso de uso.
fuente
A pesar de usar todos los comparadores, recibía el mismo problema:
Me tomó poco tiempo darme cuenta de que el método que intentaba burlarme era un método estático de una clase (digamos Xyz.class) que contiene solo un método estático y olvidé escribir la siguiente línea:
Puede ser que ayude a otros, ya que también puede ser la causa del problema.
fuente
Para mi caso, la excepción surgió porque traté de burlarme de un
package-access
método. Cuando cambié el método, el nivel de accesopackage
aprotected
la excepción desapareció. Por ejemplo, debajo de la clase Java,el método
String getName(String id)
tiene que estar AL MENOSprotected
para que el mecanismo de burla (subclasificación) pueda funcionar.fuente