Es fácil verificar que se produjo una interacción específica (llamada de método específico) en un objeto simulado en Mockito, y existe verifyZeroInteractions()
para comprobar que no se produjeron interacciones en absoluto. Supongamos que estoy probando una interfaz como la de un registrador, con métodos como info()
, warn()
, error()
etc. En un escenario específico, sé que se debe llamar a uno de estos métodos, pero realmente no me importa cuál. ¿Existe alguna forma compacta de comprobar que se haya producido alguna interacción con el objeto simulado sin la necesidad de especificar qué método exactamente se debe invocar? ¿O quizás tal mecanismo no es necesario porque "la manera Mockito" de probar esto sería diferente de lo que imagino?¿Es posible verificar la interacción arbitraria usando Mockito de forma compacta?
Respuesta
Si puede externalizar la creación de su objeto logger de la clase bajo prueba, no hay ninguna razón por la cual no pueda escribir su propia implementación de prueba de la Interfaz de registro que registrará qué métodos se ejercitaron y lo inyectará como parte de su configuración de prueba.
Las bibliotecas de simulacros hacen mucho bien, pero a veces hay casos de esquina como los que ha encontrado donde pueden no cubrir sus necesidades.
Si usted escribe su propia aplicación para el ensayo de este tipo, y lo inyecta en yourt clase de prueba en prueba, entonces puede valer en getCount() > 0
public class LoggerTestSupportImpl implements ILogger {
private int count = 0;
@Override
public int getCount() {
return count;
}
@Override
public void info(String message) {
count++;
}
@Override
public void warn(String message) {
count++;
}
}
Con log4j, para poner a prueba el registrador hago la siguiente configuración:
@Mock private Appender log4jAppender;
private Logger logger;
@Before
public void setup() {
MockitoAnnotations.initMocks(this);
Logger root = Logger.getRootLogger();
if (!root.getAllAppenders().hasMoreElements()) {
// No appenders means log4j is not initialized!
BasicConfigurator.configure();
}
logger = Logger.getLogger(MyClassWhichLogs.class);
logger.addAppender(log4jAppender);
}
y luego en mi prueba hago lo siguiente:
verifyZeroInteractions(log4jAppender);
o
verify(log4jAppender).doAppend(any(LoggingEvent.class);
Si necesita probar los valores registrados, puede proporcionar un captor en su lugar:
ArgumentCaptor<LoggingEvent> logCaptor = ArgumentCaptor.forClass(LoggingEvent.class);
verify(log4jAppender).doAppend(logCaptor.capture());
assertTrue(logCaptor.getValue().contains("my text to match");
Si bien esto no necesariamente responde a la pregunta generalizada (no creo que exista lo que está buscando), puede solucionar este problema específico para probar el registro.
- 1. Mockito. Verificar los argumentos del método
- 2. ¿Forma compacta de crear Guava Multimaps?
- 3. ¿La forma más compacta de comparar tres objetos para la igualdad usando Java?
- 4. PowerMock, mockito, verificar el método estático
- 5. La forma más fácil de comprobar si una Cadena arbitraria es un nombre de archivo válido
- 6. Mockito: cómo verificar que nunca se invocó un simulacro
- 7. ¿Es posible verificar si una notificación es visible o cancelada?
- 8. Rieles: ¿es posible verificar si una cadena es binaria?
- 9. ¿Es el caso correcto para Mockito spy?
- 10. Rectángulos de embalaje para la representación compacta
- 11. Emacs Lisp: ¿coincide con un patrón repetido de forma compacta?
- 12. ¿Es posible verificar los valores en la compilación?
- 13. ¿Es posible verificar la sintaxis del archivo PHP desde PHP?
- 14. Cómo pasar argumentos de constructor usando Mockito
- 15. representación binaria compacta de json
- 16. ¿Mockito es preferible a EasyMock?
- 17. Usando Mockito para probar clases abstractas
- 18. ¿Es posible cortar partes de la forma Geometry en three.js?
- 19. ¿La forma más elegante de verificar el valor de un parámetro de cadena de consulta si no es nulo?
- 20. ¿Es posible verificar el tiempo de espera en jQuery.post()?
- 21. ¿Es posible trazar ecuaciones implícitas usando Matplotlib?
- 22. ¿Es posible verificar si los servicios de localización están activos?
- 23. Representación compacta de URL de GUID/UUID?
- 24. Variables de miembro burlón de una clase usando Mockito
- 25. ¿es posible verificar si el pdf está protegido con contraseña usando ghostscript?
- 26. ¿Es posible detectar la conexión LTE usando iOS SDK?
- 27. ¿Es posible consultar contra argumentos pasados a un objeto simulado de Mockito?
- 28. Cuál es la forma correcta de verificar la red móvil disponible (sin conexión de datos)
- 29. ¿Cuál es la forma más confiable de verificar si una variable de JavaScript es nula?
- 30. La secuencia de comandos PHP deja de ejecutarse de forma arbitraria sin errores
Esto es exactamente lo que he estado probando mi clase hasta el momento, Me preguntaba si Mockito podría evitarme escribir las implementaciones triviales para todos los métodos. –
Diría que has estado haciendo lo sensato Michal. Mockito no es compatible con este tipo de prueba. Su única opción es ir por la ruta 'ArgumentCaptor' como lo menciona Kevin, pero esto genera mucho" ruido "en las clases de prueba. – Brad
De acuerdo, es un poco ruidoso, pero la mayoría del ruido se localiza en declaraciones y en el método Antes, e incluso se puede agregar el Captor a declaraciones de nivel de clase si se va a usar en varios métodos de prueba (ni siquiera es necesario si no se accede a mensajes) . Lo bueno de usar Mockito es que ya tienes acceso a la API de registro completo. Para hacerlo, en su ejemplo debe expandir las capacidades de su simulacro enrollado a mano (capturar/recuperar un número arbitrario de mensajes registrados, etc.). Pero para las necesidades simples su camino parece más simple, más limpio, * y * reutilizable, por lo que son algunas ventajas para su enfoque. –