Как использовать Mockito для отображения всех вызовов на макет

20

У меня есть единичный тест, который терпит неудачу, и я не уверен, почему. Я хочу видеть все вызовы в макете, которые происходят в System Under Test. Это не то поведение, которое я хочу для всех тестов всегда, просто для теста, который мне нужно быстро настроить, чтобы понять, что не так.

Однако, это похоже на хак. Возможно ли сделать это изначально в Mockito, не используя Thread.currentThread().getStackTrace() ?

Это не является предпочтительным, поскольку трассировка стека включает в себя все другие вызовы, используемые внутри Mockito.

    
задан durron597 18.06.2014 в 22:14
источник

2 ответа

32

Эта функция встроена с Mockito 1.9.5. Просто используйте

mock(ClassToMock.class, withSettings().verboseLogging())
    
ответ дан MRalwasser 17.10.2014 в 15:34
  • Ничего себе. По-видимому, у меня был прилив мгновенной слепоты при чтении Джавадока. Благодаря :) –  durron597 17.10.2014 в 17:42
0

Мне удалось определить метод, в котором использует , Thread.currentThread().getStackTrace() и циклическое перемещение по элементам. Это некрасиво, но это делает работу. Я надеюсь, что у другого ответчика будет лучший метод.

  1. Создайте InvocationListener и передайте ему имя класса System Under Test.
  2. Пропустить слушателя в Mockito.withSettings().invocationListeners()
  3. Временно измените тест, чтобы создать Mock с этим объектом MockSettings .

Код 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;
            }
        }
    }
}
    
ответ дан durron597 18.06.2014 в 22:14