Подтвердить что ты не робот

Как использовать Mockito, чтобы показать все вызовы на макет

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

  • Создайте InvocationListener и передайте ему имя класса System Under Test.
  • Передайте слушателю в Mockito.withSettings().invocationListeners()
  • Временно измените тест, чтобы создать 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;
            }
        }
    }
}