diff --git a/dynamic-config/config-apollo/pom.xml b/dynamic-config/config-apollo/pom.xml
index 69ac357..13487f9 100644
--- a/dynamic-config/config-apollo/pom.xml
+++ b/dynamic-config/config-apollo/pom.xml
@@ -40,10 +40,5 @@
       <groupId>org.springframework</groupId>
       <artifactId>spring-web</artifactId>
     </dependency>
-    <dependency>
-      <groupId>org.jmockit</groupId>
-      <artifactId>jmockit</artifactId>
-      <scope>test</scope>
-    </dependency>
   </dependencies>
 </project>
diff --git a/dynamic-config/config-apollo/src/main/java/org/apache/servicecomb/config/client/ApolloClient.java b/dynamic-config/config-apollo/src/main/java/org/apache/servicecomb/config/client/ApolloClient.java
index d838d34..9dc040c 100644
--- a/dynamic-config/config-apollo/src/main/java/org/apache/servicecomb/config/client/ApolloClient.java
+++ b/dynamic-config/config-apollo/src/main/java/org/apache/servicecomb/config/client/ApolloClient.java
@@ -29,6 +29,7 @@
 import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.TimeUnit;
 
+import com.google.common.annotations.VisibleForTesting;
 import org.apache.servicecomb.config.archaius.sources.ApolloConfigurationSourceImpl.UpdateHandler;
 import org.apache.servicecomb.foundation.common.utils.JsonUtils;
 import org.slf4j.Logger;
@@ -77,6 +78,16 @@
     this.updateHandler = updateHandler;
   }
 
+  @VisibleForTesting
+  static Map<String, Object> getOriginalConfigMap() {
+    return originalConfigMap;
+  }
+
+  @VisibleForTesting
+  static void setRest(RestTemplate rest) {
+    ApolloClient.rest = rest;
+  }
+
   public void refreshApolloConfig() {
     EXECUTOR
         .scheduleWithFixedDelay(new ConfigRefresh(serviceUri), firstRefreshInterval, refreshInterval, TimeUnit.SECONDS);
diff --git a/dynamic-config/config-apollo/src/test/java/org/apache/servicecomb/config/client/ApolloClientTest.java b/dynamic-config/config-apollo/src/test/java/org/apache/servicecomb/config/client/ApolloClientTest.java
index 2d73b62..66ae6c1 100644
--- a/dynamic-config/config-apollo/src/test/java/org/apache/servicecomb/config/client/ApolloClientTest.java
+++ b/dynamic-config/config-apollo/src/test/java/org/apache/servicecomb/config/client/ApolloClientTest.java
@@ -35,8 +35,6 @@
 import org.springframework.http.ResponseEntity;
 import org.springframework.web.client.RestTemplate;
 
-import mockit.Deencapsulation;
-
 public class ApolloClientTest {
   @BeforeAll
   public static void setUpClass() {
@@ -48,6 +46,7 @@
   public void refreshApolloConfig() {
     ApolloConfig apolloConfig = ApolloConfig.INSTANCE;
     RestTemplate rest = Mockito.mock(RestTemplate.class);
+    ApolloClient.setRest(rest);
 
     ResponseEntity<String> responseEntity = new ResponseEntity<>(
         "{\"apollo\":\"mocked\", \"configurations\":{\"timeout\":1000}}", HttpStatus.OK);
@@ -59,12 +58,10 @@
     ApolloConfigurationSourceImpl impl = new ApolloConfigurationSourceImpl();
     UpdateHandler updateHandler = impl.new UpdateHandler();
     ApolloClient apolloClient = new ApolloClient(updateHandler);
-    Deencapsulation.setField(apolloClient, "rest", rest);
     ConfigRefresh cr = apolloClient.new ConfigRefresh(apolloConfig.getServerUri());
     cr.run();
 
-    Map<String, Object> originMap = Deencapsulation.getField(apolloClient, "originalConfigMap");
-    Assertions.assertEquals(1, originMap.size());
+    Assertions.assertEquals(1, ApolloClient.getOriginalConfigMap().size());
   }
 
   @Test
diff --git a/dynamic-config/config-cc/pom.xml b/dynamic-config/config-cc/pom.xml
index 1a9edc2..cfc44b0 100644
--- a/dynamic-config/config-cc/pom.xml
+++ b/dynamic-config/config-cc/pom.xml
@@ -63,11 +63,6 @@
       <groupId>org.apache.servicecomb</groupId>
       <artifactId>config-center-client</artifactId>
     </dependency>
-    <dependency>
-      <groupId>org.jmockit</groupId>
-      <artifactId>jmockit</artifactId>
-      <scope>test</scope>
-    </dependency>
   </dependencies>
 
 </project>
diff --git a/dynamic-config/config-cc/src/test/java/org/apache/servicecomb/config/ConfigCenterConfigurationSourceImplTest.java b/dynamic-config/config-cc/src/test/java/org/apache/servicecomb/config/ConfigCenterConfigurationSourceImplTest.java
index dc0dbb0..a1466a5 100644
--- a/dynamic-config/config-cc/src/test/java/org/apache/servicecomb/config/ConfigCenterConfigurationSourceImplTest.java
+++ b/dynamic-config/config-cc/src/test/java/org/apache/servicecomb/config/ConfigCenterConfigurationSourceImplTest.java
@@ -29,8 +29,6 @@
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
 
-import mockit.Deencapsulation;
-
 class ConfigCenterConfigurationSourceImplTest {
 
   @Test
@@ -64,7 +62,7 @@
     AddressManager addressManager = new AddressManager("test", addresses, EventManager.getEventBus());
     addressManager.onRefreshEndpointEvent(event);
 
-    List<String> availableAZ = Deencapsulation.getField(addressManager, "availableZone");
+    List<String> availableAZ = addressManager.getAvailableZone();
     Assertions.assertEquals("https://127.0.0.1:30100/v3/test", availableAZ.get(0));
   }
 }
diff --git a/dynamic-config/config-cc/src/test/java/org/apache/servicecomb/config/center/client/AddressManagerTest.java b/dynamic-config/config-cc/src/test/java/org/apache/servicecomb/config/center/client/AddressManagerTest.java
index fc8c0c9..1e72e85 100644
--- a/dynamic-config/config-cc/src/test/java/org/apache/servicecomb/config/center/client/AddressManagerTest.java
+++ b/dynamic-config/config-cc/src/test/java/org/apache/servicecomb/config/center/client/AddressManagerTest.java
@@ -28,8 +28,6 @@
 
 import com.google.common.eventbus.EventBus;
 
-import mockit.Deencapsulation;
-
 class AddressManagerTest {
   private static final List<String> addresses = new ArrayList<>();
 
@@ -47,7 +45,7 @@
     Assertions.assertNotNull(addressManager1);
     Assertions.assertNotNull(addressManager2);
 
-    List<String> addresses = Deencapsulation.getField(addressManager1, "addresses");
+    List<String> addresses = addressManager1.getAddresses();
     Assertions.assertEquals(2, addresses.size());
     Assertions.assertEquals("http://127.0.0.1:30103/v3/project", addresses.get(0));
 
@@ -69,10 +67,10 @@
     RefreshEndpointEvent event = new RefreshEndpointEvent(zoneAndRegion, "CseConfigCenter");
     addressManager1.refreshEndpoint(event, "CseConfigCenter");
 
-    List<String> availableZone = Deencapsulation.getField(addressManager1, "availableZone");
+    List<String> availableZone = addressManager1.getAvailableZone();
     Assertions.assertEquals("http://127.0.0.3:30100/v3/project", availableZone.get(0));
 
-    List<String> availableRegion = Deencapsulation.getField(addressManager1, "availableRegion");
+    List<String> availableRegion = addressManager1.getAvailableRegion();
     Assertions.assertEquals("http://127.0.0.4:30100/v3/project", availableRegion.get(0));
 
     Assertions.assertEquals("http://127.0.0.3:30100/v3/project", addressManager1.address());
diff --git a/dynamic-config/config-nacos/pom.xml b/dynamic-config/config-nacos/pom.xml
index bf12272..1f279d0 100644
--- a/dynamic-config/config-nacos/pom.xml
+++ b/dynamic-config/config-nacos/pom.xml
@@ -41,10 +41,5 @@
       <groupId>com.alibaba.nacos</groupId>
       <artifactId>nacos-client</artifactId>
     </dependency>
-    <dependency>
-      <groupId>org.jmockit</groupId>
-      <artifactId>jmockit</artifactId>
-      <scope>test</scope>
-    </dependency>
   </dependencies>
 </project>
diff --git a/dynamic-config/config-nacos/src/main/java/org/apache/servicecomb/config/nacos/archaius/sources/NacosConfigurationSourceImpl.java b/dynamic-config/config-nacos/src/main/java/org/apache/servicecomb/config/nacos/archaius/sources/NacosConfigurationSourceImpl.java
index abed303..528553c 100644
--- a/dynamic-config/config-nacos/src/main/java/org/apache/servicecomb/config/nacos/archaius/sources/NacosConfigurationSourceImpl.java
+++ b/dynamic-config/config-nacos/src/main/java/org/apache/servicecomb/config/nacos/archaius/sources/NacosConfigurationSourceImpl.java
@@ -27,6 +27,7 @@
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.CopyOnWriteArrayList;
 
+import com.google.common.annotations.VisibleForTesting;
 import org.apache.commons.configuration.Configuration;
 import org.apache.servicecomb.config.ConfigMapping;
 import org.apache.servicecomb.config.nacos.client.ConfigurationAction;
@@ -52,6 +53,11 @@
 
   private final UpdateHandler updateHandler = new UpdateHandler();
 
+  @VisibleForTesting
+  UpdateHandler getUpdateHandler() {
+    return updateHandler;
+  }
+
   @Override
   public int getOrder() {
     return ORDER_BASE * 4;
diff --git a/dynamic-config/config-nacos/src/test/java/org/apache/servicecomb/config/nacos/archaius/sources/NacosConfigurationSourceImplTest.java b/dynamic-config/config-nacos/src/test/java/org/apache/servicecomb/config/nacos/archaius/sources/NacosConfigurationSourceImplTest.java
index f388fcb..aa51be7 100644
--- a/dynamic-config/config-nacos/src/test/java/org/apache/servicecomb/config/nacos/archaius/sources/NacosConfigurationSourceImplTest.java
+++ b/dynamic-config/config-nacos/src/test/java/org/apache/servicecomb/config/nacos/archaius/sources/NacosConfigurationSourceImplTest.java
@@ -28,27 +28,25 @@
 
 import com.netflix.config.WatchedUpdateListener;
 
-import mockit.Deencapsulation;
-
 public class NacosConfigurationSourceImplTest {
   @Test
   public void testCreate() throws Exception {
     NacosConfigurationSourceImpl nacosConfigurationSource = new NacosConfigurationSourceImpl();
     nacosConfigurationSource.addUpdateListener(result -> Assertions.assertFalse(result.getAdded().isEmpty()));
-    UpdateHandler udateHandler = Deencapsulation.getField(nacosConfigurationSource, UpdateHandler.class);
+    UpdateHandler updateHandler = nacosConfigurationSource.getUpdateHandler();
     Map<String, Object> createItems = new HashMap<>();
     createItems.put("nacosTestKey", "testValue");
-    udateHandler.handle(ConfigurationAction.CREATE, createItems);
+    updateHandler.handle(ConfigurationAction.CREATE, createItems);
   }
 
   @Test
   public void testUpdate() throws Exception {
     NacosConfigurationSourceImpl nacosConfigurationSource = new NacosConfigurationSourceImpl();
     nacosConfigurationSource.addUpdateListener(result -> Assertions.assertFalse(result.getChanged().isEmpty()));
-    UpdateHandler udateHandler = Deencapsulation.getField(nacosConfigurationSource, UpdateHandler.class);
+    UpdateHandler updateHandler = nacosConfigurationSource.getUpdateHandler();
     Map<String, Object> updateItems = new HashMap<>();
     updateItems.put("nacosTestKey", "testValue");
-    udateHandler.handle(ConfigurationAction.SET, updateItems);
+    updateHandler.handle(ConfigurationAction.SET, updateItems);
 
   }
 
@@ -56,12 +54,12 @@
   public void testDelete() throws Exception {
     NacosConfigurationSourceImpl nacosConfigurationSource = new NacosConfigurationSourceImpl();
     nacosConfigurationSource.addUpdateListener(result -> Assertions.assertFalse(result.getDeleted().isEmpty()));
-    UpdateHandler udateHandler = Deencapsulation.getField(nacosConfigurationSource, UpdateHandler.class);
+    UpdateHandler updateHandler = nacosConfigurationSource.getUpdateHandler();
     Map<String, Object> deleteItems = new HashMap<>();
     deleteItems.put("nacosTestKey", "testValue");
 
     nacosConfigurationSource.getCurrentData().put("nacosTestKey", "testValue");
-    udateHandler.handle(ConfigurationAction.DELETE, deleteItems);
+    updateHandler.handle(ConfigurationAction.DELETE, deleteItems);
     Assertions.assertTrue(nacosConfigurationSource.getCurrentData().isEmpty());
   }
 
diff --git a/dynamic-config/config-nacos/src/test/java/org/apache/servicecomb/config/nacos/client/NacosClientTest.java b/dynamic-config/config-nacos/src/test/java/org/apache/servicecomb/config/nacos/client/NacosClientTest.java
index 4b82a8f..3a49bbc 100644
--- a/dynamic-config/config-nacos/src/test/java/org/apache/servicecomb/config/nacos/client/NacosClientTest.java
+++ b/dynamic-config/config-nacos/src/test/java/org/apache/servicecomb/config/nacos/client/NacosClientTest.java
@@ -23,7 +23,6 @@
 import org.apache.servicecomb.config.ConfigUtil;
 import org.apache.servicecomb.config.nacos.archaius.sources.NacosConfigurationSourceImpl;
 import org.apache.servicecomb.config.nacos.archaius.sources.NacosConfigurationSourceImpl.UpdateHandler;
-import mockit.Deencapsulation;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.Test;
@@ -35,20 +34,6 @@
   }
 
   @Test
-  public void refreshNacosConfig() {
-
-    NacosConfigurationSourceImpl impl = new NacosConfigurationSourceImpl();
-    UpdateHandler updateHandler = impl.new UpdateHandler();
-    NacosClient nacosClient = new NacosClient(updateHandler);
-    //before open this code,you need to start nacos-console first
-    //and make sure the address is 127.0.0.1:8848
-    //nacosClient.refreshNacosConfig();
-    Map<String, Object> originMap = Deencapsulation.getField(nacosClient, "originalConfigMap");
-    originMap.put("nacos", "12345");
-    Assertions.assertEquals(1, originMap.size());
-  }
-
-  @Test
   public void testCompareChangedConfig() {
     boolean status = true;
     Map<String, Object> before = new HashMap<>();
