add service test util
diff --git a/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/common/util/ServiceTestUtil.java b/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/common/util/ServiceTestUtil.java
index f469f70..1d1dab6 100644
--- a/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/common/util/ServiceTestUtil.java
+++ b/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/common/util/ServiceTestUtil.java
@@ -17,6 +17,7 @@
 
 package org.apache.dubbo.admin.common.util;
 
+import org.apache.commons.lang3.StringUtils;
 import org.apache.dubbo.admin.model.domain.MethodMetadata;
 import org.apache.dubbo.admin.model.dto.MethodDTO;
 import org.apache.dubbo.metadata.definition.model.FullServiceDefinition;
@@ -25,9 +26,13 @@
 import org.apache.dubbo.metadata.definition.model.TypeDefinition;
 
 import java.util.*;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 import java.util.stream.Collectors;
 
 public class ServiceTestUtil {
+    private static Pattern COLLECTION_PATTERN = Pattern.compile("^java\\.util\\..*(Set|List|Queue|Collection|Deque)(<.*>)*$");
+    private static Pattern MAP_PATTERN = Pattern.compile("^java\\.util\\..*Map.*(<.*>)*$");
 
     public static boolean sameMethod(MethodDefinition m, MethodDTO methodDTO) {
         return (m.getName().equals(methodDTO.getName())
@@ -47,7 +52,8 @@
         return methodMetadata;
     }
 
-    private static boolean isPrimitiveType(String type) {
+    private static boolean isPrimitiveType(TypeDefinition td) {
+        String type = td.getType();
         return type.equals("byte") || type.equals("java.lang.Byte") ||
                 type.equals("short") || type.equals("java.lang.Short") ||
                 type.equals("int") || type.equals("java.lang.Integer") ||
@@ -64,14 +70,8 @@
     private static List generateParameterTypes(String[] parameterTypes, ServiceDefinition serviceDefinition) {
         List parameters = new ArrayList();
         for (String type : parameterTypes) {
-            if (isPrimitiveType(type)) {
-                generatePrimitiveType(parameters, type);
-            } else {
-                TypeDefinition typeDefinition = findTypeDefinition(serviceDefinition, type);
-                Map<String, Object> holder = new HashMap<>();
-                generateComplexType(holder, typeDefinition);
-                parameters.add(holder);
-            }
+            Object result = generateType(serviceDefinition, type);
+            parameters.add(result);
         }
         return parameters;
     }
@@ -82,28 +82,131 @@
                 .findFirst().orElse(new TypeDefinition(type));
     }
 
-    private static void generateComplexType(Map<String, Object> holder, TypeDefinition td) {
+    private static void generateComplexType(ServiceDefinition sd, TypeDefinition td, Map holder) {
         for (Map.Entry<String, TypeDefinition> entry : td.getProperties().entrySet()) {
-            String type = entry.getValue().getType();
-            if (isPrimitiveType(type)) {
-                holder.put(entry.getKey(), type);
+            if (isPrimitiveType(td)) {
+                holder.put(entry.getKey(), td.getType());
             } else {
-                generateEnclosedType(holder, entry.getKey(), entry.getValue());
+                generateEnclosedType(holder, entry.getKey(), sd, entry.getValue());
             }
         }
     }
-
-    private static void generatePrimitiveType(List parameters, String type) {
-        parameters.add(type);
+    private static Object generateComplexType(ServiceDefinition sd, TypeDefinition td) {
+        Map<String, Object> holder = new HashMap<>();
+        generateComplexType(sd, td, holder);
+        return holder;
     }
 
-    private static void generateEnclosedType(Map<String, Object> holder, String key, TypeDefinition typeDefinition) {
-        if (typeDefinition.getProperties() == null || typeDefinition.getProperties().size() == 0) {
-            holder.put(key, typeDefinition.getType());
+    private static boolean isMap(TypeDefinition td) {
+        String type = StringUtils.substringBefore(td.getType(), "<");
+        Matcher matcher = MAP_PATTERN.matcher(type);
+        return matcher.matches();
+    }
+
+    private static boolean isCollection(TypeDefinition td) {
+        String type = StringUtils.substringBefore(td.getType(), "<");
+        Matcher matcher = COLLECTION_PATTERN.matcher(type);
+        return matcher.matches();
+    }
+
+    private static boolean isArray(TypeDefinition td) {
+        return StringUtils.endsWith(td.getType(), "[]");
+    }
+
+    private static Object generatePrimitiveType(TypeDefinition td) {
+        String type = td.getType();
+        switch (type) {
+            case "byte":
+            case "java.lang.Byte":
+            case "short":
+            case "java.lang.Short":
+            case "int":
+            case "java.lang.Integer":
+            case "long":
+            case "java.lang.Long":
+                return 0;
+            case "float":
+            case "java.lang.Float":
+            case "double":
+            case "java.lang.Double":
+                return 0.0;
+            case "boolean":
+            case "java.lang.Boolean":
+                return true;
+            case "void":
+            case "java.lang.Void":
+                return null;
+            case "java.lang.String":
+                return "";
+            case "java.lang.Object":
+                return Collections.emptyMap();
+            case "java.util.Date":
+                return System.currentTimeMillis();
+            default:
+                return Collections.emptyMap();
+        }
+    }
+
+    private static Object generateType(ServiceDefinition sd, String type) {
+        TypeDefinition td = findTypeDefinition(sd, type);
+        return generateType(sd, td);
+    }
+
+    private static Object generateType(ServiceDefinition sd, TypeDefinition td) {
+        if (isPrimitiveType(td)) {
+            return generatePrimitiveType(td);
+        } else if (isMap(td)) {
+            return generateMapType(sd, td);
+        } else if (isArray(td)) {
+            return generateArrayType(sd, td);
+        } else if (isCollection(td)) {
+            return generateCollectionType(sd, td);
+        } else {
+            return generateComplexType(sd, td);
+        }
+    }
+
+    private static Object generateMapType(ServiceDefinition sd, TypeDefinition td) {
+        String keyType = StringUtils.substringAfter(td.getType(), "<");
+        keyType = StringUtils.substringBefore(keyType, ",");
+        keyType = StringUtils.strip(keyType);
+
+        Map<Object, Object> map = new HashMap<>();
+        // 生成 key 默认值
+        Object key = generateType(sd, keyType);
+
+        // 生成 value 默认值
+        String valueType = StringUtils.substringAfter(td.getType(), ",");
+        valueType = StringUtils.substringBefore(valueType, ">");
+        valueType = StringUtils.strip(valueType);
+        valueType = StringUtils.isNotEmpty(valueType) ? valueType : "java.lang.Object";
+        Object value = generateType(sd, valueType);
+        map.put(key, value);
+        return map;
+    }
+
+    private static Object generateCollectionType(ServiceDefinition sd, TypeDefinition td) {
+        String type = StringUtils.substringAfter(td.getType(), "<");
+        type = StringUtils.substringBefore(type, ">");
+        if (StringUtils.isEmpty(type)) {
+            // 如果 collection 类型未声明,则生成空 collection
+            return new Object[] {};
+        }
+        return new Object[]{generateType(sd, type)};
+
+    }
+    private static Object generateArrayType(ServiceDefinition sd, TypeDefinition td) {
+        String type = StringUtils.substringBeforeLast(td.getType(), "[]");
+        return new Object[]{generateType(sd, type)};
+    }
+
+    private static void generateEnclosedType(Map<String, Object> holder, String key, ServiceDefinition sd, TypeDefinition td) {
+        if (td.getProperties() == null || td.getProperties().size() == 0) {
+            holder.put(key, generateType(sd, td));
         } else {
             Map<String, Object> enclosedMap = new HashMap<>();
             holder.put(key, enclosedMap);
-            generateComplexType(enclosedMap, typeDefinition);
+            generateComplexType(sd, td, enclosedMap);
         }
     }
 }
diff --git a/dubbo-admin-frontend/src/router/index.js b/dubbo-admin-frontend/src/router/index.js
index 98507b8..866295a 100644
--- a/dubbo-admin-frontend/src/router/index.js
+++ b/dubbo-admin-frontend/src/router/index.js
@@ -19,7 +19,6 @@
 import Router from 'vue-router'
 import ServiceSearch from '@/components/ServiceSearch'
 import ServiceDetail from '@/components/ServiceDetail'
-import ServiceTest from '@/components/test/ServiceTest'
 import TestMethod from '@/components/test/TestMethod'
 import RoutingRule from '@/components/governance/RoutingRule'
 import TagRule from '@/components/governance/TagRule'