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 aaad59f27 [type:test] zookeeper client test. (#3988)
aaad59f27 is described below

commit aaad59f27baac5619c5b81b4b6617b5cd776ca23
Author: yunlongn <[email protected]>
AuthorDate: Sat Sep 24 14:34:30 2022 +0800

    [type:test] zookeeper client test. (#3988)
    
    * [type:test] zookeeper client test .
    
    * [type:test] zookeeper client test.
    
    * [type:test] zookeeper client test.
    
    * [type:test] zookeeper client test.
---
 .../server/zookeeper/ZookeeperClientTest.java      | 218 +++++------
 .../ZookeeperServerRegisterRepositoryTest.java     | 152 ++++----
 .../ZookeeperClientRegisterRepositoryTest.java     | 126 +++---
 .../client/zookeeper/ZookeeperClientTest.java      | 244 +++++-------
 .../instance/zookeeper/ZookeeperClientTest.java    | 187 +++++----
 .../ZookeeperInstanceRegisterRepositoryTest.java   |  71 ++--
 .../sync/data/zookeeper/ZookeeperClientTest.java   | 235 ++++++------
 .../zookeeper/ZookeeperSyncDataServiceTest.java    | 422 ++++-----------------
 8 files changed, 649 insertions(+), 1006 deletions(-)

diff --git 
a/shenyu-register-center/shenyu-register-client-server/shenyu-register-client-server-zookeeper/src/test/java/org/apache/shenyu/register/client/server/zookeeper/ZookeeperClientTest.java
 
b/shenyu-register-center/shenyu-register-client-server/shenyu-register-client-server-zookeeper/src/test/java/org/apache/shenyu/register/client/server/zookeeper/ZookeeperClientTest.java
index de56445b1..61647ce93 100644
--- 
a/shenyu-register-center/shenyu-register-client-server/shenyu-register-client-server-zookeeper/src/test/java/org/apache/shenyu/register/client/server/zookeeper/ZookeeperClientTest.java
+++ 
b/shenyu-register-center/shenyu-register-client-server/shenyu-register-client-server-zookeeper/src/test/java/org/apache/shenyu/register/client/server/zookeeper/ZookeeperClientTest.java
@@ -18,52 +18,81 @@
 package org.apache.shenyu.register.client.server.zookeeper;
 
 import org.apache.curator.framework.CuratorFramework;
+import org.apache.curator.framework.CuratorFrameworkFactory;
+import org.apache.curator.framework.api.ACLBackgroundPathAndBytesable;
+import org.apache.curator.framework.api.BackgroundVersionable;
+import org.apache.curator.framework.api.ChildrenDeletable;
+import org.apache.curator.framework.api.CreateBuilder;
+import org.apache.curator.framework.api.CreateBuilder2;
+import org.apache.curator.framework.api.DeleteBuilder;
+import org.apache.curator.framework.api.GetChildrenBuilder;
+import org.apache.curator.framework.api.GetDataBuilder;
+import 
org.apache.curator.framework.api.ProtectACLCreateModeStatPathAndBytesable;
+import org.apache.curator.framework.imps.ExistsBuilderImpl;
 import org.apache.curator.framework.recipes.cache.TreeCache;
-import org.apache.curator.framework.recipes.cache.TreeCacheEvent;
 import org.apache.curator.framework.recipes.cache.TreeCacheListener;
-import org.apache.curator.test.TestingServer;
-import org.apache.shenyu.common.dto.MetaData;
 import org.apache.shenyu.common.exception.ShenyuException;
-import org.apache.shenyu.common.utils.GsonUtils;
 import org.apache.zookeeper.CreateMode;
+import org.apache.zookeeper.data.Stat;
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
+import org.mockito.MockedStatic;
 
-import java.io.IOException;
 import java.lang.reflect.Field;
+import java.nio.charset.StandardCharsets;
 import java.util.ArrayList;
 import java.util.List;
 
+import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
 import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertFalse;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertThrows;
 import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Mockito.doNothing;
 import static org.mockito.Mockito.doThrow;
 import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.mockStatic;
+import static org.mockito.Mockito.when;
 
 class ZookeeperClientTest {
 
     private ZookeeperClient client;
 
-    private TestingServer server;
+    private CuratorFramework curatorFramework;
 
     @BeforeEach
-    public void setup() throws Exception {
-        this.server = new TestingServer();
-        ZookeeperConfig config = new 
ZookeeperConfig(server.getConnectString());
-        config.setNamespace("namespace");
-        config.setDigest("digest");
-        client = new ZookeeperClient(config);
-        client.start();
+    public void setup() {
+        curatorFramework = mock(CuratorFramework.class);
+        try (MockedStatic<CuratorFrameworkFactory> 
frameworkFactoryMockedStatic = mockStatic(CuratorFrameworkFactory.class)) {
+            CuratorFrameworkFactory.Builder builder = 
mock(CuratorFrameworkFactory.Builder.class);
+            
frameworkFactoryMockedStatic.when(CuratorFrameworkFactory::builder).thenReturn(builder);
+            when(builder.connectString(anyString())).thenReturn(builder);
+            when(builder.retryPolicy(any())).thenReturn(builder);
+            when(builder.connectionTimeoutMs(anyInt())).thenReturn(builder);
+            when(builder.sessionTimeoutMs(anyInt())).thenReturn(builder);
+            when(builder.namespace(anyString())).thenReturn(builder);
+            when(builder.build()).thenReturn(curatorFramework);
+            ZookeeperConfig config = new ZookeeperConfig("services");
+            config.setNamespace("namespace");
+            config.setDigest("digest");
+            client = new ZookeeperClient(config);
+            client.start();
+            
doThrow(InterruptedException.class).when(curatorFramework).blockUntilConnected();
+            assertDoesNotThrow(() -> client.start());
+        } catch (Exception e) {
+            throw new ShenyuException(e);
+        }
     }
 
     @AfterEach
-    public void cleanup() throws IOException {
+    public void cleanup() {
         client.close();
-        this.server.close();
     }
 
     @Test
@@ -73,116 +102,91 @@ class ZookeeperClientTest {
     }
 
     @Test
-    void isExist() {
+    void isExist() throws Exception {
+        assertThrows(ShenyuException.class, () -> client.isExist("/test"));
+        ExistsBuilderImpl existsBuilder = mock(ExistsBuilderImpl.class);
+        when(curatorFramework.checkExists()).thenReturn(existsBuilder);
+        when(existsBuilder.forPath(anyString())).thenReturn(new Stat());
         boolean exist = client.isExist("/test");
-        assertFalse(exist);
-
-        client.createOrUpdate("/test", "", CreateMode.PERSISTENT);
-        exist = client.isExist("/test");
         assertTrue(exist);
     }
 
     @Test
-    void errorTest() throws NoSuchFieldException, InterruptedException, 
IllegalAccessException {
-        final Field curatorFramework = 
ZookeeperClient.class.getDeclaredField("client");
-        final CuratorFramework curatorFrameworkMock = 
mock(CuratorFramework.class);
-        curatorFramework.setAccessible(true);
-        curatorFramework.set(client, curatorFrameworkMock);
-        
doThrow(InterruptedException.class).when(curatorFrameworkMock).blockUntilConnected();
-        Assertions.assertDoesNotThrow(() -> client.start());
-
-        
doThrow(ShenyuException.class).when(curatorFrameworkMock).checkExists();
-        Assertions.assertThrows(ShenyuException.class, () -> 
client.isExist("key"));
-
-        doThrow(ShenyuException.class).when(curatorFrameworkMock).getData();
-        Assertions.assertThrows(ShenyuException.class, () -> 
client.getDirectly("key"));
-
-        doThrow(ShenyuException.class).when(curatorFrameworkMock).create();
-        Assertions.assertThrows(ShenyuException.class, () -> 
client.createOrUpdate("key", "value", CreateMode.PERSISTENT));
-
-        doThrow(ShenyuException.class).when(curatorFrameworkMock).delete();
-        Assertions.assertThrows(ShenyuException.class, () -> 
client.delete("key"));
-
-        
doThrow(ShenyuException.class).when(curatorFrameworkMock).getChildren();
-        Assertions.assertThrows(ShenyuException.class, () -> 
client.getChildren("key"));
-    }
-
-    @Test
-    void getDirectly() {
-        client.createOrUpdate("/test", "hello", CreateMode.PERSISTENT);
+    void getDirectly() throws Exception {
+        assertThrows(ShenyuException.class, () -> client.getDirectly("/test"));
+        GetDataBuilder getDataBuilder = mock(GetDataBuilder.class);
+        when(curatorFramework.getData()).thenReturn(getDataBuilder);
+        
when(getDataBuilder.forPath(anyString())).thenReturn("hello".getBytes());
         String val = client.getDirectly("/test");
         assertEquals("hello", val);
+        when(getDataBuilder.forPath(anyString())).thenReturn(null);
+        String val2 = client.getDirectly("/test");
+        assertNull(val2);
     }
 
     @Test
-    void get() {
-        client.createOrUpdate("/test", "hello", CreateMode.PERSISTENT);
-        String val = client.get("/test");
-        assertEquals("hello", val);
-    }
-
-    @Test
-    void createOrUpdate() {
-        client.createOrUpdate("/test", "hello", CreateMode.PERSISTENT);
-        String val = client.get("/test");
-        assertEquals("hello", val);
-    }
-
-    @Test
-    void testCreateOrUpdate() {
-        MetaData data = new MetaData();
-        data.setAppName("test");
-        client.createOrUpdate("/test", data, CreateMode.PERSISTENT);
-        String val = client.get("/test");
-        assertEquals(GsonUtils.getInstance().toJson(data), val);
+    void delete() throws Exception {
+        assertThrows(ShenyuException.class, () -> client.delete("/test"));
+        DeleteBuilder deleteBuilder = mock(DeleteBuilder.class);
+        when(curatorFramework.delete()).thenReturn(deleteBuilder);
+        ChildrenDeletable childrenDeletable = mock(ChildrenDeletable.class);
+        when(deleteBuilder.guaranteed()).thenReturn(childrenDeletable);
+        BackgroundVersionable backgroundVersionable = 
mock(BackgroundVersionable.class);
+        
when(childrenDeletable.deletingChildrenIfNeeded()).thenReturn(backgroundVersionable);
+        doNothing().when(backgroundVersionable).forPath(anyString());
+        assertDoesNotThrow(() -> client.delete("/test"));
     }
 
     @Test
-    void delete() {
-        client.createOrUpdate("/test", "hello", CreateMode.PERSISTENT);
-        String val = client.get("/test");
-        assertEquals("hello", val);
-
-        client.delete("/test");
-        boolean exist = client.isExist("/test");
-        assertFalse(exist);
-    }
-
-    @Test
-    void getChildren() {
-        client.createOrUpdate("/test/1", "hello", CreateMode.PERSISTENT);
-        client.createOrUpdate("/test/2", "hello", CreateMode.PERSISTENT);
-
+    void getChildren() throws Exception {
+        assertThrows(ShenyuException.class, () -> client.getChildren("/test"));
+        GetChildrenBuilder getChildrenBuilder = mock(GetChildrenBuilder.class);
+        when(curatorFramework.getChildren()).thenReturn(getChildrenBuilder);
+        when(getChildrenBuilder.forPath(anyString())).thenReturn(new 
ArrayList<>());
         List<String> children = client.getChildren("/test");
-        assertTrue(children.contains("1"));
-        assertTrue(children.contains("2"));
-        assertEquals(2, children.size());
+        assertEquals(0, children.size());
     }
 
     @Test
-    void getCache() {
-        TreeCache cache = client.getCache("/test");
-        assertNull(cache);
-
-        client.addCache("/test");
-        cache = client.getCache("/test");
-        assertNotNull(cache);
+    void createOrUpdate() throws Exception {
+        assertThrows(ShenyuException.class, () ->
+                client.createOrUpdate("/test", "hello", 
CreateMode.PERSISTENT));
+        CreateBuilder createBuilder = mock(CreateBuilder.class);
+        when(curatorFramework.create()).thenReturn(createBuilder);
+        CreateBuilder2 createBuilder2 = mock(CreateBuilder2.class);
+        when(createBuilder.orSetData()).thenReturn(createBuilder2);
+        ProtectACLCreateModeStatPathAndBytesable 
protectACLCreateModeStatPathAndBytesable = 
mock(ProtectACLCreateModeStatPathAndBytesable.class);
+        
when(createBuilder2.creatingParentsIfNeeded()).thenReturn(protectACLCreateModeStatPathAndBytesable);
+        ACLBackgroundPathAndBytesable pathAndBytesable = 
mock(ACLBackgroundPathAndBytesable.class);
+        
when(protectACLCreateModeStatPathAndBytesable.withMode(any())).thenReturn(pathAndBytesable);
+        when(pathAndBytesable.forPath(anyString(), 
any(byte[].class))).thenReturn(null);
+        client.createOrUpdate("/test", "hello", CreateMode.PERSISTENT);
+        client.createOrUpdate("", "hello", CreateMode.PERSISTENT);
+        client.createOrUpdate("", (Object) null, CreateMode.PERSISTENT);
+        client.createOrUpdate("", new Object(), CreateMode.PERSISTENT);
     }
 
     @Test
-    void addCache() throws InterruptedException {
-        List<String> paths = new ArrayList<>();
-        TreeCacheListener listener = (client, event) -> {
-            if (event.getType() == TreeCacheEvent.Type.NODE_ADDED || 
event.getType() == TreeCacheEvent.Type.NODE_UPDATED) {
-                paths.add(event.getData().getPath());
-            }
-        };
-        client.createOrUpdate("/test", "", CreateMode.PERSISTENT);
-        client.addCache("/test", listener);
-        TreeCache cache = client.getCache("/test");
-
-        Thread.sleep(500);
-        assertNotNull(cache);
-        assertEquals("/test", paths.get(0));
+    void cacheTest() throws Exception {
+        assertThrows(ShenyuException.class, () -> client.addCache("/path", 
mock(TreeCacheListener.class), mock(TreeCacheListener.class)));
+        Field clientField = ZookeeperClient.class.getDeclaredField("client");
+        clientField.setAccessible(true);
+        CuratorFramework curatorFramework = mock(CuratorFramework.class);
+        clientField.set(client, curatorFramework);
+
+        GetDataBuilder getDataBuilder = mock(GetDataBuilder.class);
+        when(curatorFramework.getData()).thenReturn(getDataBuilder);
+        
when(getDataBuilder.forPath(any())).thenReturn("path".getBytes(StandardCharsets.UTF_8));
+        client.get("/path");
+        client.get("/test");
+        client.getCache("/test");
+        MockedStatic<TreeCache> treeCacheMockedStatic = 
mockStatic(TreeCache.class);
+        TreeCache.Builder treeCacheBuilder = mock(TreeCache.Builder.class);
+        treeCacheMockedStatic.when(() -> TreeCache.newBuilder(any(), 
any())).thenReturn(treeCacheBuilder);
+        TreeCache treeCache = mock(TreeCache.class);
+        when(treeCacheBuilder.build()).thenReturn(treeCache);
+        when(treeCache.start()).thenThrow(ShenyuException.class);
+        Assertions.assertThrows(ShenyuException.class, () -> 
client.addCache("/path"));
+        treeCacheMockedStatic.close();
     }
 }
diff --git 
a/shenyu-register-center/shenyu-register-client-server/shenyu-register-client-server-zookeeper/src/test/java/org/apache/shenyu/register/client/server/zookeeper/ZookeeperServerRegisterRepositoryTest.java
 
b/shenyu-register-center/shenyu-register-client-server/shenyu-register-client-server-zookeeper/src/test/java/org/apache/shenyu/register/client/server/zookeeper/ZookeeperServerRegisterRepositoryTest.java
index 800554ac3..204bb9555 100644
--- 
a/shenyu-register-center/shenyu-register-client-server/shenyu-register-client-server-zookeeper/src/test/java/org/apache/shenyu/register/client/server/zookeeper/ZookeeperServerRegisterRepositoryTest.java
+++ 
b/shenyu-register-center/shenyu-register-client-server/shenyu-register-client-server-zookeeper/src/test/java/org/apache/shenyu/register/client/server/zookeeper/ZookeeperServerRegisterRepositoryTest.java
@@ -17,105 +17,91 @@
 
 package org.apache.shenyu.register.client.server.zookeeper;
 
-import org.apache.curator.test.TestingServer;
-import org.apache.shenyu.common.utils.GsonUtils;
+import org.apache.curator.framework.CuratorFramework;
+import org.apache.curator.framework.listen.Listenable;
+import org.apache.curator.framework.recipes.cache.ChildData;
+import org.apache.curator.framework.recipes.cache.TreeCacheEvent;
+import org.apache.curator.framework.recipes.cache.TreeCacheListener;
+import org.apache.shenyu.common.exception.ShenyuException;
 import 
org.apache.shenyu.register.client.server.api.ShenyuClientServerRegisterPublisher;
 import org.apache.shenyu.register.common.config.ShenyuRegisterCenterConfig;
-import org.apache.shenyu.register.common.dto.MetaDataRegisterDTO;
-import org.apache.shenyu.register.common.dto.URIRegisterDTO;
-import org.apache.shenyu.register.common.type.DataTypeParent;
-import org.apache.zookeeper.CreateMode;
-import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
+import org.mockito.MockedConstruction;
+import org.springframework.util.ObjectUtils;
 
-import java.lang.reflect.Field;
+import java.util.ArrayList;
 import java.util.List;
+import java.util.Properties;
 
 import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.Mockito.doNothing;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Mockito.doAnswer;
 import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.times;
-import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.mockConstruction;
+import static org.mockito.Mockito.when;
 
 /**
  * Test for Zookeeper register center.
  */
 public class ZookeeperServerRegisterRepositoryTest {
-    
-    private ZookeeperClientServerRegisterRepository repository;
-    
-    private ShenyuClientServerRegisterPublisher publisher;
-    
-    private ZookeeperClient client;
-
-    @BeforeEach
-    public void setUp() throws Exception {
-        this.publisher = mockPublish();
-
-        TestingServer server = new TestingServer();
-        ShenyuRegisterCenterConfig config = new ShenyuRegisterCenterConfig();
-        config.setServerLists(server.getConnectString());
-        this.repository = new ZookeeperClientServerRegisterRepository();
-        this.repository.init(publisher, config);
-
-        Class<? extends ZookeeperClientServerRegisterRepository> clazz = 
this.repository.getClass();
-
-        String fieldString = "client";
-        Field field = clazz.getDeclaredField(fieldString);
-        field.setAccessible(true);
-        this.client = (ZookeeperClient) field.get(repository);
-    }
-    
-    private ShenyuClientServerRegisterPublisher mockPublish() {
-        ShenyuClientServerRegisterPublisher publisher = 
mock(ShenyuClientServerRegisterPublisher.class);
-        doNothing().when(publisher).publish(localAny());
-        return publisher;
-    }
 
     @Test
-    public void testSubscribeMetaData() throws InterruptedException {
-        MetaDataRegisterDTO data = MetaDataRegisterDTO.builder()
-                .rpcType("http")
-                .host("host")
-                .port(80)
-                .contextPath("/context")
-                .ruleName("ruleName")
-                .build();
-        String metadataPath = 
"/shenyu/register/metadata/http/context/context-ruleName";
-        client.createOrUpdate(metadataPath, 
GsonUtils.getInstance().toJson(data), CreateMode.PERSISTENT);
-
-        // wait 1ms for listener being invoked.
-        Thread.sleep(1000);
-
-        verify(publisher, times(1)).publish(localAny());
-        repository.close();
+    public void testZookeeperInstanceRegisterRepository() {
+        final Listenable listenable = mock(Listenable.class);
+        final List<TreeCacheListener> treeCacheListeners = new ArrayList<>();
+        final CuratorFramework curatorFramework = mock(CuratorFramework.class);
+        try (MockedConstruction<ZookeeperClient> construction = 
mockConstruction(ZookeeperClient.class, (mock, context) -> {
+            when(mock.getClient()).thenReturn(curatorFramework);
+            
when(curatorFramework.getConnectionStateListenable()).thenReturn(listenable);
+            doAnswer(invocationOnMock -> {
+                treeCacheListeners.add(invocationOnMock.getArgument(1));
+                return null;
+            }).when(mock).addCache(any(), any());
+            List<String> childrenList = new ArrayList<>(1);
+            childrenList.add("");
+            when(mock.getChildren(anyString())).thenReturn(childrenList);
+            when(mock.get(anyString())).thenReturn("{}");
+        })) {
+            final ZookeeperClientServerRegisterRepository repository = new 
ZookeeperClientServerRegisterRepository();
+            ShenyuRegisterCenterConfig config = new 
ShenyuRegisterCenterConfig();
+            final ShenyuClientServerRegisterPublisher 
shenyuClientServerRegisterPublisher = 
mock(ShenyuClientServerRegisterPublisher.class);
+            repository.init(shenyuClientServerRegisterPublisher, config);
+
+            List<TreeCacheEvent> treeCacheEvent = new ArrayList<>();
+            // register uri
+            
treeCacheEvent.add(treeCacheEvent("/shenyu/register/uri/test/test/test"));
+            // register metadata
+            
treeCacheEvent.add(treeCacheEvent("/shenyu/register/metadata/test/test/test"));
+
+            for (TreeCacheListener treeCacheListener : treeCacheListeners) {
+                for (TreeCacheEvent event : treeCacheEvent) {
+                    treeCacheListener.childEvent(curatorFramework, event);
+                }
+            }
+            final TreeCacheListener treeCacheListener = 
treeCacheListeners.stream().findFirst().orElse(null);
+            if (!ObjectUtils.isEmpty(treeCacheListener)) {
+                TreeCacheEvent event = mock(TreeCacheEvent.class);
+                ChildData childData = mock(ChildData.class);
+                treeCacheListener.childEvent(curatorFramework, event);
+                when(event.getData()).thenReturn(childData);
+                when(childData.getPath()).thenReturn("");
+                treeCacheListener.childEvent(curatorFramework, event);
+            }
+            final Properties configProps = config.getProps();
+            configProps.setProperty("digest", "digest");
+            repository.init(shenyuClientServerRegisterPublisher, config);
+            repository.close();
+        } catch (Exception e) {
+            throw new ShenyuException(e);
+        }
     }
-    
-    @Test
-    public void testSubscribeURI() throws Exception {
-        URIRegisterDTO data = URIRegisterDTO.builder()
-                .rpcType("http")
-                .host("host")
-                .port(80)
-                .appName("/context")
-                .build();
-        String uriPath = "/shenyu/register/uri/http/context/host:80";
-        client.createOrUpdate(uriPath, GsonUtils.getInstance().toJson(data), 
CreateMode.EPHEMERAL);
-
-        // wait 1ms for listener being invoked.
-        Thread.sleep(1000);
-
-        verify(publisher, times(1)).publish(localAny());
 
-        client.delete(uriPath);
-
-        // wait 1ms for listener being invoked.
-        Thread.sleep(1000);
-
-        verify(publisher, times(2)).publish(localAny());
-    }
-    
-    private List<DataTypeParent> localAny() {
-        return any();
+    private static TreeCacheEvent treeCacheEvent(final String path) {
+        TreeCacheEvent treeCacheEvent = mock(TreeCacheEvent.class);
+        ChildData childData = mock(ChildData.class);
+        when(treeCacheEvent.getData()).thenReturn(childData);
+        when(childData.getPath()).thenReturn(path);
+        when(childData.getData()).thenReturn("{}".getBytes());
+        return treeCacheEvent;
     }
 }
diff --git 
a/shenyu-register-center/shenyu-register-client/shenyu-register-client-zookeeper/src/test/java/org/apache/shenyu/register/client/zookeeper/ZookeeperClientRegisterRepositoryTest.java
 
b/shenyu-register-center/shenyu-register-client/shenyu-register-client-zookeeper/src/test/java/org/apache/shenyu/register/client/zookeeper/ZookeeperClientRegisterRepositoryTest.java
index 973d38528..dce4b2d5f 100644
--- 
a/shenyu-register-center/shenyu-register-client/shenyu-register-client-zookeeper/src/test/java/org/apache/shenyu/register/client/zookeeper/ZookeeperClientRegisterRepositoryTest.java
+++ 
b/shenyu-register-center/shenyu-register-client/shenyu-register-client-zookeeper/src/test/java/org/apache/shenyu/register/client/zookeeper/ZookeeperClientRegisterRepositoryTest.java
@@ -17,104 +17,68 @@
 
 package org.apache.shenyu.register.client.zookeeper;
 
-import org.apache.curator.test.TestingServer;
+import org.apache.curator.framework.CuratorFramework;
+import org.apache.curator.framework.listen.Listenable;
+import org.apache.curator.framework.state.ConnectionState;
+import org.apache.curator.framework.state.ConnectionStateListener;
 import org.apache.shenyu.common.enums.RpcTypeEnum;
-import org.apache.shenyu.common.utils.GsonUtils;
 import org.apache.shenyu.register.common.config.ShenyuRegisterCenterConfig;
 import org.apache.shenyu.register.common.dto.MetaDataRegisterDTO;
 import org.apache.shenyu.register.common.dto.URIRegisterDTO;
-import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
+import org.mockito.MockedConstruction;
 
-import java.lang.reflect.Field;
+import java.util.ArrayList;
+import java.util.List;
 import java.util.Properties;
 
-import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.doAnswer;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.mockConstruction;
+import static org.mockito.Mockito.when;
 
 /**
  * Test for Zookeeper client register repository.
  */
 public class ZookeeperClientRegisterRepositoryTest {
 
-    private ZookeeperClientRegisterRepository repository;
-
-    private ZookeeperClient client;
-
-    @BeforeEach
-    public void setUp() throws Exception {
-        TestingServer server = new TestingServer();
-        this.repository = new ZookeeperClientRegisterRepository();
-        ShenyuRegisterCenterConfig config = new ShenyuRegisterCenterConfig();
-        config.setServerLists(server.getConnectString());
-        this.repository.init(config);
-
-        Class<? extends ZookeeperClientRegisterRepository> clazz = 
this.repository.getClass();
-
-        String fieldString = "client";
-        Field field = clazz.getDeclaredField(fieldString);
-        field.setAccessible(true);
-        this.client = (ZookeeperClient) field.get(repository);
-    }
-
     @Test
-    public void initTest() throws Exception {
-        TestingServer server = new TestingServer();
-        ShenyuRegisterCenterConfig config = new ShenyuRegisterCenterConfig();
-        config.setServerLists(server.getConnectString());
-        this.repository = new ZookeeperClientRegisterRepository(config);
-        Properties configProps = config.getProps();
-        configProps.setProperty("digest", "digest");
-        this.repository.init(config);
-    }
+    public void testZookeeperInstanceRegisterRepository() {
+        final Listenable listenable = mock(Listenable.class);
+        try (MockedConstruction<ZookeeperClient> construction = 
mockConstruction(ZookeeperClient.class, (mock, context) -> {
+            final CuratorFramework curatorFramework = 
mock(CuratorFramework.class);
+            when(mock.getClient()).thenReturn(curatorFramework);
+            
when(curatorFramework.getConnectionStateListenable()).thenReturn(listenable);
+        })) {
+            ShenyuRegisterCenterConfig config = new 
ShenyuRegisterCenterConfig();
+            final ZookeeperClientRegisterRepository repository = new 
ZookeeperClientRegisterRepository(config);
+            final Properties configProps = config.getProps();
+            configProps.setProperty("digest", "digest");
+            List<ConnectionStateListener> connectionStateListeners = new 
ArrayList<>();
+            doAnswer(invocationOnMock -> {
+                connectionStateListeners.add(invocationOnMock.getArgument(0));
+                return null;
+            }).when(listenable).addListener(any());
+            repository.init(config);
 
-    @Test
-    public void testPersistInterface() {
-        MetaDataRegisterDTO data = MetaDataRegisterDTO.builder()
-                .rpcType("http")
-                .host("host")
-                .port(80)
-                .contextPath("/context")
-                .ruleName("ruleName")
-                .build();
-        repository.persistInterface(data);
-        String metadataPath = 
"/shenyu/register/metadata/http/context/context-ruleName";
-        String value = client.get(metadataPath);
-        assertEquals(value, GsonUtils.getInstance().toJson(data));
-        repository.close();
-    }
+            
repository.persistInterface(MetaDataRegisterDTO.builder().appName("mockServer").contextPath("/mock")
+                    
.ruleName("/rule").host("127.0.0.1").rpcType(RpcTypeEnum.HTTP.getName()).build());
 
-    @Test
-    public void testPersistUri() {
-        URIRegisterDTO data = URIRegisterDTO.builder()
-                .rpcType("http")
-                .host("host")
-                .port(80)
-                .appName("/context")
-                .build();
-        repository.persistURI(data);
-        String uriPath = "/shenyu/register/uri/http/context/host:80";
-        String value = client.get(uriPath);
-        assertEquals(value, GsonUtils.getInstance().toJson(data));
-        repository.close();
-    }
+            
repository.persistInterface(MetaDataRegisterDTO.builder().appName("mockServer").contextPath("/mock")
+                    
.ruleName("/rule").host("127.0.0.1").rpcType(RpcTypeEnum.SPRING_CLOUD.getName()).build());
 
-    @Test
-    public void testPersistInterfaceDoAnswerWriteData4Grpc() {
-        final MetaDataRegisterDTO data = MetaDataRegisterDTO.builder()
-                .rpcType(RpcTypeEnum.GRPC.getName())
-                .host("host")
-                .port(80)
-                .contextPath("/context")
-                .ruleName("ruleName")
-                .serviceName("testService")
-                .methodName("testMethod")
-                .build();
-        repository.persistInterface(data);
-        // hit `metadataSet.contains(realNode)`
-        repository.persistInterface(data);
-        String metadataPath = 
"/shenyu/register/metadata/grpc/context/testService.testMethod";
-        String value = client.get(metadataPath);
-        assertEquals(value, GsonUtils.getInstance().toJson(data));
-        repository.close();
+            
repository.persistInterface(MetaDataRegisterDTO.builder().appName("mockServer").contextPath("/mock")
+                    
.ruleName("/rule").host("127.0.0.1").rpcType(RpcTypeEnum.TARS.getName()).build());
+
+            
repository.persistURI(URIRegisterDTO.builder().protocol("http://";).appName("test1")
+                    
.rpcType(RpcTypeEnum.HTTP.getName()).host("localhost").port(8091).build());
+            connectionStateListeners.forEach(connectionStateListener -> {
+                connectionStateListener.stateChanged(null, 
ConnectionState.RECONNECTED);
+            });
+            Assertions.assertDoesNotThrow(() -> new 
ZookeeperClientRegisterRepository());
+            repository.close();
+        }
     }
 }
diff --git 
a/shenyu-register-center/shenyu-register-client/shenyu-register-client-zookeeper/src/test/java/org/apache/shenyu/register/client/zookeeper/ZookeeperClientTest.java
 
b/shenyu-register-center/shenyu-register-client/shenyu-register-client-zookeeper/src/test/java/org/apache/shenyu/register/client/zookeeper/ZookeeperClientTest.java
index 8a42bf479..c3a3d8804 100644
--- 
a/shenyu-register-center/shenyu-register-client/shenyu-register-client-zookeeper/src/test/java/org/apache/shenyu/register/client/zookeeper/ZookeeperClientTest.java
+++ 
b/shenyu-register-center/shenyu-register-client/shenyu-register-client-zookeeper/src/test/java/org/apache/shenyu/register/client/zookeeper/ZookeeperClientTest.java
@@ -18,34 +18,43 @@
 package org.apache.shenyu.register.client.zookeeper;
 
 import org.apache.curator.framework.CuratorFramework;
+import org.apache.curator.framework.CuratorFrameworkFactory;
+import org.apache.curator.framework.api.ACLBackgroundPathAndBytesable;
+import org.apache.curator.framework.api.BackgroundVersionable;
+import org.apache.curator.framework.api.ChildrenDeletable;
+import org.apache.curator.framework.api.CreateBuilder;
+import org.apache.curator.framework.api.CreateBuilder2;
+import org.apache.curator.framework.api.DeleteBuilder;
+import org.apache.curator.framework.api.GetChildrenBuilder;
 import org.apache.curator.framework.api.GetDataBuilder;
-import org.apache.curator.framework.recipes.cache.ChildData;
+import 
org.apache.curator.framework.api.ProtectACLCreateModeStatPathAndBytesable;
+import org.apache.curator.framework.imps.ExistsBuilderImpl;
 import org.apache.curator.framework.recipes.cache.TreeCache;
 import org.apache.curator.framework.recipes.cache.TreeCacheListener;
-import org.apache.curator.test.TestingServer;
-import org.apache.shenyu.common.dto.MetaData;
 import org.apache.shenyu.common.exception.ShenyuException;
-import org.apache.shenyu.common.utils.GsonUtils;
 import org.apache.zookeeper.CreateMode;
+import org.apache.zookeeper.data.Stat;
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 import org.mockito.MockedStatic;
 
-import java.io.IOException;
 import java.lang.reflect.Field;
 import java.nio.charset.StandardCharsets;
+import java.util.ArrayList;
 import java.util.List;
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
 
+import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
 import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertFalse;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertThrows;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Mockito.doNothing;
 import static org.mockito.Mockito.doThrow;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.mockStatic;
@@ -55,24 +64,35 @@ class ZookeeperClientTest {
 
     private ZookeeperClient client;
 
-    private TestingServer server;
+    private CuratorFramework curatorFramework;
 
     @BeforeEach
-    public void setup() throws Exception {
-        this.server = new TestingServer();
-        ZookeeperConfig config = new 
ZookeeperConfig(server.getConnectString());
-        client = new ZookeeperClient(config);
-        client.start();
+    public void setup() {
+        curatorFramework = mock(CuratorFramework.class);
+        try (MockedStatic<CuratorFrameworkFactory> 
frameworkFactoryMockedStatic = mockStatic(CuratorFrameworkFactory.class)) {
+            CuratorFrameworkFactory.Builder builder = 
mock(CuratorFrameworkFactory.Builder.class);
+            
frameworkFactoryMockedStatic.when(CuratorFrameworkFactory::builder).thenReturn(builder);
+            when(builder.connectString(anyString())).thenReturn(builder);
+            when(builder.retryPolicy(any())).thenReturn(builder);
+            when(builder.connectionTimeoutMs(anyInt())).thenReturn(builder);
+            when(builder.sessionTimeoutMs(anyInt())).thenReturn(builder);
+            when(builder.namespace(anyString())).thenReturn(builder);
+            when(builder.build()).thenReturn(curatorFramework);
+            ZookeeperConfig config = new ZookeeperConfig("services");
+            config.setNamespace("namespace");
+            config.setDigest("digest");
+            client = new ZookeeperClient(config);
+            client.start();
+            
doThrow(InterruptedException.class).when(curatorFramework).blockUntilConnected();
+            assertDoesNotThrow(() -> client.start());
+        } catch (Exception e) {
+            throw new ShenyuException(e);
+        }
     }
 
     @AfterEach
-    public void cleanup() throws IOException {
-        if (this.client != null) {
-            this.client.close();
-        }
-        if (this.server != null) {
-            this.server.close();
-        }
+    public void cleanup() {
+        client.close();
     }
 
     @Test
@@ -82,128 +102,73 @@ class ZookeeperClientTest {
     }
 
     @Test
-    void zookeeperClientTest() {
-        ZookeeperConfig config = new 
ZookeeperConfig(server.getConnectString());
-        config.setDigest("digest");
-        config.setNamespace("namespace");
-        client = new ZookeeperClient(config);
-
-    }
-
-    @Test
-    void isExist() {
+    void isExist() throws Exception {
+        assertThrows(ShenyuException.class, () -> client.isExist("/test"));
+        ExistsBuilderImpl existsBuilder = mock(ExistsBuilderImpl.class);
+        when(curatorFramework.checkExists()).thenReturn(existsBuilder);
+        when(existsBuilder.forPath(anyString())).thenReturn(new Stat());
         boolean exist = client.isExist("/test");
-        assertFalse(exist);
-
-        client.createOrUpdate("/test", "", CreateMode.PERSISTENT);
-        exist = client.isExist("/test");
         assertTrue(exist);
     }
 
     @Test
-    void getDirectly() {
-        client.createOrUpdate("/test", "hello", CreateMode.PERSISTENT);
+    void getDirectly() throws Exception {
+        assertThrows(ShenyuException.class, () -> client.getDirectly("/test"));
+        GetDataBuilder getDataBuilder = mock(GetDataBuilder.class);
+        when(curatorFramework.getData()).thenReturn(getDataBuilder);
+        
when(getDataBuilder.forPath(anyString())).thenReturn("hello".getBytes());
         String val = client.getDirectly("/test");
         assertEquals("hello", val);
+        when(getDataBuilder.forPath(anyString())).thenReturn(null);
+        String val2 = client.getDirectly("/test");
+        assertNull(val2);
     }
 
     @Test
-    void get() {
-        client.createOrUpdate("/test", "hello", CreateMode.PERSISTENT);
-        String val = client.get("/test");
-        assertEquals("hello", val);
-    }
-
-    @Test
-    void createOrUpdate() {
-        client.createOrUpdate("/test", "hello", CreateMode.PERSISTENT);
-        String val = client.get("/test");
-        assertEquals("hello", val);
+    void delete() throws Exception {
+        assertThrows(ShenyuException.class, () -> client.delete("/test"));
+        DeleteBuilder deleteBuilder = mock(DeleteBuilder.class);
+        when(curatorFramework.delete()).thenReturn(deleteBuilder);
+        ChildrenDeletable childrenDeletable = mock(ChildrenDeletable.class);
+        when(deleteBuilder.guaranteed()).thenReturn(childrenDeletable);
+        BackgroundVersionable backgroundVersionable = 
mock(BackgroundVersionable.class);
+        
when(childrenDeletable.deletingChildrenIfNeeded()).thenReturn(backgroundVersionable);
+        doNothing().when(backgroundVersionable).forPath(anyString());
+        assertDoesNotThrow(() -> client.delete("/test"));
     }
 
     @Test
-    void testCreateOrUpdate() {
-        MetaData data = new MetaData();
-        data.setAppName("test");
-        client.createOrUpdate("/test", data, CreateMode.PERSISTENT);
-        String val = client.get("/test");
-        assertEquals(GsonUtils.getInstance().toJson(data), val);
-    }
-
-    @Test
-    void delete() {
-        client.createOrUpdate("/test", "hello", CreateMode.PERSISTENT);
-        String val = client.get("/test");
-        assertEquals("hello", val);
-
-        client.delete("/test");
-        boolean exist = client.isExist("/test");
-        assertFalse(exist);
-    }
-
-    @Test
-    void getChildren() {
-        client.createOrUpdate("/test/1", "hello", CreateMode.PERSISTENT);
-        client.createOrUpdate("/test/2", "hello", CreateMode.PERSISTENT);
-
+    void getChildren() throws Exception {
+        assertThrows(ShenyuException.class, () -> client.getChildren("/test"));
+        GetChildrenBuilder getChildrenBuilder = mock(GetChildrenBuilder.class);
+        when(curatorFramework.getChildren()).thenReturn(getChildrenBuilder);
+        when(getChildrenBuilder.forPath(anyString())).thenReturn(new 
ArrayList<>());
         List<String> children = client.getChildren("/test");
-        assertTrue(children.contains("1"));
-        assertTrue(children.contains("2"));
-        assertEquals(2, children.size());
-    }
-
-    @Test
-    void getCache() {
-        TreeCache cache = client.getCache("/test");
-        assertNull(cache);
-
-        client.addCache("/test");
-        cache = client.getCache("/test");
-        assertNotNull(cache);
+        assertEquals(0, children.size());
     }
 
     @Test
-    void addCache() {
-        client.addCache("/test");
-        TreeCache cache = client.getCache("/test");
-        assertNotNull(cache);
-    }
-
-    @Test
-    void startErrorTest() throws Exception {
-        Field clientField = ZookeeperClient.class.getDeclaredField("client");
-        clientField.setAccessible(true);
-        CuratorFramework curatorFramework = mock(CuratorFramework.class);
-        clientField.set(client, curatorFramework);
-
-        
doThrow(InterruptedException.class).when(curatorFramework).blockUntilConnected();
-        client.start();
-
-        doThrow(ShenyuException.class).when(curatorFramework).checkExists();
-        Assertions.assertThrows(ShenyuException.class, () -> 
client.isExist("key"));
-
-        GetDataBuilder getDataBuilder = mock(GetDataBuilder.class);
-        when(curatorFramework.getData()).thenReturn(getDataBuilder);
-        when(getDataBuilder.forPath(any())).thenReturn(null);
-        Assertions.assertDoesNotThrow(() -> client.getDirectly("key"));
-
-        doThrow(ShenyuException.class).when(curatorFramework).getData();
-        Assertions.assertThrows(ShenyuException.class, () -> 
client.getDirectly("key"));
-
-        doThrow(ShenyuException.class).when(curatorFramework).getChildren();
-        Assertions.assertThrows(ShenyuException.class, () -> 
client.getChildren("key"));
-
-        doThrow(ShenyuException.class).when(curatorFramework).delete();
-        Assertions.assertThrows(ShenyuException.class, () -> 
client.delete("key"));
-
-        doThrow(ShenyuException.class).when(curatorFramework).create();
-        Assertions.assertThrows(ShenyuException.class, () -> 
client.createOrUpdate(null, null, null));
-        curatorFramework.close();
+    void createOrUpdate() throws Exception {
+        assertThrows(ShenyuException.class, () ->
+                client.createOrUpdate("/test", "hello", 
CreateMode.PERSISTENT));
+        CreateBuilder createBuilder = mock(CreateBuilder.class);
+        when(curatorFramework.create()).thenReturn(createBuilder);
+        CreateBuilder2 createBuilder2 = mock(CreateBuilder2.class);
+        when(createBuilder.orSetData()).thenReturn(createBuilder2);
+        ProtectACLCreateModeStatPathAndBytesable 
protectACLCreateModeStatPathAndBytesable = 
mock(ProtectACLCreateModeStatPathAndBytesable.class);
+        
when(createBuilder2.creatingParentsIfNeeded()).thenReturn(protectACLCreateModeStatPathAndBytesable);
+        ACLBackgroundPathAndBytesable pathAndBytesable = 
mock(ACLBackgroundPathAndBytesable.class);
+        
when(protectACLCreateModeStatPathAndBytesable.withMode(any())).thenReturn(pathAndBytesable);
+        when(pathAndBytesable.forPath(anyString(), 
any(byte[].class))).thenReturn(null);
+        client.createOrUpdate("/test", "hello", CreateMode.PERSISTENT);
+        client.createOrUpdate("", "hello", CreateMode.PERSISTENT);
+        client.createOrUpdate("", (Object) null, CreateMode.PERSISTENT);
+        client.createOrUpdate("", new Object(), CreateMode.PERSISTENT);
     }
 
     @Test
     void cacheTest() throws Exception {
-        client.addCache("/path", mock(TreeCacheListener.class), 
mock(TreeCacheListener.class));
+        assertThrows(ShenyuException.class, () -> client.addCache("/path", 
mock(TreeCacheListener.class), mock(TreeCacheListener.class)));
         Field clientField = ZookeeperClient.class.getDeclaredField("client");
         clientField.setAccessible(true);
         CuratorFramework curatorFramework = mock(CuratorFramework.class);
@@ -214,7 +179,7 @@ class ZookeeperClientTest {
         
when(getDataBuilder.forPath(any())).thenReturn("path".getBytes(StandardCharsets.UTF_8));
         client.get("/path");
         client.get("/test");
-
+        client.getCache("/test");
         MockedStatic<TreeCache> treeCacheMockedStatic = 
mockStatic(TreeCache.class);
         TreeCache.Builder treeCacheBuilder = mock(TreeCache.Builder.class);
         treeCacheMockedStatic.when(() -> TreeCache.newBuilder(any(), 
any())).thenReturn(treeCacheBuilder);
@@ -224,37 +189,4 @@ class ZookeeperClientTest {
         Assertions.assertThrows(ShenyuException.class, () -> 
client.addCache("/path"));
         treeCacheMockedStatic.close();
     }
-
-    @Test
-    void findFromCacheTest() throws Exception {
-        Field clientField = ZookeeperClient.class.getDeclaredField("client");
-        clientField.setAccessible(true);
-        CuratorFramework curatorFramework = mock(CuratorFramework.class);
-        clientField.set(client, curatorFramework);
-        GetDataBuilder getDataBuilder = mock(GetDataBuilder.class);
-        when(curatorFramework.getData()).thenReturn(getDataBuilder);
-        
when(getDataBuilder.forPath(any())).thenReturn("path".getBytes(StandardCharsets.UTF_8));
-        Assertions.assertDoesNotThrow(() -> client.get("/path"));
-
-        Field cachesField = ZookeeperClient.class.getDeclaredField("caches");
-        cachesField.setAccessible(true);
-
-        TreeCache treeCache = mock(TreeCache.class);
-        Map<String, TreeCache> caches = new ConcurrentHashMap<>();
-        caches.put("/path", treeCache);
-        cachesField.set(client, caches);
-
-        ChildData childData = mock(ChildData.class);
-        when(treeCache.getCurrentData(any())).thenReturn(childData);
-        Assertions.assertDoesNotThrow(() -> client.get("/path"));
-
-        when(childData.getData()).thenReturn(new byte[1]);
-        Assertions.assertDoesNotThrow(() -> client.get("/path"));
-    }
-
-    @Test
-    void createOrUpdateTest() {
-        Assertions.assertThrows(ShenyuException.class, () -> 
client.createOrUpdate("key", (Object) null, CreateMode.PERSISTENT));
-        Assertions.assertThrows(ShenyuException.class, () -> 
client.createOrUpdate("key", new Object(), CreateMode.PERSISTENT));
-    }
 }
diff --git 
a/shenyu-register-center/shenyu-register-instance/shenyu-register-instance-zookeeper/src/test/java/org/apache/shenyu/register/instance/zookeeper/ZookeeperClientTest.java
 
b/shenyu-register-center/shenyu-register-instance/shenyu-register-instance-zookeeper/src/test/java/org/apache/shenyu/register/instance/zookeeper/ZookeeperClientTest.java
index 225cb56b3..cc84ee5e2 100644
--- 
a/shenyu-register-center/shenyu-register-instance/shenyu-register-instance-zookeeper/src/test/java/org/apache/shenyu/register/instance/zookeeper/ZookeeperClientTest.java
+++ 
b/shenyu-register-center/shenyu-register-instance/shenyu-register-instance-zookeeper/src/test/java/org/apache/shenyu/register/instance/zookeeper/ZookeeperClientTest.java
@@ -18,42 +18,81 @@
 package org.apache.shenyu.register.instance.zookeeper;
 
 import org.apache.curator.framework.CuratorFramework;
+import org.apache.curator.framework.CuratorFrameworkFactory;
+import org.apache.curator.framework.api.ACLBackgroundPathAndBytesable;
+import org.apache.curator.framework.api.BackgroundVersionable;
+import org.apache.curator.framework.api.ChildrenDeletable;
+import org.apache.curator.framework.api.CreateBuilder;
+import org.apache.curator.framework.api.CreateBuilder2;
+import org.apache.curator.framework.api.DeleteBuilder;
+import org.apache.curator.framework.api.GetChildrenBuilder;
+import org.apache.curator.framework.api.GetDataBuilder;
+import 
org.apache.curator.framework.api.ProtectACLCreateModeStatPathAndBytesable;
+import org.apache.curator.framework.imps.ExistsBuilderImpl;
 import org.apache.curator.framework.recipes.cache.TreeCache;
-import org.apache.curator.test.TestingServer;
-import org.apache.shenyu.common.dto.MetaData;
-import org.apache.shenyu.common.utils.GsonUtils;
+import org.apache.curator.framework.recipes.cache.TreeCacheListener;
+import org.apache.shenyu.common.exception.ShenyuException;
 import org.apache.zookeeper.CreateMode;
+import org.apache.zookeeper.data.Stat;
 import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
+import org.mockito.MockedStatic;
 
-import java.io.IOException;
+import java.lang.reflect.Field;
+import java.nio.charset.StandardCharsets;
+import java.util.ArrayList;
 import java.util.List;
 
+import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
 import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertFalse;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertThrows;
 import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Mockito.doNothing;
+import static org.mockito.Mockito.doThrow;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.mockStatic;
+import static org.mockito.Mockito.when;
 
 class ZookeeperClientTest {
 
     private ZookeeperClient client;
 
-    private TestingServer server;
+    private CuratorFramework curatorFramework;
 
     @BeforeEach
-    public void setup() throws Exception {
-        this.server = new TestingServer();
-        ZookeeperConfig config = new 
ZookeeperConfig(server.getConnectString());
-        client = new ZookeeperClient(config);
-        client.start();
+    public void setup() {
+        curatorFramework = mock(CuratorFramework.class);
+        try (MockedStatic<CuratorFrameworkFactory> 
frameworkFactoryMockedStatic = mockStatic(CuratorFrameworkFactory.class)) {
+            CuratorFrameworkFactory.Builder builder = 
mock(CuratorFrameworkFactory.Builder.class);
+            
frameworkFactoryMockedStatic.when(CuratorFrameworkFactory::builder).thenReturn(builder);
+            when(builder.connectString(anyString())).thenReturn(builder);
+            when(builder.retryPolicy(any())).thenReturn(builder);
+            when(builder.connectionTimeoutMs(anyInt())).thenReturn(builder);
+            when(builder.sessionTimeoutMs(anyInt())).thenReturn(builder);
+            when(builder.namespace(anyString())).thenReturn(builder);
+            when(builder.build()).thenReturn(curatorFramework);
+            ZookeeperConfig config = new ZookeeperConfig("services");
+            config.setNamespace("namespace");
+            config.setDigest("digest");
+            client = new ZookeeperClient(config);
+            client.start();
+            
doThrow(InterruptedException.class).when(curatorFramework).blockUntilConnected();
+            assertDoesNotThrow(() -> client.start());
+        } catch (Exception e) {
+            throw new ShenyuException(e);
+        }
     }
 
     @AfterEach
-    public void cleanup() throws IOException {
+    public void cleanup() {
         client.close();
-        this.server.close();
     }
 
     @Test
@@ -63,81 +102,91 @@ class ZookeeperClientTest {
     }
 
     @Test
-    void isExist() {
+    void isExist() throws Exception {
+        assertThrows(ShenyuException.class, () -> client.isExist("/test"));
+        ExistsBuilderImpl existsBuilder = mock(ExistsBuilderImpl.class);
+        when(curatorFramework.checkExists()).thenReturn(existsBuilder);
+        when(existsBuilder.forPath(anyString())).thenReturn(new Stat());
         boolean exist = client.isExist("/test");
-        assertFalse(exist);
-
-        client.createOrUpdate("/test", "", CreateMode.PERSISTENT);
-        exist = client.isExist("/test");
         assertTrue(exist);
     }
 
     @Test
-    void getDirectly() {
-        client.createOrUpdate("/test", "hello", CreateMode.PERSISTENT);
+    void getDirectly() throws Exception {
+        assertThrows(ShenyuException.class, () -> client.getDirectly("/test"));
+        GetDataBuilder getDataBuilder = mock(GetDataBuilder.class);
+        when(curatorFramework.getData()).thenReturn(getDataBuilder);
+        
when(getDataBuilder.forPath(anyString())).thenReturn("hello".getBytes());
         String val = client.getDirectly("/test");
         assertEquals("hello", val);
+        when(getDataBuilder.forPath(anyString())).thenReturn(null);
+        String val2 = client.getDirectly("/test");
+        assertNull(val2);
     }
 
     @Test
-    void get() {
-        client.createOrUpdate("/test", "hello", CreateMode.PERSISTENT);
-        String val = client.get("/test");
-        assertEquals("hello", val);
-    }
-
-    @Test
-    void createOrUpdate() {
-        client.createOrUpdate("/test", "hello", CreateMode.PERSISTENT);
-        String val = client.get("/test");
-        assertEquals("hello", val);
-    }
-
-    @Test
-    void testCreateOrUpdate() {
-        MetaData data = new MetaData();
-        data.setAppName("test");
-        client.createOrUpdate("/test", data, CreateMode.PERSISTENT);
-        String val = client.get("/test");
-        assertEquals(GsonUtils.getInstance().toJson(data), val);
+    void delete() throws Exception {
+        assertThrows(ShenyuException.class, () -> client.delete("/test"));
+        DeleteBuilder deleteBuilder = mock(DeleteBuilder.class);
+        when(curatorFramework.delete()).thenReturn(deleteBuilder);
+        ChildrenDeletable childrenDeletable = mock(ChildrenDeletable.class);
+        when(deleteBuilder.guaranteed()).thenReturn(childrenDeletable);
+        BackgroundVersionable backgroundVersionable = 
mock(BackgroundVersionable.class);
+        
when(childrenDeletable.deletingChildrenIfNeeded()).thenReturn(backgroundVersionable);
+        doNothing().when(backgroundVersionable).forPath(anyString());
+        assertDoesNotThrow(() -> client.delete("/test"));
     }
 
     @Test
-    void delete() {
-        client.createOrUpdate("/test", "hello", CreateMode.PERSISTENT);
-        String val = client.get("/test");
-        assertEquals("hello", val);
-
-        client.delete("/test");
-        boolean exist = client.isExist("/test");
-        assertFalse(exist);
-    }
-
-    @Test
-    void getChildren() {
-        client.createOrUpdate("/test/1", "hello", CreateMode.PERSISTENT);
-        client.createOrUpdate("/test/2", "hello", CreateMode.PERSISTENT);
-
+    void getChildren() throws Exception {
+        assertThrows(ShenyuException.class, () -> client.getChildren("/test"));
+        GetChildrenBuilder getChildrenBuilder = mock(GetChildrenBuilder.class);
+        when(curatorFramework.getChildren()).thenReturn(getChildrenBuilder);
+        when(getChildrenBuilder.forPath(anyString())).thenReturn(new 
ArrayList<>());
         List<String> children = client.getChildren("/test");
-        assertTrue(children.contains("1"));
-        assertTrue(children.contains("2"));
-        assertEquals(2, children.size());
+        assertEquals(0, children.size());
     }
 
     @Test
-    void getCache() {
-        TreeCache cache = client.getCache("/test");
-        assertNull(cache);
-
-        client.addCache("/test");
-        cache = client.getCache("/test");
-        assertNotNull(cache);
+    void createOrUpdate() throws Exception {
+        assertThrows(ShenyuException.class, () ->
+                client.createOrUpdate("/test", "hello", 
CreateMode.PERSISTENT));
+        CreateBuilder createBuilder = mock(CreateBuilder.class);
+        when(curatorFramework.create()).thenReturn(createBuilder);
+        CreateBuilder2 createBuilder2 = mock(CreateBuilder2.class);
+        when(createBuilder.orSetData()).thenReturn(createBuilder2);
+        ProtectACLCreateModeStatPathAndBytesable 
protectACLCreateModeStatPathAndBytesable = 
mock(ProtectACLCreateModeStatPathAndBytesable.class);
+        
when(createBuilder2.creatingParentsIfNeeded()).thenReturn(protectACLCreateModeStatPathAndBytesable);
+        ACLBackgroundPathAndBytesable pathAndBytesable = 
mock(ACLBackgroundPathAndBytesable.class);
+        
when(protectACLCreateModeStatPathAndBytesable.withMode(any())).thenReturn(pathAndBytesable);
+        when(pathAndBytesable.forPath(anyString(), 
any(byte[].class))).thenReturn(null);
+        client.createOrUpdate("/test", "hello", CreateMode.PERSISTENT);
+        client.createOrUpdate("", "hello", CreateMode.PERSISTENT);
+        client.createOrUpdate("", (Object) null, CreateMode.PERSISTENT);
+        client.createOrUpdate("", new Object(), CreateMode.PERSISTENT);
     }
 
     @Test
-    void addCache() {
-        client.addCache("/test");
-        TreeCache cache = client.getCache("/test");
-        assertNotNull(cache);
+    void cacheTest() throws Exception {
+        assertThrows(ShenyuException.class, () -> client.addCache("/path", 
mock(TreeCacheListener.class), mock(TreeCacheListener.class)));
+        Field clientField = ZookeeperClient.class.getDeclaredField("client");
+        clientField.setAccessible(true);
+        CuratorFramework curatorFramework = mock(CuratorFramework.class);
+        clientField.set(client, curatorFramework);
+
+        GetDataBuilder getDataBuilder = mock(GetDataBuilder.class);
+        when(curatorFramework.getData()).thenReturn(getDataBuilder);
+        
when(getDataBuilder.forPath(any())).thenReturn("path".getBytes(StandardCharsets.UTF_8));
+        client.get("/path");
+        client.get("/test");
+        client.getCache("/test");
+        MockedStatic<TreeCache> treeCacheMockedStatic = 
mockStatic(TreeCache.class);
+        TreeCache.Builder treeCacheBuilder = mock(TreeCache.Builder.class);
+        treeCacheMockedStatic.when(() -> TreeCache.newBuilder(any(), 
any())).thenReturn(treeCacheBuilder);
+        TreeCache treeCache = mock(TreeCache.class);
+        when(treeCacheBuilder.build()).thenReturn(treeCache);
+        when(treeCache.start()).thenThrow(ShenyuException.class);
+        Assertions.assertThrows(ShenyuException.class, () -> 
client.addCache("/path"));
+        treeCacheMockedStatic.close();
     }
 }
diff --git 
a/shenyu-register-center/shenyu-register-instance/shenyu-register-instance-zookeeper/src/test/java/org/apache/shenyu/register/instance/zookeeper/ZookeeperInstanceRegisterRepositoryTest.java
 
b/shenyu-register-center/shenyu-register-instance/shenyu-register-instance-zookeeper/src/test/java/org/apache/shenyu/register/instance/zookeeper/ZookeeperInstanceRegisterRepositoryTest.java
index 2ace0d864..c1ff22c61 100644
--- 
a/shenyu-register-center/shenyu-register-instance/shenyu-register-instance-zookeeper/src/test/java/org/apache/shenyu/register/instance/zookeeper/ZookeeperInstanceRegisterRepositoryTest.java
+++ 
b/shenyu-register-center/shenyu-register-instance/shenyu-register-instance-zookeeper/src/test/java/org/apache/shenyu/register/instance/zookeeper/ZookeeperInstanceRegisterRepositoryTest.java
@@ -17,48 +17,51 @@
 
 package org.apache.shenyu.register.instance.zookeeper;
 
-import org.apache.curator.test.TestingServer;
+import org.apache.curator.framework.CuratorFramework;
+import org.apache.curator.framework.listen.Listenable;
+import org.apache.curator.framework.state.ConnectionState;
+import org.apache.curator.framework.state.ConnectionStateListener;
 import org.apache.shenyu.common.config.ShenyuConfig;
-import org.apache.shenyu.common.utils.GsonUtils;
 import org.apache.shenyu.register.common.dto.InstanceRegisterDTO;
-import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
+import org.mockito.MockedConstruction;
 
-import java.lang.reflect.Field;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Properties;
 
-import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.doAnswer;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.mockConstruction;
+import static org.mockito.Mockito.when;
 
 public class ZookeeperInstanceRegisterRepositoryTest {
 
-    private final ZookeeperInstanceRegisterRepository repository
-            = new ZookeeperInstanceRegisterRepository();
-
-    private ZookeeperClient client;
-
-    @BeforeEach
-    public void setup() throws Exception {
-        TestingServer server = new TestingServer();
-        ShenyuConfig.InstanceConfig config = new ShenyuConfig.InstanceConfig();
-        config.setServerLists(server.getConnectString());
-        this.repository.init(config);
-
-        Class<? extends ZookeeperInstanceRegisterRepository> clazz = 
this.repository.getClass();
-
-        String fieldString = "client";
-        Field field = clazz.getDeclaredField(fieldString);
-        field.setAccessible(true);
-        this.client = (ZookeeperClient) field.get(repository);
-    }
-
     @Test
-    public void testPersistInstance() {
-        InstanceRegisterDTO data = InstanceRegisterDTO.builder()
-                .appName("shenyu-test")
-                .host("shenyu-host")
-                .port(9195)
-                .build();
-        repository.persistInstance(data);
-        String value = 
client.get("/shenyu/register/instance/shenyu-host:9195");
-        assertEquals(value, GsonUtils.getInstance().toJson(data));
+    public void testZookeeperInstanceRegisterRepository() {
+        final Listenable listenable = mock(Listenable.class);
+        try (MockedConstruction<ZookeeperClient> construction = 
mockConstruction(ZookeeperClient.class, (mock, context) -> {
+            final CuratorFramework curatorFramework = 
mock(CuratorFramework.class);
+            when(mock.getClient()).thenReturn(curatorFramework);
+            
when(curatorFramework.getConnectionStateListenable()).thenReturn(listenable);
+        })) {
+            final ZookeeperInstanceRegisterRepository repository = new 
ZookeeperInstanceRegisterRepository();
+            ShenyuConfig.InstanceConfig config = new 
ShenyuConfig.InstanceConfig();
+            repository.init(config);
+            final Properties configProps = config.getProps();
+            configProps.setProperty("digest", "digest");
+            List<ConnectionStateListener> connectionStateListeners = new 
ArrayList<>();
+            doAnswer(invocationOnMock -> {
+                connectionStateListeners.add(invocationOnMock.getArgument(0));
+                return null;
+            }).when(listenable).addListener(any());
+            repository.init(config);
+            repository.persistInstance(mock(InstanceRegisterDTO.class));
+            connectionStateListeners.forEach(connectionStateListener -> {
+                connectionStateListener.stateChanged(null, 
ConnectionState.RECONNECTED);
+            });
+            repository.close();
+        }
     }
 }
diff --git 
a/shenyu-sync-data-center/shenyu-sync-data-zookeeper/src/test/java/org/apache/shenyu/sync/data/zookeeper/ZookeeperClientTest.java
 
b/shenyu-sync-data-center/shenyu-sync-data-zookeeper/src/test/java/org/apache/shenyu/sync/data/zookeeper/ZookeeperClientTest.java
index 603316937..6a1b701a4 100644
--- 
a/shenyu-sync-data-center/shenyu-sync-data-zookeeper/src/test/java/org/apache/shenyu/sync/data/zookeeper/ZookeeperClientTest.java
+++ 
b/shenyu-sync-data-center/shenyu-sync-data-zookeeper/src/test/java/org/apache/shenyu/sync/data/zookeeper/ZookeeperClientTest.java
@@ -18,52 +18,86 @@
 package org.apache.shenyu.sync.data.zookeeper;
 
 import org.apache.curator.framework.CuratorFramework;
+import org.apache.curator.framework.CuratorFrameworkFactory;
+import org.apache.curator.framework.api.ACLBackgroundPathAndBytesable;
+import org.apache.curator.framework.api.BackgroundVersionable;
+import org.apache.curator.framework.api.ChildrenDeletable;
+import org.apache.curator.framework.api.CreateBuilder;
+import org.apache.curator.framework.api.CreateBuilder2;
+import org.apache.curator.framework.api.DeleteBuilder;
+import org.apache.curator.framework.api.GetChildrenBuilder;
+import org.apache.curator.framework.api.GetDataBuilder;
+import 
org.apache.curator.framework.api.ProtectACLCreateModeStatPathAndBytesable;
+import org.apache.curator.framework.imps.ExistsBuilderImpl;
 import org.apache.curator.framework.recipes.cache.TreeCache;
-import org.apache.curator.framework.recipes.cache.TreeCacheEvent;
 import org.apache.curator.framework.recipes.cache.TreeCacheListener;
-import org.apache.curator.test.TestingServer;
-import org.apache.shenyu.common.dto.MetaData;
 import org.apache.shenyu.common.exception.ShenyuException;
-import org.apache.shenyu.common.utils.GsonUtils;
 import org.apache.zookeeper.CreateMode;
+import org.apache.zookeeper.data.Stat;
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
+import org.mockito.MockedStatic;
 
-import java.io.IOException;
 import java.lang.reflect.Field;
+import java.nio.charset.StandardCharsets;
 import java.util.ArrayList;
 import java.util.List;
 
+import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
 import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertFalse;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertThrows;
 import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Mockito.doNothing;
 import static org.mockito.Mockito.doThrow;
 import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.mockStatic;
+import static org.mockito.Mockito.when;
 
 class ZookeeperClientTest {
 
     private ZookeeperClient client;
 
-    private TestingServer server;
+    private CuratorFramework curatorFramework;
 
     @BeforeEach
-    public void setup() throws Exception {
-        this.server = new TestingServer();
-        ZookeeperConfig config = new 
ZookeeperConfig(server.getConnectString());
-        config.setNamespace("namespace");
-        config.setDigest("digest");
-        client = new ZookeeperClient(config);
-        client.start();
+    public void setup() {
+        curatorFramework = mock(CuratorFramework.class);
+        try (MockedStatic<CuratorFrameworkFactory> 
frameworkFactoryMockedStatic = mockStatic(CuratorFrameworkFactory.class)) {
+            CuratorFrameworkFactory.Builder builder = 
mock(CuratorFrameworkFactory.Builder.class);
+            
frameworkFactoryMockedStatic.when(CuratorFrameworkFactory::builder).thenReturn(builder);
+            when(builder.connectString(anyString())).thenReturn(builder);
+            when(builder.retryPolicy(any())).thenReturn(builder);
+            when(builder.connectionTimeoutMs(anyInt())).thenReturn(builder);
+            when(builder.sessionTimeoutMs(anyInt())).thenReturn(builder);
+            when(builder.namespace(anyString())).thenReturn(builder);
+            when(builder.build()).thenReturn(curatorFramework);
+            ZookeeperConfig config = new ZookeeperConfig("services");
+            config.setNamespace("namespace");
+            config.setDigest("digest");
+            config.setBaseSleepTimeMilliseconds(1);
+            config.setMaxSleepTimeMilliseconds(1);
+            config.setMaxRetries(1);
+            config.setSessionTimeoutMilliseconds(1);
+            config.setConnectionTimeoutMilliseconds(1);
+            client = new ZookeeperClient(config);
+            client.start();
+            
doThrow(InterruptedException.class).when(curatorFramework).blockUntilConnected();
+            assertDoesNotThrow(() -> client.start());
+        } catch (Exception e) {
+            throw new ShenyuException(e);
+        }
     }
 
     @AfterEach
-    public void cleanup() throws IOException {
+    public void cleanup() {
         client.close();
-        this.server.close();
     }
 
     @Test
@@ -73,128 +107,91 @@ class ZookeeperClientTest {
     }
 
     @Test
-    void isExist() {
+    void isExist() throws Exception {
+        assertThrows(ShenyuException.class, () -> client.isExist("/test"));
+        ExistsBuilderImpl existsBuilder = mock(ExistsBuilderImpl.class);
+        when(curatorFramework.checkExists()).thenReturn(existsBuilder);
+        when(existsBuilder.forPath(anyString())).thenReturn(new Stat());
         boolean exist = client.isExist("/test");
-        assertFalse(exist);
-
-        client.createOrUpdate("/test", "", CreateMode.PERSISTENT);
-        exist = client.isExist("/test");
         assertTrue(exist);
     }
 
     @Test
-    void errorTest() throws NoSuchFieldException, InterruptedException, 
IllegalAccessException {
-        final Field curatorFramework = 
ZookeeperClient.class.getDeclaredField("client");
-        final CuratorFramework curatorFrameworkMock = 
mock(CuratorFramework.class);
-        curatorFramework.setAccessible(true);
-        curatorFramework.set(client, curatorFrameworkMock);
-        
doThrow(InterruptedException.class).when(curatorFrameworkMock).blockUntilConnected();
-        Assertions.assertDoesNotThrow(() -> client.start());
-
-        
doThrow(ShenyuException.class).when(curatorFrameworkMock).checkExists();
-        Assertions.assertThrows(ShenyuException.class, () -> 
client.isExist("key"));
-
-        doThrow(ShenyuException.class).when(curatorFrameworkMock).getData();
-        Assertions.assertThrows(ShenyuException.class, () -> 
client.getDirectly("key"));
-
-        doThrow(ShenyuException.class).when(curatorFrameworkMock).create();
-        Assertions.assertThrows(ShenyuException.class, () -> 
client.createOrUpdate("key", "value", CreateMode.PERSISTENT));
-
-        doThrow(ShenyuException.class).when(curatorFrameworkMock).delete();
-        Assertions.assertThrows(ShenyuException.class, () -> 
client.delete("key"));
-
-        
doThrow(ShenyuException.class).when(curatorFrameworkMock).getChildren();
-        Assertions.assertThrows(ShenyuException.class, () -> 
client.getChildren("key"));
-    }
-
-    @Test
-    void getDirectly() {
-        client.createOrUpdate("/test", "hello", CreateMode.PERSISTENT);
+    void getDirectly() throws Exception {
+        assertThrows(ShenyuException.class, () -> client.getDirectly("/test"));
+        GetDataBuilder getDataBuilder = mock(GetDataBuilder.class);
+        when(curatorFramework.getData()).thenReturn(getDataBuilder);
+        
when(getDataBuilder.forPath(anyString())).thenReturn("hello".getBytes());
         String val = client.getDirectly("/test");
         assertEquals("hello", val);
+        when(getDataBuilder.forPath(anyString())).thenReturn(null);
+        String val2 = client.getDirectly("/test");
+        assertNull(val2);
     }
 
     @Test
-    void get() {
-        client.createOrUpdate("/test", "hello", CreateMode.PERSISTENT);
-        String val = client.get("/test");
-        assertEquals("hello", val);
-    }
-
-    @Test
-    void createOrUpdate() {
-        client.createOrUpdate("/test", "hello", CreateMode.PERSISTENT);
-        String val = client.get("/test");
-        assertEquals("hello", val);
+    void delete() throws Exception {
+        assertThrows(ShenyuException.class, () -> client.delete("/test"));
+        DeleteBuilder deleteBuilder = mock(DeleteBuilder.class);
+        when(curatorFramework.delete()).thenReturn(deleteBuilder);
+        ChildrenDeletable childrenDeletable = mock(ChildrenDeletable.class);
+        when(deleteBuilder.guaranteed()).thenReturn(childrenDeletable);
+        BackgroundVersionable backgroundVersionable = 
mock(BackgroundVersionable.class);
+        
when(childrenDeletable.deletingChildrenIfNeeded()).thenReturn(backgroundVersionable);
+        doNothing().when(backgroundVersionable).forPath(anyString());
+        assertDoesNotThrow(() -> client.delete("/test"));
     }
 
     @Test
-    void testCreateOrUpdate() {
-        MetaData data = new MetaData();
-        data.setAppName("test");
-        client.createOrUpdate("/test", data, CreateMode.PERSISTENT);
-        String val = client.get("/test");
-        assertEquals(GsonUtils.getInstance().toJson(data), val);
-    }
-
-    @Test
-    void delete() {
-        client.createOrUpdate("/test", "hello", CreateMode.PERSISTENT);
-        String val = client.get("/test");
-        assertEquals("hello", val);
-
-        client.delete("/test");
-        boolean exist = client.isExist("/test");
-        assertFalse(exist);
-    }
-
-    @Test
-    void getChildren() {
-        client.createOrUpdate("/test/1", "hello", CreateMode.PERSISTENT);
-        client.createOrUpdate("/test/2", "hello", CreateMode.PERSISTENT);
-
+    void getChildren() throws Exception {
+        assertThrows(ShenyuException.class, () -> client.getChildren("/test"));
+        GetChildrenBuilder getChildrenBuilder = mock(GetChildrenBuilder.class);
+        when(curatorFramework.getChildren()).thenReturn(getChildrenBuilder);
+        when(getChildrenBuilder.forPath(anyString())).thenReturn(new 
ArrayList<>());
         List<String> children = client.getChildren("/test");
-        assertTrue(children.contains("1"));
-        assertTrue(children.contains("2"));
-        assertEquals(2, children.size());
-    }
-
-    @Test
-    void getCache() {
-        TreeCache cache = client.getCache("/test");
-        assertNull(cache);
-
-        client.addCache("/test");
-        cache = client.getCache("/test");
-        assertNotNull(cache);
+        assertEquals(0, children.size());
     }
 
     @Test
-    void configTest() {
-        ZookeeperConfig config = new 
ZookeeperConfig(server.getConnectString());
-        config.setNamespace("namespace");
-        config.setDigest("digest");
-        config.setConnectionTimeoutMilliseconds(0);
-        config.setMaxSleepTimeMilliseconds(0);
-        config.setSessionTimeoutMilliseconds(0);
-        config.setBaseSleepTimeMilliseconds(0);
-        config.setMaxRetries(3);
+    void createOrUpdate() throws Exception {
+        assertThrows(ShenyuException.class, () ->
+                client.createOrUpdate("/test", "hello", 
CreateMode.PERSISTENT));
+        CreateBuilder createBuilder = mock(CreateBuilder.class);
+        when(curatorFramework.create()).thenReturn(createBuilder);
+        CreateBuilder2 createBuilder2 = mock(CreateBuilder2.class);
+        when(createBuilder.orSetData()).thenReturn(createBuilder2);
+        ProtectACLCreateModeStatPathAndBytesable 
protectACLCreateModeStatPathAndBytesable = 
mock(ProtectACLCreateModeStatPathAndBytesable.class);
+        
when(createBuilder2.creatingParentsIfNeeded()).thenReturn(protectACLCreateModeStatPathAndBytesable);
+        ACLBackgroundPathAndBytesable pathAndBytesable = 
mock(ACLBackgroundPathAndBytesable.class);
+        
when(protectACLCreateModeStatPathAndBytesable.withMode(any())).thenReturn(pathAndBytesable);
+        when(pathAndBytesable.forPath(anyString(), 
any(byte[].class))).thenReturn(null);
+        client.createOrUpdate("/test", "hello", CreateMode.PERSISTENT);
+        client.createOrUpdate("", "hello", CreateMode.PERSISTENT);
+        client.createOrUpdate("", (Object) null, CreateMode.PERSISTENT);
+        client.createOrUpdate("", new Object(), CreateMode.PERSISTENT);
     }
 
     @Test
-    void addCache() throws InterruptedException {
-        List<String> paths = new ArrayList<>();
-        TreeCacheListener listener = (client, event) -> {
-            if (event.getType() == TreeCacheEvent.Type.NODE_ADDED || 
event.getType() == TreeCacheEvent.Type.NODE_UPDATED) {
-                paths.add(event.getData().getPath());
-            }
-        };
-        client.createOrUpdate("/test", "", CreateMode.PERSISTENT);
-        client.addCache("/test", listener);
-        TreeCache cache = client.getCache("/test");
-
-        Thread.sleep(500);
-        assertNotNull(cache);
-        assertEquals("/test", paths.get(0));
+    void cacheTest() throws Exception {
+        assertThrows(ShenyuException.class, () -> client.addCache("/path", 
mock(TreeCacheListener.class), mock(TreeCacheListener.class)));
+        Field clientField = ZookeeperClient.class.getDeclaredField("client");
+        clientField.setAccessible(true);
+        CuratorFramework curatorFramework = mock(CuratorFramework.class);
+        clientField.set(client, curatorFramework);
+
+        GetDataBuilder getDataBuilder = mock(GetDataBuilder.class);
+        when(curatorFramework.getData()).thenReturn(getDataBuilder);
+        
when(getDataBuilder.forPath(any())).thenReturn("path".getBytes(StandardCharsets.UTF_8));
+        client.get("/path");
+        client.get("/test");
+        client.getCache("/test");
+        MockedStatic<TreeCache> treeCacheMockedStatic = 
mockStatic(TreeCache.class);
+        TreeCache.Builder treeCacheBuilder = mock(TreeCache.Builder.class);
+        treeCacheMockedStatic.when(() -> TreeCache.newBuilder(any(), 
any())).thenReturn(treeCacheBuilder);
+        TreeCache treeCache = mock(TreeCache.class);
+        when(treeCacheBuilder.build()).thenReturn(treeCache);
+        when(treeCache.start()).thenThrow(ShenyuException.class);
+        Assertions.assertThrows(ShenyuException.class, () -> 
client.addCache("/path"));
+        treeCacheMockedStatic.close();
     }
 }
diff --git 
a/shenyu-sync-data-center/shenyu-sync-data-zookeeper/src/test/java/org/apache/shenyu/sync/data/zookeeper/ZookeeperSyncDataServiceTest.java
 
b/shenyu-sync-data-center/shenyu-sync-data-zookeeper/src/test/java/org/apache/shenyu/sync/data/zookeeper/ZookeeperSyncDataServiceTest.java
index 202889637..b2cf7fa5e 100644
--- 
a/shenyu-sync-data-center/shenyu-sync-data-zookeeper/src/test/java/org/apache/shenyu/sync/data/zookeeper/ZookeeperSyncDataServiceTest.java
+++ 
b/shenyu-sync-data-center/shenyu-sync-data-zookeeper/src/test/java/org/apache/shenyu/sync/data/zookeeper/ZookeeperSyncDataServiceTest.java
@@ -17,376 +17,84 @@
 
 package org.apache.shenyu.sync.data.zookeeper;
 
-import com.google.common.collect.Lists;
-import org.apache.curator.test.TestingServer;
-import org.apache.shenyu.common.constant.DefaultPathConstants;
-import org.apache.shenyu.common.dto.AppAuthData;
-import org.apache.shenyu.common.dto.MetaData;
-import org.apache.shenyu.common.dto.PluginData;
-import org.apache.shenyu.common.dto.RuleData;
-import org.apache.shenyu.common.dto.SelectorData;
+import org.apache.curator.framework.CuratorFramework;
+import org.apache.curator.framework.recipes.cache.ChildData;
+import org.apache.curator.framework.recipes.cache.TreeCacheEvent;
+import org.apache.curator.framework.recipes.cache.TreeCacheListener;
 import org.apache.shenyu.sync.data.api.AuthDataSubscriber;
 import org.apache.shenyu.sync.data.api.MetaDataSubscriber;
 import org.apache.shenyu.sync.data.api.PluginDataSubscriber;
-import org.apache.zookeeper.CreateMode;
-import org.junit.jupiter.api.AfterEach;
-import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
+import org.springframework.util.ObjectUtils;
 
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 
-import static junit.framework.TestCase.assertTrue;
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.hamcrest.core.Is.is;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.doAnswer;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
 
 public final class ZookeeperSyncDataServiceTest {
 
-    private static final String MOCK_PLUGIN_PARENT_PATH = "/shenyu/plugin";
-
-    private static final String MOCK_PLUGIN_PATH = "/shenyu/plugin/divide";
-
-    private static final String MOCK_PLUGIN_NAME = "divide";
-
-    private static final String MOCK_SELECTOR_PARENT_PATH = 
"/shenyu/selector/divide";
-
-    private static final String MOCK_SELECTOR_PATH = 
"/shenyu/selector/divide/test";
-
-    private static final String MOCK_SELECTOR_NAME = "test";
-
-    private static final String MOCK_RULE_PARENT_PATH = "/shenyu/rule/divide";
-
-    private static final String MOCK_RULE_PATH = 
"/shenyu/rule/divide/test-test";
-
-    private static final String MOCK_RULE_NAME = "test-test";
-
-    private static final String MOCK_APP_AUTH_PARENT_PATH = "/shenyu/auth";
-
-    private static final String MOCK_APP_AUTH_PATH = "/shenyu/auth/test";
-
-    private static final String MOCK_APP_AUTH_KEY = "test";
-
-    private static final String MOCK_META_DATA_PARENT_PATH = 
"/shenyu/metaData";
-
-    private static final String MOCK_META_DATA_PATH = "/shenyu/metaData/test";
-
-    private static final String MOCK_META_DATA_ID = "test";
-
-    private ZookeeperClient zkClient;
-
-    private ZookeeperSyncDataService syncDataService;
-
-    @BeforeEach
-    public void setUp() throws Exception {
-        TestingServer server = new TestingServer();
-        ZookeeperConfig config = new 
ZookeeperConfig(server.getConnectString());
-        zkClient = new ZookeeperClient(config);
-        zkClient.start();
-    }
-
-    @Test
-    public void testWatchPluginWhenInit() throws InterruptedException {
-        final List<PluginData> subscribeList = new ArrayList<>(1);
-        PluginData pluginData = 
PluginData.builder().name(MOCK_PLUGIN_NAME).enabled(Boolean.FALSE).build();
-        zkClient.createOrUpdate(MOCK_PLUGIN_PATH, pluginData, 
CreateMode.PERSISTENT);
-
-        syncDataService = new ZookeeperSyncDataService(zkClient, new 
PluginDataSubscriber() {
-            @Override
-            public void onSubscribe(final PluginData pluginData) {
-                subscribeList.add(pluginData);
-            }
-        }, Collections.emptyList(), Collections.emptyList());
-        // wait for listener taking action
-        Thread.sleep(200);
-        assertThat(subscribeList.size(), is(1));
-        assertThat(subscribeList.get(0).getName(), is("divide"));
-    }
-
-    @Test
-    public void testWatchPluginWhenDataChange() throws Exception {
-        final List<PluginData> subscribeList = new ArrayList<>(1);
-        syncDataService = new ZookeeperSyncDataService(zkClient, new 
PluginDataSubscriber() {
-            @Override
-            public void onSubscribe(final PluginData pluginData) {
-                subscribeList.add(pluginData);
-            }
-        }, Collections.emptyList(), Collections.emptyList());
-
-        PluginData pluginData = 
PluginData.builder().name(MOCK_PLUGIN_NAME).enabled(Boolean.FALSE).build();
-        zkClient.createOrUpdate(MOCK_PLUGIN_PATH, pluginData, 
CreateMode.PERSISTENT);
-        // wait for listener taking action
-        Thread.sleep(200);
-        assertThat(subscribeList.size(), is(1));
-        assertThat(subscribeList.get(0).getName(), is("divide"));
-    }
-
-    @Test
-    public void testWatchPluginWhenDataDeleted() throws Exception {
-        final List<PluginData> unSubscribeList = new ArrayList<>(1);
-        PluginData pluginData = 
PluginData.builder().name(MOCK_PLUGIN_NAME).enabled(Boolean.FALSE).build();
-        zkClient.createOrUpdate(MOCK_PLUGIN_PATH, pluginData, 
CreateMode.PERSISTENT);
-
-        syncDataService = new ZookeeperSyncDataService(zkClient, new 
PluginDataSubscriber() {
-            @Override
-            public void unSubscribe(final PluginData pluginData) {
-                unSubscribeList.add(pluginData);
-            }
-        }, Collections.emptyList(), Collections.emptyList());
-        Thread.sleep(200);
-        zkClient.delete(MOCK_PLUGIN_PATH);
-        // wait for listener taking action
-        Thread.sleep(200);
-        assertThat(unSubscribeList.size(), is(1));
-        assertThat(unSubscribeList.get(0).getName(), is("divide"));
-    }
-
-    @Test
-    public void testWatchSelectorWhenInit() throws InterruptedException {
-        final List<SelectorData> subscribeList = new ArrayList<>(1);
-        SelectorData selectorData = 
SelectorData.builder().name(MOCK_SELECTOR_NAME).enabled(Boolean.FALSE).build();
-        zkClient.createOrUpdate(MOCK_SELECTOR_PATH, selectorData, 
CreateMode.PERSISTENT);
-        syncDataService = new ZookeeperSyncDataService(zkClient, new 
PluginDataSubscriber() {
-            @Override
-            public void onSelectorSubscribe(final SelectorData selectorData) {
-                subscribeList.add(selectorData);
-            }
-        }, Collections.emptyList(), Collections.emptyList());
-        Thread.sleep(200);
-        assertThat(subscribeList.size(), is(1));
-        assertThat(subscribeList.get(0).getName(), is("test"));
-    }
-
-    @Test
-    public void testWatchSelectorWhenDataChange() throws Exception {
-        final List<SelectorData> subscribeList = new ArrayList<>(1);
-        SelectorData selectorData = 
SelectorData.builder().name(MOCK_SELECTOR_NAME).enabled(Boolean.FALSE).build();
-        zkClient.createOrUpdate(MOCK_SELECTOR_PATH, selectorData, 
CreateMode.PERSISTENT);
-        syncDataService = new ZookeeperSyncDataService(zkClient, new 
PluginDataSubscriber() {
-            @Override
-            public void onSelectorSubscribe(final SelectorData selectorData) {
-                subscribeList.add(selectorData);
-            }
-        }, Collections.emptyList(), Collections.emptyList());
-        Thread.sleep(200);
-        zkClient.createOrUpdate(MOCK_SELECTOR_PATH, selectorData, 
CreateMode.PERSISTENT);
-        Thread.sleep(200);
-        assertThat(subscribeList.size(), is(2));
-        assertThat(subscribeList.get(0).getName(), is("test"));
-    }
-
-    @Test
-    public void testWatchSelectorWhenDataDeleted() throws Exception {
-        final List<SelectorData> unSubscribeList = new ArrayList<>(1);
-        SelectorData selectorData = 
SelectorData.builder().name(MOCK_SELECTOR_NAME).enabled(Boolean.FALSE).build();
-        zkClient.createOrUpdate(MOCK_SELECTOR_PATH, selectorData, 
CreateMode.PERSISTENT);
-        syncDataService = new ZookeeperSyncDataService(zkClient, new 
PluginDataSubscriber() {
-            @Override
-            public void unSelectorSubscribe(final SelectorData selectorData) {
-                unSubscribeList.add(selectorData);
-            }
-        }, Collections.emptyList(), Collections.emptyList());
-        Thread.sleep(200);
-        zkClient.delete(MOCK_SELECTOR_PATH);
-        Thread.sleep(200);
-        assertThat(unSubscribeList.size(), is(1));
-        assertThat(unSubscribeList.get(0).getId(), is("test"));
-    }
-
     @Test
-    public void testWatchRuleWhenInit() throws InterruptedException {
-        final List<RuleData> subscribeList = new ArrayList<>(1);
-        RuleData ruleData = 
RuleData.builder().name(MOCK_RULE_NAME).enabled(Boolean.FALSE).build();
-        zkClient.createOrUpdate(MOCK_RULE_PATH, ruleData, 
CreateMode.PERSISTENT);
-        syncDataService = new ZookeeperSyncDataService(zkClient, new 
PluginDataSubscriber() {
-            @Override
-            public void onRuleSubscribe(final RuleData data) {
-                subscribeList.add(data);
-            }
-        }, Collections.emptyList(), Collections.emptyList());
-        Thread.sleep(200);
-        assertThat(subscribeList.size(), is(1));
-        assertThat(subscribeList.get(0).getName(), is(MOCK_RULE_NAME));
-    }
-
-    @Test
-    public void testWatchRuleWhenDataChange() throws Exception {
-        final List<RuleData> subscribeList = new ArrayList<>(1);
-        RuleData ruleData = 
RuleData.builder().name(MOCK_RULE_NAME).enabled(Boolean.FALSE).build();
-        zkClient.createOrUpdate(MOCK_RULE_PATH, ruleData, 
CreateMode.PERSISTENT);
-        syncDataService = new ZookeeperSyncDataService(zkClient, new 
PluginDataSubscriber() {
-            @Override
-            public void onRuleSubscribe(final RuleData data) {
-                subscribeList.add(data);
-            }
-        }, Collections.emptyList(), Collections.emptyList());
-        Thread.sleep(200);
-        zkClient.createOrUpdate(MOCK_RULE_PATH, ruleData, 
CreateMode.PERSISTENT);
-        Thread.sleep(200);
-        assertThat(subscribeList.size(), is(2));
-        assertThat(subscribeList.get(0).getName(), is(MOCK_RULE_NAME));
-    }
-
-    @Test
-    public void testWatchRuleWhenDataDeleted() throws Exception {
-        final List<RuleData> unSubscribeList = new ArrayList<>(1);
-        RuleData ruleData = 
RuleData.builder().name(MOCK_RULE_NAME).enabled(Boolean.FALSE).build();
-        zkClient.createOrUpdate(MOCK_RULE_PATH, ruleData, 
CreateMode.PERSISTENT);
-        syncDataService = new ZookeeperSyncDataService(zkClient, new 
PluginDataSubscriber() {
-            @Override
-            public void unRuleSubscribe(final RuleData data) {
-                unSubscribeList.add(data);
-            }
-        }, Collections.emptyList(), Collections.emptyList());
-        Thread.sleep(200);
-        zkClient.delete(MOCK_RULE_PATH);
-        Thread.sleep(200);
-        assertThat(unSubscribeList.size(), is(1));
-        assertThat(unSubscribeList.get(0).getSelectorId() + 
DefaultPathConstants.SELECTOR_JOIN_RULE + unSubscribeList.get(0).getId(), 
is(MOCK_RULE_NAME));
-    }
-
-    @Test
-    public void testWatchAppAuthWhenInit() throws InterruptedException {
-        final List<AppAuthData> subscribeList = new ArrayList<>(1);
-        AppAuthData appAuthData = 
AppAuthData.builder().appKey(MOCK_APP_AUTH_KEY).enabled(Boolean.FALSE).build();
-        zkClient.createOrUpdate(MOCK_APP_AUTH_PATH, appAuthData, 
CreateMode.PERSISTENT);
-        AuthDataSubscriber authDataSubscriber = new AuthDataSubscriber() {
-            @Override
-            public void onSubscribe(final AppAuthData appAuthData) {
-                subscribeList.add(appAuthData);
-            }
-
-            @Override
-            public void unSubscribe(final AppAuthData appAuthData) {
-            }
-        };
-        syncDataService = new ZookeeperSyncDataService(zkClient,
-                null, Collections.emptyList(), 
Lists.newArrayList(authDataSubscriber));
-        Thread.sleep(200);
-        assertThat(subscribeList.size(), is(1));
-    }
-
-    @Test
-    public void testWatchAppAuthWhenDataChange() throws Exception {
-        final List<AppAuthData> subscribeList = new ArrayList<>(1);
-        AppAuthData appAuthData = 
AppAuthData.builder().appKey(MOCK_APP_AUTH_KEY).enabled(Boolean.FALSE).build();
-        zkClient.createOrUpdate(MOCK_APP_AUTH_PATH, appAuthData, 
CreateMode.PERSISTENT);
-        AuthDataSubscriber authDataSubscriber = new AuthDataSubscriber() {
-            @Override
-            public void onSubscribe(final AppAuthData appAuthData) {
-                subscribeList.add(appAuthData);
-            }
-
-            @Override
-            public void unSubscribe(final AppAuthData appAuthData) {
-            }
-        };
-        syncDataService = new ZookeeperSyncDataService(zkClient,
-                null, Collections.emptyList(), 
Lists.newArrayList(authDataSubscriber));
-        Thread.sleep(200);
-        appAuthData.setEnabled(true);
-        zkClient.createOrUpdate(MOCK_APP_AUTH_PATH, appAuthData, 
CreateMode.PERSISTENT);
-        Thread.sleep(200);
-        assertThat(subscribeList.size(), is(2));
-        assertTrue(subscribeList.get(1).getEnabled());
-    }
-
-    @Test
-    public void testWatchAppAuthWhenDataDeleted() throws Exception {
-        final List<AppAuthData> unSubscribeList = new ArrayList<>(1);
-        AppAuthData appAuthData = 
AppAuthData.builder().appKey(MOCK_APP_AUTH_KEY).enabled(Boolean.FALSE).build();
-        zkClient.createOrUpdate(MOCK_APP_AUTH_PATH, appAuthData, 
CreateMode.PERSISTENT);
-        AuthDataSubscriber authDataSubscriber = new AuthDataSubscriber() {
-            @Override
-            public void onSubscribe(final AppAuthData appAuthData) {
-            }
-
-            @Override
-            public void unSubscribe(final AppAuthData appAuthData) {
-                unSubscribeList.add(appAuthData);
-            }
-        };
-        syncDataService = new ZookeeperSyncDataService(zkClient,
-                null, Collections.emptyList(), 
Lists.newArrayList(authDataSubscriber));
-        Thread.sleep(200);
-        zkClient.delete(MOCK_APP_AUTH_PATH);
-        Thread.sleep(200);
-        assertThat(unSubscribeList.size(), is(1));
-        assertThat(unSubscribeList.get(0).getAppKey(), is(MOCK_APP_AUTH_KEY));
-    }
-
-    @Test
-    public void testWatchMetaDataWhenInit() throws InterruptedException {
-        final List<MetaData> subscribeList = new ArrayList<>(1);
-        MetaData metaData = 
MetaData.builder().id(MOCK_META_DATA_ID).enabled(Boolean.FALSE).build();
-        zkClient.createOrUpdate(MOCK_META_DATA_PATH, metaData, 
CreateMode.PERSISTENT);
-        MetaDataSubscriber metaDataSubscriber = new MetaDataSubscriber() {
-            @Override
-            public void onSubscribe(final MetaData metaData) {
-                subscribeList.add(metaData);
-            }
-
-            @Override
-            public void unSubscribe(final MetaData metaData) {
-            }
-        };
-        syncDataService = new ZookeeperSyncDataService(zkClient,
-                null, Lists.newArrayList(metaDataSubscriber), 
Collections.emptyList());
-        Thread.sleep(200);
-        assertThat(subscribeList.size(), is(1));
+    public void testZookeeperInstanceRegisterRepository() throws Exception {
+
+        ZookeeperClient zkClient = mock(ZookeeperClient.class);
+        PluginDataSubscriber pluginDataSubscriber = 
mock(PluginDataSubscriber.class);
+
+        List<TreeCacheListener> treeCacheListeners = new ArrayList<>();
+        doAnswer(invocationOnMock -> {
+            treeCacheListeners.add(invocationOnMock.getArgument(1));
+            return null;
+        }).when(zkClient).addCache(any(), any());
+        final AuthDataSubscriber authDataSubscriber = 
mock(AuthDataSubscriber.class);
+        final MetaDataSubscriber metaDataSubscriber = 
mock(MetaDataSubscriber.class);
+        final ZookeeperSyncDataService zookeeperSyncDataService = new 
ZookeeperSyncDataService(zkClient,
+                pluginDataSubscriber, 
Collections.singletonList(metaDataSubscriber), 
Collections.singletonList(authDataSubscriber));
+
+        List<TreeCacheEvent> treeCacheEvents = new ArrayList<>();
+        // register uri
+        treeCacheEvents.add(treeCacheEvent("/shenyu/uri/test/test/test", 
TreeCacheEvent.Type.NODE_REMOVED));
+        // register metadata
+        treeCacheEvents.add(treeCacheEvent("/shenyu/metaData/test", 
TreeCacheEvent.Type.NODE_REMOVED));
+        // register auth
+        treeCacheEvents.add(treeCacheEvent("/shenyu/auth/test", 
TreeCacheEvent.Type.NODE_REMOVED));
+        // register rule
+        treeCacheEvents.add(treeCacheEvent("/shenyu/rule/test/test-1", 
TreeCacheEvent.Type.NODE_REMOVED));
+        // register plugin
+        treeCacheEvents.add(treeCacheEvent("/shenyu/plugin/test", 
TreeCacheEvent.Type.NODE_REMOVED));
+        // register selector
+        treeCacheEvents.add(treeCacheEvent("/shenyu/selector/test/test", 
TreeCacheEvent.Type.NODE_REMOVED));
+
+        final CuratorFramework curatorFramework = mock(CuratorFramework.class);
+        for (TreeCacheListener treeCacheListener : treeCacheListeners) {
+            for (TreeCacheEvent event : treeCacheEvents) {
+                treeCacheListener.childEvent(curatorFramework, event);
+            }
+        }
+        final TreeCacheListener treeCacheListener = 
treeCacheListeners.stream().findFirst().orElse(null);
+        if (!ObjectUtils.isEmpty(treeCacheListener)) {
+            TreeCacheEvent event = mock(TreeCacheEvent.class);
+            ChildData childData = mock(ChildData.class);
+            treeCacheListener.childEvent(curatorFramework, event);
+            when(event.getData()).thenReturn(childData);
+            when(childData.getPath()).thenReturn("");
+            treeCacheListener.childEvent(curatorFramework, event);
+        }
+
+        zookeeperSyncDataService.close();
+    }
+
+    private static TreeCacheEvent treeCacheEvent(final String path, final 
TreeCacheEvent.Type type) {
+        TreeCacheEvent treeCacheEvent = mock(TreeCacheEvent.class);
+        ChildData childData = mock(ChildData.class);
+        when(treeCacheEvent.getData()).thenReturn(childData);
+        when(treeCacheEvent.getType()).thenReturn(type);
+        when(childData.getPath()).thenReturn(path);
+        when(childData.getData()).thenReturn("{}".getBytes());
+        return treeCacheEvent;
     }
 
-    @Test
-    public void testWatchMetaDataWhenDataChange() throws Exception {
-        final List<MetaData> subscribeList = new ArrayList<>(1);
-        MetaData metaData = 
MetaData.builder().id(MOCK_META_DATA_ID).enabled(Boolean.FALSE).build();
-        zkClient.createOrUpdate(MOCK_META_DATA_PATH, metaData, 
CreateMode.PERSISTENT);
-        MetaDataSubscriber metaDataSubscriber = new MetaDataSubscriber() {
-            @Override
-            public void onSubscribe(final MetaData metaData) {
-                subscribeList.add(metaData);
-            }
-
-            @Override
-            public void unSubscribe(final MetaData metaData) {
-            }
-        };
-        syncDataService = new ZookeeperSyncDataService(zkClient,
-                null, Lists.newArrayList(metaDataSubscriber), 
Collections.emptyList());
-        Thread.sleep(200);
-        metaData.setEnabled(true);
-        zkClient.createOrUpdate(MOCK_META_DATA_PATH, metaData, 
CreateMode.PERSISTENT);
-        Thread.sleep(200);
-        assertThat(subscribeList.size(), is(2));
-        assertTrue(subscribeList.get(1).getEnabled());
-    }
-
-    @Test
-    public void testWatchMetaDataWhenDataDeleted() throws Exception {
-        final List<MetaData> unSubscribeList = new ArrayList<>(1);
-        MetaData metaData = 
MetaData.builder().id(MOCK_META_DATA_ID).enabled(Boolean.FALSE).build();
-        zkClient.createOrUpdate(MOCK_META_DATA_PATH, metaData, 
CreateMode.PERSISTENT);
-        MetaDataSubscriber metaDataSubscriber = new MetaDataSubscriber() {
-            @Override
-            public void onSubscribe(final MetaData metaData) {
-            }
-
-            @Override
-            public void unSubscribe(final MetaData metaData) {
-                unSubscribeList.add(metaData);
-            }
-        };
-        syncDataService = new ZookeeperSyncDataService(zkClient,
-                null, Lists.newArrayList(metaDataSubscriber), 
Collections.emptyList());
-        Thread.sleep(200);
-        zkClient.delete(MOCK_META_DATA_PATH);
-        Thread.sleep(200);
-        assertThat(unSubscribeList.size(), is(1));
-        assertThat(unSubscribeList.get(0).getPath(), is(MOCK_META_DATA_ID));
-    }
-
-    @AfterEach
-    public void tearDown() {
-        syncDataService.close();
-    }
 }

Reply via email to