@Override
    public Object invoke(final Object proxy, final Method method, final Object[] args)
        throws Throwable {
        switch (method.getName()) {
            case "equals":
                return equals(args.length > 0 ? args[0] : null);

            case "hashCode":
                return hashCode();

            case "toString":
                return toString();

            default:
                break;
        }

        return decoratedDispatch.get(method).apply(args);
    }
@Test
    public void testInvoke() throws Throwable {
        final Object result = testSubject.invoke(testService, greetingMethod, new Object[0]);

        verify(methodHandler, times(1)).invoke(any());
        assertThat(feignDecorator.isCalled())
            .describedAs("FeignDecorator is called")
            .isTrue();
        assertThat(result)
            .describedAs("Return of invocation")
            .isEqualTo(testService.greeting());
    }