@Override
    protected Mono<Void> doExecute(final ServerWebExchange exchange, final ShenyuPluginChain chain, final SelectorData selector, final RuleData rule) {
        ShenyuContext shenyuContext = exchange.getAttribute(Constants.CONTEXT);
        assert shenyuContext != null;
        ContextMappingRuleHandle ruleHandle = buildRuleHandle(rule);
        if (Objects.isNull(ruleHandle)) {
            LOG.error("context path rule configuration is null ：{}", rule);
            return chain.execute(exchange);
        }
        buildRealURI(exchange, shenyuContext, ruleHandle);
        return chain.execute(exchange);
    }
@Test
    public void executeTest() {
        shenyuContext.setPath("/http/context/order/findById");
        ContextMappingRuleHandle contextMappingRuleHandle = new ContextMappingRuleHandle();
        contextMappingRuleHandle.setContextPath("/http/context");
        when(ruleData.getId()).thenReturn("1");
        CACHED_HANDLE.get().cachedHandle(CacheKeyUtils.INST.getKey(ruleData), contextMappingRuleHandle);
        when(ruleData.getHandle()).thenReturn(GsonUtils.getGson().toJson(contextMappingRuleHandle));
        contextPathPlugin.doExecute(exchange, chain, selectorData, ruleData);
        assertEquals("/order/findById", shenyuContext.getRealUrl());

        Assertions.assertDoesNotThrow(() -> contextPathPlugin.doExecute(exchange, chain, selectorData, RuleData.builder().name("RuleData").build()));
        contextMappingRuleHandle.setAddPrefix("/addPrefix");
        Assertions.assertDoesNotThrow(() -> contextPathPlugin.doExecute(exchange, chain, selectorData, ruleData));
        contextMappingRuleHandle.setContextPath("/context");
        Assertions.assertDoesNotThrow(() -> contextPathPlugin.doExecute(exchange, chain, selectorData, ruleData));
        shenyuContext.setPath(null);
        contextMappingRuleHandle.setContextPath(null);
        Assertions.assertDoesNotThrow(() -> contextPathPlugin.doExecute(exchange, chain, selectorData, ruleData));
    }