You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shenyu.apache.org by xi...@apache.org on 2022/12/10 02:42:16 UTC

[shenyu] branch master updated: [ISSUE #4235]supports generation of mock data on request (#4236)

This is an automated email from the ASF dual-hosted git repository.

xiaoyu pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shenyu.git


The following commit(s) were added to refs/heads/master by this push:
     new fbf8da7ed [ISSUE #4235]supports generation of mock data on request (#4236)
fbf8da7ed is described below

commit fbf8da7eda774759567ce060a2638b7cc284893c
Author: 愿凌飞 <ti...@foxmail.com>
AuthorDate: Sat Dec 10 10:42:05 2022 +0800

    [ISSUE #4235]supports generation of mock data on request (#4236)
    
    * [ISSUE 4228] fixed generate mock data in multithreading
    
    * [ISSUE #4235]supports generation of mock data on request
    
    * fixed unsafe
    
    * fix
    
    Co-authored-by: xiaoyu <xi...@apache.org>
---
 .../org/apache/shenyu/plugin/mock/MockPlugin.java  |  44 ++++-
 .../apache/shenyu/plugin/mock/api/MockRequest.java | 204 +++++++++++++++++++++
 .../plugin/mock/generator/ArrayGenerator.java      |   5 +-
 .../plugin/mock/generator/BoolGenerator.java       |   3 +-
 .../mock/generator/CurrentTimeGenerator.java       |   3 +-
 .../plugin/mock/generator/EmailGenerator.java      |   3 +-
 .../plugin/mock/generator/EnStringGenerator.java   |   3 +-
 .../plugin/mock/generator/ExpressionGenerator.java |   7 +-
 .../shenyu/plugin/mock/generator/Generator.java    |  10 +-
 .../plugin/mock/generator/GeneratorFactory.java    |  12 +-
 .../plugin/mock/generator/PhoneGenerator.java      |   3 +-
 .../mock/generator/RandomDoubleGenerator.java      |   3 +-
 .../plugin/mock/generator/RandomIntGenerator.java  |   3 +-
 .../plugin/mock/generator/RangeDataGenerator.java  |   3 +-
 .../plugin/mock/generator/ZhStringGenerator.java   |   3 +-
 .../plugin/mock/generator/ArrayGeneratorTest.java  |   6 +-
 .../plugin/mock/generator/BoolGeneratorTest.java   |   2 +-
 .../mock/generator/CurrentTimeGeneratorTest.java   |   4 +-
 .../plugin/mock/generator/EmailGeneratorTest.java  |   2 +-
 .../mock/generator/EnStringGeneratorTest.java      |   2 +-
 .../mock/generator/ExpressionGeneratorTest.java    |  80 ++++++--
 .../mock/generator/GeneratorFactoryTest.java       |   4 +-
 .../plugin/mock/generator/PhoneGeneratorTest.java  |   2 +-
 .../mock/generator/RandomDoubleGeneratorTest.java  |   4 +-
 .../mock/generator/RandomIntGeneratorTest.java     |   2 +-
 .../mock/generator/RangeDataGeneratorTest.java     |   4 +-
 .../mock/generator/ZhStringGeneratorTest.java      |   2 +-
 27 files changed, 363 insertions(+), 60 deletions(-)

diff --git a/shenyu-plugin/shenyu-plugin-mock/src/main/java/org/apache/shenyu/plugin/mock/MockPlugin.java b/shenyu-plugin/shenyu-plugin-mock/src/main/java/org/apache/shenyu/plugin/mock/MockPlugin.java
index 9f7f03f59..4e563e369 100644
--- a/shenyu-plugin/shenyu-plugin-mock/src/main/java/org/apache/shenyu/plugin/mock/MockPlugin.java
+++ b/shenyu-plugin/shenyu-plugin-mock/src/main/java/org/apache/shenyu/plugin/mock/MockPlugin.java
@@ -24,10 +24,15 @@ import org.apache.shenyu.common.enums.PluginEnum;
 import org.apache.shenyu.plugin.api.ShenyuPluginChain;
 import org.apache.shenyu.plugin.base.AbstractShenyuPlugin;
 import org.apache.shenyu.plugin.base.utils.CacheKeyUtils;
+import org.apache.shenyu.plugin.mock.api.MockRequest;
 import org.apache.shenyu.plugin.mock.generator.GeneratorFactory;
 import org.apache.shenyu.plugin.mock.handler.MockPluginHandler;
+import org.springframework.core.io.buffer.DataBuffer;
+import org.springframework.core.io.buffer.DataBufferUtils;
+import org.springframework.core.io.buffer.DefaultDataBufferFactory;
 import org.springframework.http.HttpStatus;
 import org.springframework.http.MediaType;
+import org.springframework.http.server.reactive.ServerHttpRequest;
 import org.springframework.web.server.ServerWebExchange;
 import reactor.core.publisher.Mono;
 
@@ -37,28 +42,49 @@ import java.nio.charset.StandardCharsets;
  * MockPlugin.
  */
 public class MockPlugin extends AbstractShenyuPlugin {
-    
+
     @Override
     protected Mono<Void> doExecute(final ServerWebExchange exchange, final ShenyuPluginChain chain,
                                    final SelectorData selector, final RuleData rule) {
+
         MockHandle mockHandle = MockPluginHandler.CACHED_HANDLE.get().obtainHandle(CacheKeyUtils.INST.getKey(rule));
-        String replaceContent = GeneratorFactory.dealRule(mockHandle.getResponseContent());
         exchange.getResponse().getHeaders().setContentType(MediaType.APPLICATION_JSON);
         exchange.getResponse().setStatusCode(HttpStatus.valueOf(mockHandle.getHttpStatusCode()));
-        final byte[] bytes = replaceContent.getBytes(StandardCharsets.UTF_8);
-        return exchange.getResponse().writeWith(Mono.just(exchange.getResponse()
-            .bufferFactory().wrap(bytes))
-            .doOnNext(data -> exchange.getResponse().getHeaders()
-                .setContentLength(data.readableByteCount())));
+
+        return DataBufferUtils.join(exchange.getRequest().getBody())
+                .switchIfEmpty(Mono.just(DefaultDataBufferFactory.sharedInstance.allocateBuffer(0)))
+                .map(dataBuffer -> dealRule(dataBuffer, mockHandle.getResponseContent(), exchange.getRequest()))
+                .flatMap(bytes -> exchange.getResponse().writeWith(Mono.just(exchange.getResponse()
+                        .bufferFactory().wrap(bytes))
+                        .doOnNext(data -> exchange.getResponse().getHeaders()
+                                .setContentLength(data.readableByteCount()))));
     }
-    
+
     @Override
     public int getOrder() {
         return PluginEnum.MOCK.getCode();
     }
-    
+
     @Override
     public String named() {
         return PluginEnum.MOCK.getName();
     }
+
+    private byte[] dealRule(final DataBuffer requestBodyBuffer, final String response, final ServerHttpRequest serverHttpRequest) {
+        byte[] originalBody = new byte[requestBodyBuffer.readableByteCount()];
+        requestBodyBuffer.read(originalBody);
+        DataBufferUtils.release(requestBodyBuffer);
+        MockRequest mockRequest = buildMockRequest(originalBody, serverHttpRequest);
+        return GeneratorFactory.dealRule(response, mockRequest).getBytes(StandardCharsets.UTF_8);
+    }
+
+    private MockRequest buildMockRequest(final byte[] originalBody, final ServerHttpRequest serverHttpRequest) {
+
+        return MockRequest.Builder.builder()
+                .headers(serverHttpRequest.getHeaders().toSingleValueMap())
+                .method(serverHttpRequest.getMethodValue())
+                .queries(serverHttpRequest.getQueryParams().toSingleValueMap())
+                .uri(serverHttpRequest.getURI().toString())
+                .body(originalBody).build();
+    }
 }
diff --git a/shenyu-plugin/shenyu-plugin-mock/src/main/java/org/apache/shenyu/plugin/mock/api/MockRequest.java b/shenyu-plugin/shenyu-plugin-mock/src/main/java/org/apache/shenyu/plugin/mock/api/MockRequest.java
new file mode 100644
index 000000000..0543e2f66
--- /dev/null
+++ b/shenyu-plugin/shenyu-plugin-mock/src/main/java/org/apache/shenyu/plugin/mock/api/MockRequest.java
@@ -0,0 +1,204 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.shenyu.plugin.mock.api;
+
+import org.apache.shenyu.common.utils.JsonUtils;
+
+import java.util.Map;
+import java.util.Objects;
+
+public final class MockRequest {
+
+    private Map<String, String> headers;
+
+    private String uri;
+
+    private String method;
+
+    private Map<String, String> queries;
+
+    private byte[] body;
+
+    private Object json;
+
+    private MockRequest() {
+    }
+
+    /**
+     * Gets headers.
+     *
+     * @return headers
+     */
+    public Map<String, String> getHeaders() {
+        return headers;
+    }
+
+    /**
+     * Gets uri.
+     *
+     * @return uri
+     */
+    public String getUri() {
+        return uri;
+    }
+
+    /**
+     * Gets Method.
+     *
+     * @return method
+     */
+    public String getMethod() {
+        return method;
+    }
+
+    /**
+     * Get queries.
+     *
+     * @return queries
+     */
+    public Map<String, String> getQueries() {
+        return queries;
+    }
+
+    /**
+     * Get json-body.
+     *
+     * @return json body
+     */
+    public Object getJson() {
+        if (Objects.isNull(json)) {
+            json = JsonUtils.jsonToMap(new String(body));
+        }
+        return json;
+    }
+
+    /**
+     * Gets form-body,not support now.
+     *
+     * @return form-body
+     */
+    public Map<String, String> getForms() {
+        //todo
+        throw new UnsupportedOperationException();
+    }
+
+    /**
+     * Gets xml-body,not support now.
+     *
+     * @return xml-body
+     */
+    public Object getXml() {
+        //todo
+        throw new UnsupportedOperationException();
+    }
+
+    public static final class Builder {
+
+        private Map<String, String> headers;
+
+        private String uri;
+
+        private String method;
+
+        private Map<String, String> queries;
+
+        private byte[] body;
+
+        private Builder() {
+        }
+
+        /**
+         * class builder.
+         *
+         * @return Builder
+         */
+        public static Builder builder() {
+            return new Builder();
+        }
+
+        /**
+         * build headers.
+         *
+         * @param headers headers
+         * @return this
+         */
+        public Builder headers(final Map<String, String> headers) {
+            this.headers = headers;
+            return this;
+        }
+
+        /**
+         * build uri.
+         *
+         * @param uri uri
+         * @return this
+         */
+        public Builder uri(final String uri) {
+            this.uri = uri;
+            return this;
+        }
+
+        /**
+         * build method.
+         *
+         * @param method method
+         * @return this
+         */
+        public Builder method(final String method) {
+            this.method = method;
+            return this;
+        }
+
+        /**
+         * build queries.
+         *
+         * @param queries queries
+         * @return this
+         */
+        public Builder queries(final Map<String, String> queries) {
+            this.queries = queries;
+            return this;
+        }
+
+        /**
+         * build body.
+         *
+         * @param body body
+         * @return this
+         */
+        public Builder body(final byte[] body) {
+            this.body = body;
+            return this;
+        }
+
+        /**
+         * build new Object.
+         *
+         * @return mockRequest
+         */
+        public MockRequest build() {
+            MockRequest mockRequest = new MockRequest();
+            mockRequest.uri = this.uri;
+            mockRequest.method = this.method;
+            mockRequest.queries = this.queries;
+            mockRequest.headers = this.headers;
+            mockRequest.body = this.body;
+            return mockRequest;
+        }
+    }
+}
diff --git a/shenyu-plugin/shenyu-plugin-mock/src/main/java/org/apache/shenyu/plugin/mock/generator/ArrayGenerator.java b/shenyu-plugin/shenyu-plugin-mock/src/main/java/org/apache/shenyu/plugin/mock/generator/ArrayGenerator.java
index 923a5ed0b..22ec7c687 100644
--- a/shenyu-plugin/shenyu-plugin-mock/src/main/java/org/apache/shenyu/plugin/mock/generator/ArrayGenerator.java
+++ b/shenyu-plugin/shenyu-plugin-mock/src/main/java/org/apache/shenyu/plugin/mock/generator/ArrayGenerator.java
@@ -17,6 +17,7 @@
 
 package org.apache.shenyu.plugin.mock.generator;
 
+import org.apache.shenyu.plugin.mock.api.MockRequest;
 import org.apache.shenyu.spi.Join;
 
 import java.util.List;
@@ -35,12 +36,12 @@ public class ArrayGenerator implements Generator<String> {
     }
 
     @Override
-    public String doGenerate(final List<String> params, final String rule) {
+    public String doGenerate(final List<String> params, final String rule, final MockRequest mockRequest) {
         int length = Integer.parseInt(rule.substring(rule.lastIndexOf("|") + 1));
 
         String replaceContentCopy = rule.substring(rule.indexOf("|") + 1, rule.lastIndexOf("|"));
         return IntStream.rangeClosed(0, length - 1)
-                .mapToObj(i -> GeneratorFactory.dealRule(replaceContentCopy))
+                .mapToObj(i -> GeneratorFactory.dealRule(replaceContentCopy, mockRequest))
                 .collect(Collectors.joining(","));
     }
 
diff --git a/shenyu-plugin/shenyu-plugin-mock/src/main/java/org/apache/shenyu/plugin/mock/generator/BoolGenerator.java b/shenyu-plugin/shenyu-plugin-mock/src/main/java/org/apache/shenyu/plugin/mock/generator/BoolGenerator.java
index 3d3618911..328bd13bd 100644
--- a/shenyu-plugin/shenyu-plugin-mock/src/main/java/org/apache/shenyu/plugin/mock/generator/BoolGenerator.java
+++ b/shenyu-plugin/shenyu-plugin-mock/src/main/java/org/apache/shenyu/plugin/mock/generator/BoolGenerator.java
@@ -17,6 +17,7 @@
 
 package org.apache.shenyu.plugin.mock.generator;
 
+import org.apache.shenyu.plugin.mock.api.MockRequest;
 import org.apache.shenyu.plugin.mock.util.MockUtil;
 import org.apache.shenyu.spi.Join;
 
@@ -34,7 +35,7 @@ public class BoolGenerator implements Generator<Boolean> {
     }
 
     @Override
-    public Boolean doGenerate(final List<String> params, final String rule) {
+    public Boolean doGenerate(final List<String> params, final String rule, final MockRequest mockRequest) {
         return MockUtil.bool();
     }
 
diff --git a/shenyu-plugin/shenyu-plugin-mock/src/main/java/org/apache/shenyu/plugin/mock/generator/CurrentTimeGenerator.java b/shenyu-plugin/shenyu-plugin-mock/src/main/java/org/apache/shenyu/plugin/mock/generator/CurrentTimeGenerator.java
index df0418725..36328e376 100644
--- a/shenyu-plugin/shenyu-plugin-mock/src/main/java/org/apache/shenyu/plugin/mock/generator/CurrentTimeGenerator.java
+++ b/shenyu-plugin/shenyu-plugin-mock/src/main/java/org/apache/shenyu/plugin/mock/generator/CurrentTimeGenerator.java
@@ -17,6 +17,7 @@
 
 package org.apache.shenyu.plugin.mock.generator;
 
+import org.apache.shenyu.plugin.mock.api.MockRequest;
 import org.apache.shenyu.plugin.mock.util.MockUtil;
 import org.apache.shenyu.spi.Join;
 
@@ -34,7 +35,7 @@ public class CurrentTimeGenerator implements Generator<String> {
     }
 
     @Override
-    public String doGenerate(final List<String> params, final String rule) {
+    public String doGenerate(final List<String> params, final String rule, final MockRequest mockRequest) {
         String format = null;
         if (params.size() >= 1) {
             format = params.get(0);
diff --git a/shenyu-plugin/shenyu-plugin-mock/src/main/java/org/apache/shenyu/plugin/mock/generator/EmailGenerator.java b/shenyu-plugin/shenyu-plugin-mock/src/main/java/org/apache/shenyu/plugin/mock/generator/EmailGenerator.java
index 2d981843b..d622ebde0 100644
--- a/shenyu-plugin/shenyu-plugin-mock/src/main/java/org/apache/shenyu/plugin/mock/generator/EmailGenerator.java
+++ b/shenyu-plugin/shenyu-plugin-mock/src/main/java/org/apache/shenyu/plugin/mock/generator/EmailGenerator.java
@@ -17,6 +17,7 @@
 
 package org.apache.shenyu.plugin.mock.generator;
 
+import org.apache.shenyu.plugin.mock.api.MockRequest;
 import org.apache.shenyu.plugin.mock.util.MockUtil;
 import org.apache.shenyu.spi.Join;
 
@@ -34,7 +35,7 @@ public class EmailGenerator implements Generator<String> {
     }
 
     @Override
-    public String doGenerate(final List<String> params, final String rule) {
+    public String doGenerate(final List<String> params, final String rule, final MockRequest mockRequest) {
         return MockUtil.email();
     }
 
diff --git a/shenyu-plugin/shenyu-plugin-mock/src/main/java/org/apache/shenyu/plugin/mock/generator/EnStringGenerator.java b/shenyu-plugin/shenyu-plugin-mock/src/main/java/org/apache/shenyu/plugin/mock/generator/EnStringGenerator.java
index 2c47b3eca..5a41dcfa9 100644
--- a/shenyu-plugin/shenyu-plugin-mock/src/main/java/org/apache/shenyu/plugin/mock/generator/EnStringGenerator.java
+++ b/shenyu-plugin/shenyu-plugin-mock/src/main/java/org/apache/shenyu/plugin/mock/generator/EnStringGenerator.java
@@ -17,6 +17,7 @@
 
 package org.apache.shenyu.plugin.mock.generator;
 
+import org.apache.shenyu.plugin.mock.api.MockRequest;
 import org.apache.shenyu.plugin.mock.util.MockUtil;
 import org.apache.shenyu.spi.Join;
 
@@ -34,7 +35,7 @@ public class EnStringGenerator implements Generator<String> {
     }
 
     @Override
-    public String doGenerate(final List<String> params, final String rule) {
+    public String doGenerate(final List<String> params, final String rule, final MockRequest mockRequest) {
         String[] range = params.get(0).split("-");
         int min = Integer.parseInt(range[0]);
         int max = Integer.parseInt(range[1]);
diff --git a/shenyu-plugin/shenyu-plugin-mock/src/main/java/org/apache/shenyu/plugin/mock/generator/ExpressionGenerator.java b/shenyu-plugin/shenyu-plugin-mock/src/main/java/org/apache/shenyu/plugin/mock/generator/ExpressionGenerator.java
index 9dc00d02e..451172bcb 100644
--- a/shenyu-plugin/shenyu-plugin-mock/src/main/java/org/apache/shenyu/plugin/mock/generator/ExpressionGenerator.java
+++ b/shenyu-plugin/shenyu-plugin-mock/src/main/java/org/apache/shenyu/plugin/mock/generator/ExpressionGenerator.java
@@ -18,10 +18,12 @@
 package org.apache.shenyu.plugin.mock.generator;
 
 import org.apache.shenyu.common.utils.JsonUtils;
+import org.apache.shenyu.plugin.mock.api.MockRequest;
 import org.apache.shenyu.plugin.mock.util.MockUtil;
 import org.apache.shenyu.spi.Join;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.context.expression.MapAccessor;
 import org.springframework.expression.EvaluationContext;
 import org.springframework.expression.ExpressionParser;
 import org.springframework.expression.spel.standard.SpelExpressionParser;
@@ -44,10 +46,11 @@ public class ExpressionGenerator implements Generator<String> {
     }
 
     @Override
-    public String doGenerate(final List<String> params, final String rule) {
+    public String doGenerate(final List<String> params, final String rule, final MockRequest mockRequest) {
 
         String expression = params.get(0);
 
+        CONTEXT.setVariable("req", mockRequest);
         Object val = PARSER.parseExpression(expression).getValue(CONTEXT);
 
         if (val instanceof MockUtil.FormatDouble) {
@@ -89,6 +92,8 @@ public class ExpressionGenerator implements Generator<String> {
 
             registerMockFunction(context, "current", "current", String[].class);
 
+            context.addPropertyAccessor(new MapAccessor());
+
         } catch (NoSuchMethodException e) {
             // It will never happen
             LOG.error(e.getMessage(), e);
diff --git a/shenyu-plugin/shenyu-plugin-mock/src/main/java/org/apache/shenyu/plugin/mock/generator/Generator.java b/shenyu-plugin/shenyu-plugin-mock/src/main/java/org/apache/shenyu/plugin/mock/generator/Generator.java
index bc60d14d0..b19126053 100644
--- a/shenyu-plugin/shenyu-plugin-mock/src/main/java/org/apache/shenyu/plugin/mock/generator/Generator.java
+++ b/shenyu-plugin/shenyu-plugin-mock/src/main/java/org/apache/shenyu/plugin/mock/generator/Generator.java
@@ -17,6 +17,7 @@
 
 package org.apache.shenyu.plugin.mock.generator;
 
+import org.apache.shenyu.plugin.mock.api.MockRequest;
 import org.apache.shenyu.spi.SPI;
 
 import java.util.ArrayList;
@@ -39,12 +40,14 @@ public interface Generator<T> {
 
     /**
      * generate mock data.
+     *
      * @param rule rule
+     * @param mockRequest request
      * @return mock data
      */
-    default T generate(String rule) {
+    default T generate(String rule, MockRequest mockRequest) {
         List<String> params = extractParams(rule);
-        return doGenerate(params, rule);
+        return doGenerate(params, rule, mockRequest);
     }
 
     /**
@@ -52,9 +55,10 @@ public interface Generator<T> {
      *
      * @param params params
      * @param rule   rule
+     * @param mockRequest request
      * @return mock data
      */
-    T doGenerate(List<String> params, String rule);
+    T doGenerate(List<String> params, String rule, MockRequest mockRequest);
 
     /**
      * get size of rule params.
diff --git a/shenyu-plugin/shenyu-plugin-mock/src/main/java/org/apache/shenyu/plugin/mock/generator/GeneratorFactory.java b/shenyu-plugin/shenyu-plugin-mock/src/main/java/org/apache/shenyu/plugin/mock/generator/GeneratorFactory.java
index 69a2221ce..d38aa56b8 100644
--- a/shenyu-plugin/shenyu-plugin-mock/src/main/java/org/apache/shenyu/plugin/mock/generator/GeneratorFactory.java
+++ b/shenyu-plugin/shenyu-plugin-mock/src/main/java/org/apache/shenyu/plugin/mock/generator/GeneratorFactory.java
@@ -17,6 +17,7 @@
 
 package org.apache.shenyu.plugin.mock.generator;
 
+import org.apache.shenyu.plugin.mock.api.MockRequest;
 import org.apache.shenyu.spi.ExtensionLoader;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -63,7 +64,7 @@ public final class GeneratorFactory {
         return null;
     }
 
-    private static String generate(final String rule) {
+    private static String generate(final String rule, final MockRequest mockRequest) {
         final Matcher matcher = RULE_CONTENT_PATTERN.matcher(rule);
         if (!matcher.find()) {
             return rule;
@@ -78,7 +79,7 @@ public final class GeneratorFactory {
 
         String[] prefixAndSuffix = generator.getPrefixAndSuffix();
         try {
-            Object generateData = generator.generate(ruleContent);
+            Object generateData = generator.generate(ruleContent, mockRequest);
             return String.join("", prefixAndSuffix[0], generateData.toString(), prefixAndSuffix[1]);
         } catch (Exception e) {
             LOG.error(e.getMessage(), e);
@@ -89,14 +90,15 @@ public final class GeneratorFactory {
     /**
      * replace placeholder in content.
      *
-     * @param content response content.
+     * @param content response content
+     * @param mockRequest request
      * @return replace the content after the placeholder.
      */
-    public static String dealRule(final String content) {
+    public static String dealRule(final String content, final MockRequest mockRequest) {
         String afterDeal = content;
         String placeHolder = getPlaceholder(content);
         while (placeHolder != null) {
-            Object generateData = generate(placeHolder);
+            Object generateData = generate(placeHolder, mockRequest);
             if (Objects.equals(generateData, placeHolder)) {
                 generateData = ERROR_PARSE;
             }
diff --git a/shenyu-plugin/shenyu-plugin-mock/src/main/java/org/apache/shenyu/plugin/mock/generator/PhoneGenerator.java b/shenyu-plugin/shenyu-plugin-mock/src/main/java/org/apache/shenyu/plugin/mock/generator/PhoneGenerator.java
index e6d00dc75..d36730c97 100644
--- a/shenyu-plugin/shenyu-plugin-mock/src/main/java/org/apache/shenyu/plugin/mock/generator/PhoneGenerator.java
+++ b/shenyu-plugin/shenyu-plugin-mock/src/main/java/org/apache/shenyu/plugin/mock/generator/PhoneGenerator.java
@@ -17,6 +17,7 @@
 
 package org.apache.shenyu.plugin.mock.generator;
 
+import org.apache.shenyu.plugin.mock.api.MockRequest;
 import org.apache.shenyu.plugin.mock.util.MockUtil;
 import org.apache.shenyu.spi.Join;
 
@@ -34,7 +35,7 @@ public class PhoneGenerator implements Generator<String> {
     }
 
     @Override
-    public String doGenerate(final List<String> params, final String rule) {
+    public String doGenerate(final List<String> params, final String rule, final MockRequest mockRequest) {
         return MockUtil.phone();
     }
 
diff --git a/shenyu-plugin/shenyu-plugin-mock/src/main/java/org/apache/shenyu/plugin/mock/generator/RandomDoubleGenerator.java b/shenyu-plugin/shenyu-plugin-mock/src/main/java/org/apache/shenyu/plugin/mock/generator/RandomDoubleGenerator.java
index 6f0d643f9..1ada6619e 100644
--- a/shenyu-plugin/shenyu-plugin-mock/src/main/java/org/apache/shenyu/plugin/mock/generator/RandomDoubleGenerator.java
+++ b/shenyu-plugin/shenyu-plugin-mock/src/main/java/org/apache/shenyu/plugin/mock/generator/RandomDoubleGenerator.java
@@ -17,6 +17,7 @@
 
 package org.apache.shenyu.plugin.mock.generator;
 
+import org.apache.shenyu.plugin.mock.api.MockRequest;
 import org.apache.shenyu.plugin.mock.util.MockUtil;
 import org.apache.shenyu.spi.Join;
 
@@ -35,7 +36,7 @@ public class RandomDoubleGenerator implements Generator<String> {
     }
 
     @Override
-    public String doGenerate(final List<String> params, final String rule) {
+    public String doGenerate(final List<String> params, final String rule, final MockRequest mockRequest) {
         String[] range = params.get(0).split("-");
         double min = Double.parseDouble(range[0]);
         double max = Double.parseDouble(range[1]);
diff --git a/shenyu-plugin/shenyu-plugin-mock/src/main/java/org/apache/shenyu/plugin/mock/generator/RandomIntGenerator.java b/shenyu-plugin/shenyu-plugin-mock/src/main/java/org/apache/shenyu/plugin/mock/generator/RandomIntGenerator.java
index a192b5588..94618477d 100644
--- a/shenyu-plugin/shenyu-plugin-mock/src/main/java/org/apache/shenyu/plugin/mock/generator/RandomIntGenerator.java
+++ b/shenyu-plugin/shenyu-plugin-mock/src/main/java/org/apache/shenyu/plugin/mock/generator/RandomIntGenerator.java
@@ -17,6 +17,7 @@
 
 package org.apache.shenyu.plugin.mock.generator;
 
+import org.apache.shenyu.plugin.mock.api.MockRequest;
 import org.apache.shenyu.plugin.mock.util.MockUtil;
 import org.apache.shenyu.spi.Join;
 
@@ -34,7 +35,7 @@ public class RandomIntGenerator implements Generator<Integer> {
     }
 
     @Override
-    public Integer doGenerate(final List<String> params, final String rule) {
+    public Integer doGenerate(final List<String> params, final String rule, final MockRequest mockRequest) {
         String[] range = params.get(0).split("-");
         int min = Integer.parseInt(range[0]);
         int max = Integer.parseInt(range[1]);
diff --git a/shenyu-plugin/shenyu-plugin-mock/src/main/java/org/apache/shenyu/plugin/mock/generator/RangeDataGenerator.java b/shenyu-plugin/shenyu-plugin-mock/src/main/java/org/apache/shenyu/plugin/mock/generator/RangeDataGenerator.java
index 98ee2fdb7..833f29daf 100644
--- a/shenyu-plugin/shenyu-plugin-mock/src/main/java/org/apache/shenyu/plugin/mock/generator/RangeDataGenerator.java
+++ b/shenyu-plugin/shenyu-plugin-mock/src/main/java/org/apache/shenyu/plugin/mock/generator/RangeDataGenerator.java
@@ -17,6 +17,7 @@
 
 package org.apache.shenyu.plugin.mock.generator;
 
+import org.apache.shenyu.plugin.mock.api.MockRequest;
 import org.apache.shenyu.plugin.mock.util.MockUtil;
 import org.apache.shenyu.spi.Join;
 
@@ -35,7 +36,7 @@ public class RangeDataGenerator implements Generator<String> {
     }
 
     @Override
-    public String doGenerate(final List<String> params, final String rule) {
+    public String doGenerate(final List<String> params, final String rule, final MockRequest mockRequest) {
         String rangeData = params.get(0).replaceAll("\\[(.+)]", "$1");
         String[] data = Arrays.stream(rangeData.split("(?<!\\\\),"))
                 .map(_data -> _data.replace("\\,", ","))
diff --git a/shenyu-plugin/shenyu-plugin-mock/src/main/java/org/apache/shenyu/plugin/mock/generator/ZhStringGenerator.java b/shenyu-plugin/shenyu-plugin-mock/src/main/java/org/apache/shenyu/plugin/mock/generator/ZhStringGenerator.java
index 9f19e512a..91c058d24 100644
--- a/shenyu-plugin/shenyu-plugin-mock/src/main/java/org/apache/shenyu/plugin/mock/generator/ZhStringGenerator.java
+++ b/shenyu-plugin/shenyu-plugin-mock/src/main/java/org/apache/shenyu/plugin/mock/generator/ZhStringGenerator.java
@@ -17,6 +17,7 @@
 
 package org.apache.shenyu.plugin.mock.generator;
 
+import org.apache.shenyu.plugin.mock.api.MockRequest;
 import org.apache.shenyu.plugin.mock.util.MockUtil;
 import org.apache.shenyu.spi.Join;
 
@@ -34,7 +35,7 @@ public class ZhStringGenerator implements Generator<String> {
     }
 
     @Override
-    public String doGenerate(final List<String> params, final String rule) {
+    public String doGenerate(final List<String> params, final String rule, final MockRequest mockRequest) {
         String[] range = params.get(0).split("-");
         int min = Integer.parseInt(range[0]);
         int max = Integer.parseInt(range[1]);
diff --git a/shenyu-plugin/shenyu-plugin-mock/src/test/java/org/apache/shenyu/plugin/mock/generator/ArrayGeneratorTest.java b/shenyu-plugin/shenyu-plugin-mock/src/test/java/org/apache/shenyu/plugin/mock/generator/ArrayGeneratorTest.java
index 6f75ab0b8..51a06e1bc 100644
--- a/shenyu-plugin/shenyu-plugin-mock/src/test/java/org/apache/shenyu/plugin/mock/generator/ArrayGeneratorTest.java
+++ b/shenyu-plugin/shenyu-plugin-mock/src/test/java/org/apache/shenyu/plugin/mock/generator/ArrayGeneratorTest.java
@@ -32,16 +32,16 @@ public final class ArrayGeneratorTest {
 
     @Test
     public void testGenerate() {
-        String generate = arrayGenerator.generate("array|\"test\"|3");
+        String generate = arrayGenerator.generate("array|\"test\"|3", null);
         assertEquals("\"test\",\"test\",\"test\"", generate);
     }
 
     @Test
     public void testNestRuleGenerate() {
-        String generate = arrayGenerator.generate("array|{\"ints\":${array|10|3}}|3");
+        String generate = arrayGenerator.generate("array|{\"ints\":${array|10|3}}|3", null);
         assertEquals("{\"ints\":[10,10,10]},{\"ints\":[10,10,10]},{\"ints\":[10,10,10]}", generate);
 
-        generate = arrayGenerator.generate("array|{\"int\":${expression|#oneOf(10)}}|3");
+        generate = arrayGenerator.generate("array|{\"int\":${expression|#oneOf(10)}}|3", null);
         assertEquals("{\"int\":10},{\"int\":10},{\"int\":10}", generate);
     }
 
diff --git a/shenyu-plugin/shenyu-plugin-mock/src/test/java/org/apache/shenyu/plugin/mock/generator/BoolGeneratorTest.java b/shenyu-plugin/shenyu-plugin-mock/src/test/java/org/apache/shenyu/plugin/mock/generator/BoolGeneratorTest.java
index 6ca2816f0..43e5a6b10 100644
--- a/shenyu-plugin/shenyu-plugin-mock/src/test/java/org/apache/shenyu/plugin/mock/generator/BoolGeneratorTest.java
+++ b/shenyu-plugin/shenyu-plugin-mock/src/test/java/org/apache/shenyu/plugin/mock/generator/BoolGeneratorTest.java
@@ -32,7 +32,7 @@ public final class BoolGeneratorTest {
 
     @Test
     public void testGenerate() {
-        Boolean generate = boolGenerator.generate("bool");
+        Boolean generate = boolGenerator.generate("bool", null);
         Assertions.assertNotNull(generate);
 
     }
diff --git a/shenyu-plugin/shenyu-plugin-mock/src/test/java/org/apache/shenyu/plugin/mock/generator/CurrentTimeGeneratorTest.java b/shenyu-plugin/shenyu-plugin-mock/src/test/java/org/apache/shenyu/plugin/mock/generator/CurrentTimeGeneratorTest.java
index ebe0fbb26..3feb680b2 100644
--- a/shenyu-plugin/shenyu-plugin-mock/src/test/java/org/apache/shenyu/plugin/mock/generator/CurrentTimeGeneratorTest.java
+++ b/shenyu-plugin/shenyu-plugin-mock/src/test/java/org/apache/shenyu/plugin/mock/generator/CurrentTimeGeneratorTest.java
@@ -29,8 +29,8 @@ public final class CurrentTimeGeneratorTest {
 
     @Test
     public void testGenerate() {
-        Assertions.assertTrue(generator.generate("current").matches("^\\d{4}(-\\d{2}){2} \\d{2}(:\\d{2}){2}$"));
-        Assertions.assertTrue(generator.generate("current|YYYY-MM-dd").matches("^\\d{4}(-\\d{2}){2}$"));
+        Assertions.assertTrue(generator.generate("current", null).matches("^\\d{4}(-\\d{2}){2} \\d{2}(:\\d{2}){2}$"));
+        Assertions.assertTrue(generator.generate("current|YYYY-MM-dd", null).matches("^\\d{4}(-\\d{2}){2}$"));
     }
 
     @Test
diff --git a/shenyu-plugin/shenyu-plugin-mock/src/test/java/org/apache/shenyu/plugin/mock/generator/EmailGeneratorTest.java b/shenyu-plugin/shenyu-plugin-mock/src/test/java/org/apache/shenyu/plugin/mock/generator/EmailGeneratorTest.java
index ee22fcb22..48b7e2745 100644
--- a/shenyu-plugin/shenyu-plugin-mock/src/test/java/org/apache/shenyu/plugin/mock/generator/EmailGeneratorTest.java
+++ b/shenyu-plugin/shenyu-plugin-mock/src/test/java/org/apache/shenyu/plugin/mock/generator/EmailGeneratorTest.java
@@ -32,7 +32,7 @@ public final class EmailGeneratorTest {
 
     @Test
     public void testGenerate() {
-        String email = generator.generate("email");
+        String email = generator.generate("email", null);
         assertNotNull(email);
     }
 
diff --git a/shenyu-plugin/shenyu-plugin-mock/src/test/java/org/apache/shenyu/plugin/mock/generator/EnStringGeneratorTest.java b/shenyu-plugin/shenyu-plugin-mock/src/test/java/org/apache/shenyu/plugin/mock/generator/EnStringGeneratorTest.java
index 04dd738eb..df0016769 100644
--- a/shenyu-plugin/shenyu-plugin-mock/src/test/java/org/apache/shenyu/plugin/mock/generator/EnStringGeneratorTest.java
+++ b/shenyu-plugin/shenyu-plugin-mock/src/test/java/org/apache/shenyu/plugin/mock/generator/EnStringGeneratorTest.java
@@ -33,7 +33,7 @@ public final class EnStringGeneratorTest {
     public void testGenerate() {
         int max = 10;
         int min = 5;
-        String enString = generator.generate("en|" + min + "-" + max);
+        String enString = generator.generate("en|" + min + "-" + max, null);
         assertTrue(enString.matches("[a-zA-Z]{" + min + "," + max + "}"));
     }
 
diff --git a/shenyu-plugin/shenyu-plugin-mock/src/test/java/org/apache/shenyu/plugin/mock/generator/ExpressionGeneratorTest.java b/shenyu-plugin/shenyu-plugin-mock/src/test/java/org/apache/shenyu/plugin/mock/generator/ExpressionGeneratorTest.java
index 499ad962b..5f412710d 100644
--- a/shenyu-plugin/shenyu-plugin-mock/src/test/java/org/apache/shenyu/plugin/mock/generator/ExpressionGeneratorTest.java
+++ b/shenyu-plugin/shenyu-plugin-mock/src/test/java/org/apache/shenyu/plugin/mock/generator/ExpressionGeneratorTest.java
@@ -17,9 +17,14 @@
 
 package org.apache.shenyu.plugin.mock.generator;
 
+import com.google.common.collect.ImmutableMap;
+import org.apache.shenyu.common.enums.HttpMethodEnum;
 import org.apache.shenyu.common.utils.JsonUtils;
+import org.apache.shenyu.plugin.mock.api.MockRequest;
+import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.Test;
 
+import java.nio.charset.StandardCharsets;
 import java.time.LocalDate;
 import java.util.Arrays;
 
@@ -37,51 +42,70 @@ import static org.junit.jupiter.api.Assertions.assertTrue;
 
 public class ExpressionGeneratorTest {
 
+    private static MockRequest mockRequest;
+
     private final ExpressionGenerator generator = new ExpressionGenerator();
 
+    @BeforeAll
+    public static void setUp() {
+        byte[] body = JsonUtils.toJson(ImmutableMap.of(
+                "name", "shenyu",
+                "id", 1234L,
+                "address", ImmutableMap.of("country", "CHINA")))
+                .getBytes(StandardCharsets.UTF_8);
+
+        mockRequest = MockRequest.Builder.builder()
+                .uri("getName")
+                .headers(ImmutableMap.of("header_name", "header_value"))
+                .method(HttpMethodEnum.GET.getName())
+                .queries(ImmutableMap.of("query_name", "query_value"))
+                .body(body)
+                .build();
+
+    }
+
     @Test
     public void testGenerate() {
 
-        assertThat(generator.generate("expression|T(java.time.LocalDate).now()"),
+        assertThat(generator.generate("expression|T(java.time.LocalDate).now()", mockRequest),
                 is(JsonUtils.toJson(LocalDate.now().toString())));
 
-        assertThat(generator.generate("expression|1==1"),
+        assertThat(generator.generate("expression|1==1", mockRequest),
                 is("true"));
     }
 
     @Test
     public void testBoolGenerate() {
-        String generate = generator.generate("expression|#bool()");
+        String generate = generator.generate("expression|#bool()", mockRequest);
         assertThat(generate, in(Arrays.asList("true", "false")));
 
     }
 
     @Test
     public void testCurrentTimeGenerate() {
-        assertThat(generator.generate("expression|#current()"),
+        assertThat(generator.generate("expression|#current()", mockRequest),
                 matchesRegex("^\"\\d{4}(-\\d{2}){2} \\d{2}(:\\d{2}){2}\"$"));
 
-        generator.generate("expression|#current('YYYY-MM-dd')");
-        assertThat(generator.generate("expression|#current('YYYY-MM-dd')"),
+        assertThat(generator.generate("expression|#current('YYYY-MM-dd')", mockRequest),
                 matchesRegex("^\"\\d{4}(-\\d{2}){2}\"$"));
     }
 
     @Test
     public void testEmailTimeGenerate() {
-        assertNotNull(generator.generate("expression|#email()"));
+        assertNotNull(generator.generate("expression|#email()", mockRequest));
     }
 
     @Test
     public void testEnStringGenerate() {
         int max = 10;
         int min = 5;
-        String enString = generator.generate(String.format("expression|#en(%d,%d)", min, max));
+        String enString = generator.generate(String.format("expression|#en(%d,%d)", min, max), mockRequest);
         assertThat(enString, matchesRegex("\"[a-zA-Z]{" + min + "," + max + "}\""));
     }
 
     @Test
     public void testPhoneGenerate() {
-        String phone = generator.generate("expression|#phone()");
+        String phone = generator.generate("expression|#phone()", mockRequest);
         assertTrue(phone.matches("^\"1[3-9]\\d{9}\"$"));
     }
 
@@ -89,10 +113,10 @@ public class ExpressionGeneratorTest {
     public void testRandomDoubleGenerate() {
         double min = 10.5;
         double max = 12.0;
-        String doubleValue = generator.generate(String.format("expression|#double(%f,%f)", min, max));
+        String doubleValue = generator.generate(String.format("expression|#double(%f,%f)", min, max), mockRequest);
         assertThat(Double.valueOf(doubleValue), allOf(greaterThanOrEqualTo(min), lessThanOrEqualTo(max)));
 
-        doubleValue = generator.generate("expression|#double(10.5,12.0,'¥%.2f')");
+        doubleValue = generator.generate("expression|#double(10.5,12.0,'¥%.2f')", mockRequest);
         assertThat(Double.valueOf(doubleValue.substring(1)), allOf(greaterThanOrEqualTo(min), lessThanOrEqualTo(max)));
         assertThat(doubleValue, matchesRegex("^¥\\d+.\\d{2}$"));
     }
@@ -101,23 +125,51 @@ public class ExpressionGeneratorTest {
     public void testRandomIntGenerate() {
         int min = 10;
         int max = 15;
-        String val = generator.generate(String.format("expression|#int(%d,%d)", min, max));
+        String val = generator.generate(String.format("expression|#int(%d,%d)", min, max), mockRequest);
         assertThat(Integer.valueOf(val), allOf(greaterThanOrEqualTo(min), lessThanOrEqualTo(max)));
     }
 
     @Test
     public void testRandomDataGenerate() {
 
-        String val = generator.generate("expression|#oneOf('shenyu','number',1)");
+        String val = generator.generate("expression|#oneOf('shenyu','number',1)", mockRequest);
         assertThat(val, oneOf("\"shenyu\"", "\"number\"", "1"));
     }
 
+    @Test
+    public void testGenerateDataFromReq() {
+
+        assertThat(generator.generate("expression|#req.headers[header_name]", mockRequest),
+                is("\"header_value\""));
+
+        assertThat(generator.generate("expression|#req.method", mockRequest),
+                is("\"get\""));
+
+        assertThat(generator.generate("expression|#req.queries['query_name']", mockRequest),
+                is("\"query_value\""));
+
+        assertThat(generator.generate("expression|#req.queries.query_name", mockRequest),
+                is("\"query_value\""));
+
+        assertThat(generator.generate("expression|#req.json.id", mockRequest),
+                is("1234"));
+
+        assertThat(generator.generate("expression|#req.json.name", mockRequest),
+                is("\"shenyu\""));
+
+        assertThat(generator.generate("expression|#req.uri", mockRequest),
+                is("\"getName\""));
+
+        assertThat(generator.generate("expression|#req.json.address.country", mockRequest),
+                is("\"CHINA\""));
+    }
+
     @Test
     public void testZhDataGenerate() {
 
         int minLength = 10;
         int maxLength = 20;
-        String val = generator.generate(String.format("expression|#zh(%d,%d)", minLength, maxLength));
+        String val = generator.generate(String.format("expression|#zh(%d,%d)", minLength, maxLength), mockRequest);
         assertThat(val.length(), allOf(greaterThanOrEqualTo(minLength), lessThanOrEqualTo(maxLength)));
     }
 
diff --git a/shenyu-plugin/shenyu-plugin-mock/src/test/java/org/apache/shenyu/plugin/mock/generator/GeneratorFactoryTest.java b/shenyu-plugin/shenyu-plugin-mock/src/test/java/org/apache/shenyu/plugin/mock/generator/GeneratorFactoryTest.java
index e0ccd3854..f0dd949da 100644
--- a/shenyu-plugin/shenyu-plugin-mock/src/test/java/org/apache/shenyu/plugin/mock/generator/GeneratorFactoryTest.java
+++ b/shenyu-plugin/shenyu-plugin-mock/src/test/java/org/apache/shenyu/plugin/mock/generator/GeneratorFactoryTest.java
@@ -29,14 +29,14 @@ public class GeneratorFactoryTest {
 
     @Test
     public void testDealRule() {
-        String dealedContent = GeneratorFactory.dealRule("${phone}");
+        String dealedContent = GeneratorFactory.dealRule("${phone}", null);
         assertThat(dealedContent, matchesRegex("^\"1[3-9]\\d{9}\"$"));
     }
 
     @ParameterizedTest
     @ValueSource(strings = {"${expression|(sdxc}", "${wrong_rule|123}"})
     public void testDealRuleWithWrongContent(final String content) {
-        String dealedContent = GeneratorFactory.dealRule(content);
+        String dealedContent = GeneratorFactory.dealRule(content, null);
         assertThat(dealedContent, is("\"[#ERROR EXPRESSION#]\""));
     }
 }
diff --git a/shenyu-plugin/shenyu-plugin-mock/src/test/java/org/apache/shenyu/plugin/mock/generator/PhoneGeneratorTest.java b/shenyu-plugin/shenyu-plugin-mock/src/test/java/org/apache/shenyu/plugin/mock/generator/PhoneGeneratorTest.java
index 1ed10c8c7..123ca3118 100644
--- a/shenyu-plugin/shenyu-plugin-mock/src/test/java/org/apache/shenyu/plugin/mock/generator/PhoneGeneratorTest.java
+++ b/shenyu-plugin/shenyu-plugin-mock/src/test/java/org/apache/shenyu/plugin/mock/generator/PhoneGeneratorTest.java
@@ -35,7 +35,7 @@ public final class PhoneGeneratorTest {
 
     @Test
     void testGenerate() {
-        String phone = generator.generate("phone");
+        String phone = generator.generate("phone", null);
         assertThat(phone, matchesRegex("^1[3-9]\\d{9}$"));
     }
 
diff --git a/shenyu-plugin/shenyu-plugin-mock/src/test/java/org/apache/shenyu/plugin/mock/generator/RandomDoubleGeneratorTest.java b/shenyu-plugin/shenyu-plugin-mock/src/test/java/org/apache/shenyu/plugin/mock/generator/RandomDoubleGeneratorTest.java
index ed1105bfd..fd5019d74 100644
--- a/shenyu-plugin/shenyu-plugin-mock/src/test/java/org/apache/shenyu/plugin/mock/generator/RandomDoubleGeneratorTest.java
+++ b/shenyu-plugin/shenyu-plugin-mock/src/test/java/org/apache/shenyu/plugin/mock/generator/RandomDoubleGeneratorTest.java
@@ -33,9 +33,9 @@ public final class RandomDoubleGeneratorTest {
 
     @Test
     public void generate() {
-        String doubleValue = generator.generate("double|10.5-12.0");
+        String doubleValue = generator.generate("double|10.5-12.0", null);
         assertNotNull(doubleValue);
-        String formated = generator.generate("double|10.5-12.0|¥%.2f");
+        String formated = generator.generate("double|10.5-12.0|¥%.2f", null);
         assertAll(
             () -> assertNotNull(formated),
             () -> assertTrue(formated.matches("^¥\\d+.\\d{2}$"))
diff --git a/shenyu-plugin/shenyu-plugin-mock/src/test/java/org/apache/shenyu/plugin/mock/generator/RandomIntGeneratorTest.java b/shenyu-plugin/shenyu-plugin-mock/src/test/java/org/apache/shenyu/plugin/mock/generator/RandomIntGeneratorTest.java
index 22b3d0bbe..fcd1c8209 100644
--- a/shenyu-plugin/shenyu-plugin-mock/src/test/java/org/apache/shenyu/plugin/mock/generator/RandomIntGeneratorTest.java
+++ b/shenyu-plugin/shenyu-plugin-mock/src/test/java/org/apache/shenyu/plugin/mock/generator/RandomIntGeneratorTest.java
@@ -35,7 +35,7 @@ public final class RandomIntGeneratorTest {
     public void generate() {
         int min = 10;
         int max = 15;
-        Integer generate = generator.generate(String.format("int|%d-%d", min, max));
+        Integer generate = generator.generate(String.format("int|%d-%d", min, max), null);
         assertTrue(Objects.nonNull(generate) && generate >= min && generate <= max);
     }
 
diff --git a/shenyu-plugin/shenyu-plugin-mock/src/test/java/org/apache/shenyu/plugin/mock/generator/RangeDataGeneratorTest.java b/shenyu-plugin/shenyu-plugin-mock/src/test/java/org/apache/shenyu/plugin/mock/generator/RangeDataGeneratorTest.java
index 6925a16eb..89b462622 100644
--- a/shenyu-plugin/shenyu-plugin-mock/src/test/java/org/apache/shenyu/plugin/mock/generator/RangeDataGeneratorTest.java
+++ b/shenyu-plugin/shenyu-plugin-mock/src/test/java/org/apache/shenyu/plugin/mock/generator/RangeDataGeneratorTest.java
@@ -33,13 +33,13 @@ public final class RangeDataGeneratorTest {
 
     @Test
     public void generate() {
-        String rangeData = generator.generate("list|[shenyu,gateway]");
+        String rangeData = generator.generate("list|[shenyu,gateway]", null);
         assertTrue(Objects.equals("shenyu", rangeData) || Objects.equals("gateway", rangeData));
     }
 
     @Test
     public void testListDataContainComma() {
-        String rangeData = generator.generate("list|[shen\\,yu,gate\\,way]");
+        String rangeData = generator.generate("list|[shen\\,yu,gate\\,way]", null);
         assertTrue(Objects.equals("shen,yu", rangeData) || Objects.equals("gate,way", rangeData));
     }
 
diff --git a/shenyu-plugin/shenyu-plugin-mock/src/test/java/org/apache/shenyu/plugin/mock/generator/ZhStringGeneratorTest.java b/shenyu-plugin/shenyu-plugin-mock/src/test/java/org/apache/shenyu/plugin/mock/generator/ZhStringGeneratorTest.java
index aa91a18ff..2f726f95b 100644
--- a/shenyu-plugin/shenyu-plugin-mock/src/test/java/org/apache/shenyu/plugin/mock/generator/ZhStringGeneratorTest.java
+++ b/shenyu-plugin/shenyu-plugin-mock/src/test/java/org/apache/shenyu/plugin/mock/generator/ZhStringGeneratorTest.java
@@ -35,7 +35,7 @@ public final class ZhStringGeneratorTest {
     public void generate() {
         int minLength = 10;
         int maxLength = 20;
-        String generate = generator.generate(String.format("zh|%d-%d", minLength, maxLength));
+        String generate = generator.generate(String.format("zh|%d-%d", minLength, maxLength), null);
         assertTrue(
                 generate != null && generate.length() >= minLength && generate.length() <= maxLength);
     }