migrate edge-core to mockito (#3313)

diff --git a/edge/edge-core/pom.xml b/edge/edge-core/pom.xml
index 03d5f90..e5892ff 100644
--- a/edge/edge-core/pom.xml
+++ b/edge/edge-core/pom.xml
@@ -62,8 +62,8 @@
       <scope>test</scope>
     </dependency>
     <dependency>
-      <groupId>org.jmockit</groupId>
-      <artifactId>jmockit</artifactId>
+      <groupId>org.mockito</groupId>
+      <artifactId>mockito-inline</artifactId>
       <scope>test</scope>
     </dependency>
   </dependencies>
diff --git a/edge/edge-core/src/main/java/org/apache/servicecomb/edge/core/URLMappedEdgeDispatcher.java b/edge/edge-core/src/main/java/org/apache/servicecomb/edge/core/URLMappedEdgeDispatcher.java
index 3cff759..baac1b2 100644
--- a/edge/edge-core/src/main/java/org/apache/servicecomb/edge/core/URLMappedEdgeDispatcher.java
+++ b/edge/edge-core/src/main/java/org/apache/servicecomb/edge/core/URLMappedEdgeDispatcher.java
@@ -20,6 +20,7 @@
 import java.util.HashMap;
 import java.util.Map;
 
+import com.google.common.annotations.VisibleForTesting;
 import io.vertx.ext.web.handler.PlatformHandler;
 import org.apache.servicecomb.transport.rest.vertx.RestBodyHandler;
 import org.slf4j.Logger;
@@ -57,6 +58,11 @@
     }
   }
 
+  @VisibleForTesting
+  public Map<String, URLMappedConfigurationItem> getConfigurations() {
+    return configurations;
+  }
+
   @Override
   public int getOrder() {
     return DynamicPropertyFactory.getInstance().getIntProperty(KEY_ORDER, 30_000).get();
diff --git a/edge/edge-core/src/test/java/org/apache/servicecomb/edge/core/TestAbstractEdgeDispatcher.java b/edge/edge-core/src/test/java/org/apache/servicecomb/edge/core/TestAbstractEdgeDispatcher.java
index dc67268..06275aa 100644
--- a/edge/edge-core/src/test/java/org/apache/servicecomb/edge/core/TestAbstractEdgeDispatcher.java
+++ b/edge/edge-core/src/test/java/org/apache/servicecomb/edge/core/TestAbstractEdgeDispatcher.java
@@ -17,9 +17,6 @@
 
 package org.apache.servicecomb.edge.core;
 
-import java.util.HashMap;
-import java.util.Map;
-
 import org.apache.servicecomb.foundation.test.scaffolding.exception.RuntimeExceptionWithoutStackTrace;
 import org.apache.servicecomb.swagger.invocation.exception.InvocationException;
 import org.junit.Test;
@@ -27,11 +24,7 @@
 import io.vertx.core.http.HttpServerResponse;
 import io.vertx.ext.web.Router;
 import io.vertx.ext.web.RoutingContext;
-import mockit.Expectations;
-import mockit.Mock;
-import mockit.MockUp;
-import mockit.Mocked;
-import org.junit.jupiter.api.Assertions;
+import org.mockito.Mockito;
 
 public class TestAbstractEdgeDispatcher {
   static class AbstractEdgeDispatcherForTest extends AbstractEdgeDispatcher {
@@ -46,51 +39,25 @@
   }
 
   @Test
-  public void onFailure(@Mocked RoutingContext context) {
-    Map<String, Object> map = new HashMap<>();
-    HttpServerResponse response = new MockUp<HttpServerResponse>() {
-      @Mock
-      HttpServerResponse setStatusCode(int statusCode) {
-        map.put("code", statusCode);
-        return null;
-      }
+  public void onFailure() {
+    RoutingContext context = Mockito.mock(RoutingContext.class);
 
-      @Mock
-      HttpServerResponse setStatusMessage(String statusMessage) {
-        map.put("msg", statusMessage);
-        return null;
-      }
-    }.getMockInstance();
+    HttpServerResponse response = Mockito.mock(HttpServerResponse.class);
 
-    new Expectations() {
-      {
-        context.failure();
-        returns(new RuntimeExceptionWithoutStackTrace("failed"), null);
-        context.response();
-        result = response;
-      }
-    };
+    Mockito.when(context.response()).thenReturn(response);
+    Mockito.when(context.failure()).thenReturn(new RuntimeExceptionWithoutStackTrace("failed"));
 
     AbstractEdgeDispatcherForTest dispatcher = new AbstractEdgeDispatcherForTest();
     dispatcher.onFailure(context);
 
-    Assertions.assertEquals(502, map.get("code"));
-    Assertions.assertEquals("Bad Gateway", map.get("msg"));
+    Mockito.verify(response).setStatusMessage("Bad Gateway");
+    Mockito.verify(response).setStatusCode(502);
 
-    new Expectations() {
-      {
-        context.failure();
-        returns(new InvocationException(401, "unauthorized", "unauthorized"),
-            new InvocationException(401, "unauthorized", "unauthorized"));
-        context.response();
-        result = response;
-      }
-    };
+    Mockito.when(context.failure()).thenReturn(new InvocationException(401, "unauthorized", "unauthorized"));
 
     dispatcher = new AbstractEdgeDispatcherForTest();
     dispatcher.onFailure(context);
-
-    Assertions.assertEquals(401, map.get("code"));
-    Assertions.assertEquals("unauthorized", map.get("msg"));
+    Mockito.verify(response).setStatusMessage("unauthorized");
+    Mockito.verify(response).setStatusCode(401);
   }
 }
diff --git a/edge/edge-core/src/test/java/org/apache/servicecomb/edge/core/TestDefaultEdgeDispatcher.java b/edge/edge-core/src/test/java/org/apache/servicecomb/edge/core/TestDefaultEdgeDispatcher.java
index e367a3d..ff1aa62 100644
--- a/edge/edge-core/src/test/java/org/apache/servicecomb/edge/core/TestDefaultEdgeDispatcher.java
+++ b/edge/edge-core/src/test/java/org/apache/servicecomb/edge/core/TestDefaultEdgeDispatcher.java
@@ -20,21 +20,22 @@
 import static org.apache.servicecomb.edge.core.DefaultEdgeDispatcher.MICROSERVICE_NAME;
 import static org.apache.servicecomb.edge.core.DefaultEdgeDispatcher.VERSION;
 
-import org.apache.servicecomb.core.SCBEngine;
+import io.vertx.core.Context;
+import io.vertx.core.Vertx;
+import io.vertx.core.buffer.Buffer;
+import io.vertx.ext.web.RequestBody;
 import org.apache.servicecomb.foundation.test.scaffolding.config.ArchaiusUtils;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
 
-import io.vertx.core.Handler;
 import io.vertx.core.http.HttpServerRequest;
 import io.vertx.ext.web.Route;
 import io.vertx.ext.web.Router;
 import io.vertx.ext.web.RoutingContext;
-import mockit.Deencapsulation;
-import mockit.Expectations;
-import mockit.Mocked;
 import org.junit.jupiter.api.Assertions;
+import org.mockito.MockedStatic;
+import org.mockito.Mockito;
 
 public class TestDefaultEdgeDispatcher {
   @Before
@@ -49,45 +50,42 @@
 
   @Test
   @SuppressWarnings("unchecked")
-  public void testOnRequest(@Mocked Router router, @Mocked Route route
-      , @Mocked RoutingContext context
-      , @Mocked HttpServerRequest requst
-      , @Mocked EdgeInvocation invocation) {
+  public void testOnRequest() {
     DefaultEdgeDispatcher dispatcher = new DefaultEdgeDispatcher() {
       @Override
       protected boolean isFilterChainEnabled() {
         return false;
       }
     };
-
-    new Expectations(SCBEngine.class) {
-      {
-        router.routeWithRegex(dispatcher.generateRouteRegex("api", true));
-        result = route;
-        route.handler((Handler<RoutingContext>) any);
-        result = route;
-        route.failureHandler((Handler<RoutingContext>) any);
-        result = route;
-        context.pathParam(MICROSERVICE_NAME);
-        result = "testService";
-        context.pathParam(VERSION);
-        result = "v1";
-        context.request();
-        result = requst;
-        requst.path();
-        result = "/api/testService/v1/hello";
-        invocation.setVersionRule("1.0.0.0-2.0.0.0");
-        invocation.init("testService", context, "/testService/v1/hello",
-            Deencapsulation.getField(dispatcher, "httpServerFilters"));
-        invocation.edgeInvoke();
-      }
-    };
+    Router router = Mockito.mock(Router.class);
+    Route route = Mockito.mock(Route.class);
+    RoutingContext context = Mockito.mock(RoutingContext.class);
+    EdgeInvocation invocation = Mockito.mock(EdgeInvocation.class);
+    dispatcher = Mockito.spy(dispatcher);
+    HttpServerRequest request = Mockito.mock(HttpServerRequest.class);
+    Mockito.when(router.routeWithRegex(dispatcher.generateRouteRegex("api", true))).thenReturn(route);
+    Mockito.when(route.handler(Mockito.any())).thenReturn(route);
+    Mockito.when(route.failureHandler(Mockito.any())).thenReturn(route);
+    RequestBody body = Mockito.mock(RequestBody.class);
+    Mockito.when(context.body()).thenReturn(body);
+    Mockito.when(body.buffer()).thenReturn(Mockito.mock(Buffer.class));
+    Mockito.when(context.pathParam(MICROSERVICE_NAME)).thenReturn("testService");
+    Mockito.when(context.pathParam(VERSION)).thenReturn("v1");
+    Mockito.when(context.request()).thenReturn(request);
+    Mockito.when(request.path()).thenReturn("/api/testService/v1/hello");
+    Mockito.when(dispatcher.createEdgeInvocation()).thenReturn(invocation);
+    invocation.setVersionRule("2.0.0+");
+    invocation.init("serviceName", context, "/c/d/e", dispatcher.getHttpServerFilters());
+    Mockito.doNothing().when(invocation).edgeInvoke();
     dispatcher.init(router);
     Assertions.assertFalse(dispatcher.enabled());
     Assertions.assertEquals(Utils.findActualPath("/api/test", 1), "/test");
     Assertions.assertEquals(dispatcher.getOrder(), 20000);
 
-    dispatcher.onRequest(context);
-    // assert done in expectations.
+    try (MockedStatic<Vertx> vertxMockedStatic = Mockito.mockStatic(Vertx.class)) {
+      vertxMockedStatic.when(Vertx::currentContext).thenReturn(Mockito.mock(Context.class));
+      dispatcher.onRequest(context);
+      // assert done in expectations.
+    }
   }
 }
diff --git a/edge/edge-core/src/test/java/org/apache/servicecomb/edge/core/TestURLMappedEdgeDispatcher.java b/edge/edge-core/src/test/java/org/apache/servicecomb/edge/core/TestURLMappedEdgeDispatcher.java
index 1995768..c68f83e 100644
--- a/edge/edge-core/src/test/java/org/apache/servicecomb/edge/core/TestURLMappedEdgeDispatcher.java
+++ b/edge/edge-core/src/test/java/org/apache/servicecomb/edge/core/TestURLMappedEdgeDispatcher.java
@@ -19,6 +19,10 @@
 
 import java.util.Map;
 
+import io.vertx.core.Context;
+import io.vertx.core.Vertx;
+import io.vertx.core.buffer.Buffer;
+import io.vertx.ext.web.RequestBody;
 import org.apache.servicecomb.foundation.test.scaffolding.config.ArchaiusUtils;
 import org.apache.servicecomb.transport.rest.vertx.RestBodyHandler;
 import org.junit.After;
@@ -27,10 +31,9 @@
 
 import io.vertx.core.http.HttpServerRequest;
 import io.vertx.ext.web.RoutingContext;
-import mockit.Deencapsulation;
-import mockit.Expectations;
-import mockit.Mocked;
 import org.junit.jupiter.api.Assertions;
+import org.mockito.MockedStatic;
+import org.mockito.Mockito;
 
 public class TestURLMappedEdgeDispatcher {
   @Before
@@ -43,30 +46,24 @@
   }
 
   @Test
-  public void testConfigurations(@Mocked RoutingContext context
-      , @Mocked HttpServerRequest requst
-      , @Mocked EdgeInvocation invocation) {
+  public void testConfigurations() {
     ArchaiusUtils.setProperty("servicecomb.http.dispatcher.edge.url.enabled", true);
 
     URLMappedEdgeDispatcher dispatcher = new URLMappedEdgeDispatcher();
-    Map<String, URLMappedConfigurationItem> items = Deencapsulation
-        .getField(dispatcher, "configurations");
+    Map<String, URLMappedConfigurationItem> items = dispatcher.getConfigurations();
     Assertions.assertEquals(items.size(), 0);
 
-    new Expectations() {
-      {
-        context.get(RestBodyHandler.BYPASS_BODY_HANDLER);
-        result = Boolean.TRUE;
-        context.next();
-      }
-    };
+    RoutingContext context = Mockito.mock(RoutingContext.class);
+    HttpServerRequest request = Mockito.mock(HttpServerRequest.class);
+    EdgeInvocation invocation = Mockito.mock(EdgeInvocation.class);
+    Mockito.when(context.get(RestBodyHandler.BYPASS_BODY_HANDLER)).thenReturn(Boolean.TRUE);
     dispatcher.onRequest(context);
 
     ArchaiusUtils.setProperty("servicecomb.http.dispatcher.edge.url.mappings.service1.path", "/a/b/c/.*");
     ArchaiusUtils.setProperty("servicecomb.http.dispatcher.edge.url.mappings.service1.microserviceName", "serviceName");
     ArchaiusUtils.setProperty("servicecomb.http.dispatcher.edge.url.mappings.service1.prefixSegmentCount", 2);
     ArchaiusUtils.setProperty("servicecomb.http.dispatcher.edge.url.mappings.service1.versionRule", "2.0.0+");
-    items = Deencapsulation.getField(dispatcher, "configurations");
+    items = dispatcher.getConfigurations();
     Assertions.assertEquals(items.size(), 1);
     URLMappedConfigurationItem item = items.get("service1");
     Assertions.assertEquals(item.getMicroserviceName(), "serviceName");
@@ -76,7 +73,7 @@
 
     ArchaiusUtils.setProperty("servicecomb.http.dispatcher.edge.url.mappings.service2.versionRule", "2.0.0+");
     ArchaiusUtils.setProperty("servicecomb.http.dispatcher.edge.url.mappings.service3.path", "/b/c/d/.*");
-    items = Deencapsulation.getField(dispatcher, "configurations");
+    items = dispatcher.getConfigurations();
     Assertions.assertEquals(items.size(), 1);
     item = items.get("service1");
     Assertions.assertEquals(item.getMicroserviceName(), "serviceName");
@@ -85,23 +82,21 @@
     Assertions.assertEquals(item.getVersionRule(), "2.0.0+");
 
     URLMappedConfigurationItem finalItem = item;
-    new Expectations() {
-      {
-        context.get(RestBodyHandler.BYPASS_BODY_HANDLER);
-        result = Boolean.FALSE;
-        context.get(URLMappedEdgeDispatcher.CONFIGURATION_ITEM);
-        result = finalItem;
-
-        context.request();
-        result = requst;
-        requst.path();
-        result = "/a/b/c/d/e";
-        invocation.setVersionRule("2.0.0+");
-        invocation.init("serviceName", context, "/c/d/e",
-            Deencapsulation.getField(dispatcher, "httpServerFilters"));
-        invocation.edgeInvoke();
-      }
-    };
-    dispatcher.onRequest(context);
+    try (MockedStatic<Vertx> vertxMockedStatic = Mockito.mockStatic(Vertx.class)) {
+      vertxMockedStatic.when(Vertx::currentContext).thenReturn(Mockito.mock(Context.class));
+      dispatcher = Mockito.spy(dispatcher);
+      RequestBody body = Mockito.mock(RequestBody.class);
+      Mockito.when(context.body()).thenReturn(body);
+      Mockito.when(body.buffer()).thenReturn(Mockito.mock(Buffer.class));
+      Mockito.when(context.get(RestBodyHandler.BYPASS_BODY_HANDLER)).thenReturn(Boolean.FALSE);
+      Mockito.when(context.get(URLMappedEdgeDispatcher.CONFIGURATION_ITEM)).thenReturn(finalItem);
+      Mockito.when(context.request()).thenReturn(request);
+      Mockito.when(request.path()).thenReturn("/a/b/c/d/e");
+      Mockito.when(dispatcher.createEdgeInvocation()).thenReturn(invocation);
+      invocation.setVersionRule("2.0.0+");
+      invocation.init("serviceName", context, "/c/d/e", dispatcher.getHttpServerFilters());
+      Mockito.doNothing().when(invocation).edgeInvoke();
+      dispatcher.onRequest(context);
+    }
   }
 }
diff --git a/transports/transport-rest/transport-rest-vertx/src/main/java/org/apache/servicecomb/transport/rest/vertx/AbstractVertxHttpDispatcher.java b/transports/transport-rest/transport-rest-vertx/src/main/java/org/apache/servicecomb/transport/rest/vertx/AbstractVertxHttpDispatcher.java
index d87d4f2..372fbe1 100644
--- a/transports/transport-rest/transport-rest-vertx/src/main/java/org/apache/servicecomb/transport/rest/vertx/AbstractVertxHttpDispatcher.java
+++ b/transports/transport-rest/transport-rest-vertx/src/main/java/org/apache/servicecomb/transport/rest/vertx/AbstractVertxHttpDispatcher.java
@@ -19,6 +19,7 @@
 
 import java.util.List;
 
+import com.google.common.annotations.VisibleForTesting;
 import org.apache.servicecomb.common.rest.UploadConfig;
 import org.apache.servicecomb.common.rest.filter.HttpServerFilter;
 import org.apache.servicecomb.foundation.common.utils.SPIServiceUtils;
@@ -32,6 +33,11 @@
 
   protected List<HttpServerFilter> httpServerFilters = SPIServiceUtils.getSortedService(HttpServerFilter.class);
 
+  @VisibleForTesting
+  public List<HttpServerFilter> getHttpServerFilters() {
+    return httpServerFilters;
+  }
+
   protected BodyHandler createBodyHandler() {
     RestBodyHandler bodyHandler = new RestBodyHandler();