2014-06-18 9 views
17

Ho un test unitario che sta fallendo e non sono sicuro del perché. Voglio essere in grado di vedere tutte le chiamate sul mock che si verificano nel sistema in prova. Questo non è il comportamento che voglio sempre per tutti i test, semplicemente per un test che ho bisogno di modificare rapidamente per essere in grado di capire cosa c'è che non va.Come utilizzare Mockito per mostrare tutte le invocazioni su un simulato

Tuttavia, sembra un po 'come un hack. È possibile farlo in modo nativo in Mockito, senza dover utilizzare Thread.currentThread().getStackTrace()?

Questo non è preferibile, poiché la traccia dello stack include tutte le altre chiamate utilizzate internamente da Mockito.

risposta

28

Questa funzione è builtin dal Mockito 1.9.5. Basta usare

mock(ClassToMock.class, withSettings().verboseLogging()) 
+0

Wow. A quanto pare ho avuto un attacco di cecità momentanea durante la lettura del Javadoc. Grazie :) – durron597

0

Sono stato in grado di determinare un metodo che fa utilizza Thread.currentThread().getStackTrace() e consente di scorrere tra gli elementi. È brutto, ma fa il lavoro. Spero che un altro rispondente abbia un metodo migliore.

  1. Creare un InvocationListener e passarlo il nome della classe del sistema in prova.
  2. Passa l'ascoltatore in Mockito.withSettings().invocationListeners()
  3. Modifica temporaneamente il test per creare il Mock con questo oggetto MockSettings.

Codice della InvocationListener:

public static class DebugInvocationListener implements 
     InvocationListener { 
    private final String className; 

    public DebugInvocationListener(Class<?> klass) { 
     this(klass.getName()); 
    } 

    public DebugInvocationListener(String className) { 
     this.className = className; 
    } 

    @Override 
    public void reportInvocation(MethodInvocationReport report) { 
     System.out.println(report.getInvocation()); 
     StackTraceElement[] trace = Thread.currentThread().getStackTrace(); 
     for(StackTraceElement element : trace) { 
      if(element.getClassName().equals(className)) { 
       System.out.println(element); 
       System.out.println(); 
       break; 
      } 
     } 
    } 
} 
Problemi correlati