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

Mockito - перехват любого вызова метода на макет

Можно ли перехватить все вызовы метода на макет в общем виде?

Пример

Учитывая класс, предоставленный поставщиком, например:

public class VendorObject {

    public int someIntMethod() {
        // ...
    }

    public String someStringMethod() {
        // ...
    }

}

Я хотел бы создать макет, который перенаправляет все вызовы методов в другой класс, где есть соответствующие сигнатуры методов:

public class RedirectedToObject {

    public int someIntMethod() {
        // Accepts re-direct
    }

}

Когда(). thenAnswer() конструкция в Mockito, похоже, соответствует вектору, но я не могу найти способ сопоставить любой вызов метода с любыми аргументами. InvocationOnMock, безусловно, дает мне все эти детали в любом случае. Существует ли общий способ сделать это? То, что будет выглядеть так, где когда (vo. *) Заменяется соответствующим кодом:

VendorObject vo = mock(VendorObject.class);
when(vo.anyMethod(anyArgs)).thenAnswer(
    new Answer() {
        @Override
        public Object answer(InvocationOnMock invocation) {

            // 1. Check if method exists on RedirectToObject.
            // 2a. If it does, call the method with the args and return the result.
            // 2b. If it does not, throw an exception to fail the unit test.

        }
    }
);

Добавление оберток вокруг классов поставщиков, чтобы сделать насмешливым легко, не является вариантом, потому что:

  • Слишком большая существующая база кода.
  • Часть критически важных приложений с высокой производительностью.
4b9b3361

Ответ 1

Я думаю, что вы хотите:

VendorObject vo = mock(VendorObject.class, new Answer() {
    @Override
    public Object answer(InvocationOnMock invocation) {

        // 1. Check if method exists on RedirectToObject.
        // 2a. If it does, call the method with the args and return the
        // result.
        // 2b. If it does not, throw an exception to fail the unit test.

    }
});

Конечно, если вы хотите часто использовать этот подход, не нужно, чтобы Ответ был анонимным.

Из документации: "Это довольно продвинутая функция, и обычно вам не нужно писать достойные тесты. Однако это может быть полезно при работе с устаревшими системами." Похоже на вас.