Mockito: InvalidUseOfMatchersException

Tengo una herramienta de línea de comandos que realiza una comprobación de DNS. Si la verificación DNS tiene éxito, el comando continúa con otras tareas. Estoy intentando 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 simular una implementación estática de la clase InetAddress . 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 (ie 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 prueba testPostDnsCheck() :

 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 entrada sobre cómo resolver esto?

El mensaje de error describe la solución con bastante claridad. La línea

 doNothing().when(cmd).dnsCheck(HOST, any(InetAddressFactory.class)) 

usa un valor en bruto y un emparejador, cuando se requiere usar todos los valores sin procesar o todos los emparejadores. Una versión correcta podría leer

 doNothing().when(cmd).dnsCheck(eq(HOST), any(InetAddressFactory.class)) 

Tuve el mismo problema desde hace mucho tiempo, a menudo necesitaba mezclar Matchers y valores y nunca logré hacer eso 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 values ​​en Mockito, pero ¿qué ocurre si hay un Matcher que acepta comparar una variable? Eso resolvería el problema … y de hecho hay: eq

 when(recommendedAccessor.searchRecommendedHolidaysProduct(eq(metas), any(List.class), any(HotelsBoardBasisType.class), any(Config.class))) .thenReturn(recommendedResults); 

En este ejemplo, ‘metas’ es una lista existente de valores

Podría ayudar a alguien en el futuro: Mockito no admite la burla de los métodos “finales” (en este momento). Me dio la misma 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.

A pesar de usar todos los mezcladores, estaba teniendo el mismo problema:

 "org.mockito.exceptions.misusing.InvalidUseOfMatchersException: Invalid use of argument matchers! 1 matchers expected, 3 recorded:" 

Me tomó un poco de tiempo darme cuenta de que el método que estaba tratando de burlar era un método estático de una clase (digamos Xyz.class) que contiene solo método estático y olvidé escribir la siguiente línea:

 PowerMockito.mockStatic(Xyz.class); 

Puede ser que ayudará a otros ya que también puede ser la causa del problema.