@Override
    public Object handle(ProceedingJoinPoint proceedingJoinPoint,
        TimeLimiter timeLimiter, String methodName) throws Throwable {
        Object returnValue = proceedingJoinPoint.proceed();
        if (Flux.class.isAssignableFrom(returnValue.getClass())) {
            Flux<?> fluxReturnValue = (Flux<?>) returnValue;
            return fluxReturnValue.transformDeferred(TimeLimiterOperator.of(timeLimiter));
        } else if (Mono.class.isAssignableFrom(returnValue.getClass())) {
            Mono<?> monoReturnValue = (Mono<?>) returnValue;
            return monoReturnValue.transformDeferred(TimeLimiterOperator.of(timeLimiter));
        } else {
            throw new IllegalReturnTypeException(returnValue.getClass(), methodName,
                "Reactor expects Mono/Flux.");
        }
    }
@Test
    public void shouldThrowIllegalArgumentExceptionWithNotReactorType() throws Throwable{
        TimeLimiter timeLimiter = TimeLimiter.ofDefaults("test");
        when(proceedingJoinPoint.proceed()).thenReturn("NOT REACTOR TYPE");

        try {
            reactorTimeLimiterAspectExt.handle(proceedingJoinPoint, timeLimiter, "testMethod");
            fail("exception missed");
        } catch (Throwable e) {
            assertThat(e).isInstanceOf(IllegalReturnTypeException.class)
                .hasMessage(
                    "java.lang.String testMethod has unsupported by @TimeLimiter return type. Reactor expects Mono/Flux.");
        }
    }