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

rainyu pushed a commit to branch 3.3
in repository https://gitbox.apache.org/repos/asf/dubbo.git


The following commit(s) were added to refs/heads/3.3 by this push:
     new f2d5ba9a7d feat(registry): support the  option, whether to check the 
connection … (#15594)
f2d5ba9a7d is described below

commit f2d5ba9a7d10c6e5e58cf86a4ca4bc3efa0a7c31
Author: fantiq <[email protected]>
AuthorDate: Mon Oct 20 21:18:26 2025 +0800

    feat(registry): support the  option, whether to check the connection … 
(#15594)
    
    * feat(registry): support the  option, whether to check the connection 
status or not.
    
    * use option  directly
    
    * add connect check before retry task
    
    * feat(optimizate): extract method isCheck(URL)
    
    * fix code fmt
    
    * fix code fmt
    
    * fix: dup mock object
    
    ---------
    
    Co-authored-by: Rain Yu <[email protected]>
---
 .../org/apache/dubbo/common/utils/UrlUtils.java    |  5 ++
 .../dubbo/registry/retry/AbstractRetryTask.java    |  3 +
 .../registry/support/AbstractRegistryFactory.java  |  4 +-
 .../registry/nacos/NacosConnectionManager.java     |  8 ++-
 .../nacos/util/NacosNamingServiceUtils.java        |  4 ++
 .../zookeeper/util/CuratorFrameworkUtils.java      |  4 +-
 .../zookeeper/ZookeeperServiceDiscoveryTest.java   | 41 +++++++++++---
 .../zookeeper/util/CuratorFrameworkUtilsTest.java  | 20 +++++++
 .../curator5/Curator5ZookeeperClient.java          |  5 +-
 .../Curator5ZookeeperClientManagerTest.java        | 66 +++++++++++++++++-----
 .../curator5/Curator5ZookeeperClientTest.java      | 11 ++++
 11 files changed, 144 insertions(+), 27 deletions(-)

diff --git 
a/dubbo-common/src/main/java/org/apache/dubbo/common/utils/UrlUtils.java 
b/dubbo-common/src/main/java/org/apache/dubbo/common/utils/UrlUtils.java
index 939945cb5d..8075ba189f 100644
--- a/dubbo-common/src/main/java/org/apache/dubbo/common/utils/UrlUtils.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/common/utils/UrlUtils.java
@@ -35,6 +35,7 @@ import java.util.stream.Collectors;
 
 import static java.util.Collections.emptyMap;
 import static org.apache.dubbo.common.constants.CommonConstants.ANY_VALUE;
+import static org.apache.dubbo.common.constants.CommonConstants.CHECK_KEY;
 import static org.apache.dubbo.common.constants.CommonConstants.CLASSIFIER_KEY;
 import static 
org.apache.dubbo.common.constants.CommonConstants.COMMA_SPLIT_PATTERN;
 import static org.apache.dubbo.common.constants.CommonConstants.CONSUMER;
@@ -522,6 +523,10 @@ public class UrlUtils {
                 || (url.getProtocol() != null && 
url.getProtocol().endsWith("-registry-protocol"));
     }
 
+    public static boolean isCheck(URL url) {
+        return url.getParameter(CHECK_KEY, true) && url.getPort() != 0;
+    }
+
     /**
      * The specified {@link URL} is service discovery registry type or not
      *
diff --git 
a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/retry/AbstractRetryTask.java
 
b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/retry/AbstractRetryTask.java
index 2c7aef76d3..b32cbe263d 100644
--- 
a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/retry/AbstractRetryTask.java
+++ 
b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/retry/AbstractRetryTask.java
@@ -124,6 +124,9 @@ public abstract class AbstractRetryTask implements 
TimerTask {
             logger.info(taskName + " : " + url);
         }
         try {
+            if (!registry.isAvailable()) {
+                throw new IllegalStateException("Registry is not available.");
+            }
             doRetry(url, registry, timeout);
         } catch (Throwable t) { // Ignore all the exceptions and wait for the 
next retry
 
diff --git 
a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/support/AbstractRegistryFactory.java
 
b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/support/AbstractRegistryFactory.java
index c24d4c6b3f..cf97d55b07 100644
--- 
a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/support/AbstractRegistryFactory.java
+++ 
b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/support/AbstractRegistryFactory.java
@@ -20,13 +20,13 @@ import org.apache.dubbo.common.URL;
 import org.apache.dubbo.common.URLBuilder;
 import org.apache.dubbo.common.logger.ErrorTypeAwareLogger;
 import org.apache.dubbo.common.logger.LoggerFactory;
+import org.apache.dubbo.common.utils.UrlUtils;
 import org.apache.dubbo.registry.Registry;
 import org.apache.dubbo.registry.RegistryFactory;
 import org.apache.dubbo.registry.RegistryService;
 import org.apache.dubbo.rpc.model.ApplicationModel;
 import org.apache.dubbo.rpc.model.ScopeModelAware;
 
-import static org.apache.dubbo.common.constants.CommonConstants.CHECK_KEY;
 import static org.apache.dubbo.common.constants.CommonConstants.INTERFACE_KEY;
 import static org.apache.dubbo.common.constants.CommonConstants.TIMESTAMP_KEY;
 import static 
org.apache.dubbo.common.constants.LoggerCodeConstants.REGISTRY_FAILED_CREATE_INSTANCE;
@@ -74,7 +74,7 @@ public abstract class AbstractRegistryFactory implements 
RegistryFactory, ScopeM
 
         String key = createRegistryCacheKey(url);
         Registry registry = null;
-        boolean check = url.getParameter(CHECK_KEY, true) && url.getPort() != 
0;
+        boolean check = UrlUtils.isCheck(url);
 
         // Lock the registry access process to ensure a single instance of the 
registry
         registryManager.getRegistryLock().lock();
diff --git 
a/dubbo-registry/dubbo-registry-nacos/src/main/java/org/apache/dubbo/registry/nacos/NacosConnectionManager.java
 
b/dubbo-registry/dubbo-registry-nacos/src/main/java/org/apache/dubbo/registry/nacos/NacosConnectionManager.java
index 326da55bb1..fd62b135ff 100644
--- 
a/dubbo-registry/dubbo-registry-nacos/src/main/java/org/apache/dubbo/registry/nacos/NacosConnectionManager.java
+++ 
b/dubbo-registry/dubbo-registry-nacos/src/main/java/org/apache/dubbo/registry/nacos/NacosConnectionManager.java
@@ -60,11 +60,14 @@ public class NacosConnectionManager {
 
     private final boolean check;
 
+    private final Properties nacosProperties;
+
     public NacosConnectionManager(URL connectionURL, boolean check, int 
retryTimes, int sleepMsBetweenRetries) {
         this.connectionURL = connectionURL;
         this.check = check;
         this.retryTimes = retryTimes;
         this.sleepMsBetweenRetries = sleepMsBetweenRetries;
+        this.nacosProperties = buildNacosProperties(this.connectionURL);
         // create default one
         this.namingServiceList.add(createNamingService());
     }
@@ -78,6 +81,7 @@ public class NacosConnectionManager {
         this.retryTimes = 0;
         this.sleepMsBetweenRetries = 0;
         this.check = false;
+        this.nacosProperties = null;
         // create default one
         this.namingServiceList.add(namingService);
     }
@@ -116,7 +120,6 @@ public class NacosConnectionManager {
      * @return {@link NamingService}
      */
     protected NamingService createNamingService() {
-        Properties nacosProperties = buildNacosProperties(this.connectionURL);
         NamingService namingService = null;
         try {
             for (int i = 0; i < retryTimes + 1; i++) {
@@ -177,6 +180,9 @@ public class NacosConnectionManager {
 
     private Properties buildNacosProperties(URL url) {
         Properties properties = new Properties();
+        if (StringUtils.isEmpty(url.getHost())) {
+            return properties;
+        }
         setServerAddr(url, properties);
         setProperties(url, properties);
         return properties;
diff --git 
a/dubbo-registry/dubbo-registry-nacos/src/main/java/org/apache/dubbo/registry/nacos/util/NacosNamingServiceUtils.java
 
b/dubbo-registry/dubbo-registry-nacos/src/main/java/org/apache/dubbo/registry/nacos/util/NacosNamingServiceUtils.java
index 8a87e23d25..b5da08c54e 100644
--- 
a/dubbo-registry/dubbo-registry-nacos/src/main/java/org/apache/dubbo/registry/nacos/util/NacosNamingServiceUtils.java
+++ 
b/dubbo-registry/dubbo-registry-nacos/src/main/java/org/apache/dubbo/registry/nacos/util/NacosNamingServiceUtils.java
@@ -19,6 +19,7 @@ package org.apache.dubbo.registry.nacos.util;
 import org.apache.dubbo.common.URL;
 import org.apache.dubbo.common.logger.ErrorTypeAwareLogger;
 import org.apache.dubbo.common.logger.LoggerFactory;
+import org.apache.dubbo.common.utils.UrlUtils;
 import org.apache.dubbo.registry.client.DefaultServiceInstance;
 import org.apache.dubbo.registry.client.ServiceInstance;
 import org.apache.dubbo.registry.nacos.NacosConnectionManager;
@@ -114,6 +115,9 @@ public class NacosNamingServiceUtils {
         boolean check = connectionURL.getParameter(NACOS_CHECK_KEY, true);
         int retryTimes = connectionURL.getPositiveParameter(NACOS_RETRY_KEY, 
10);
         int sleepMsBetweenRetries = 
connectionURL.getPositiveParameter(NACOS_RETRY_WAIT_KEY, 10);
+        if (check && !UrlUtils.isCheck(connectionURL)) {
+            check = false;
+        }
         NacosConnectionManager nacosConnectionManager =
                 new NacosConnectionManager(connectionURL, check, retryTimes, 
sleepMsBetweenRetries);
         return new NacosNamingServiceWrapper(nacosConnectionManager, 
retryTimes, sleepMsBetweenRetries);
diff --git 
a/dubbo-registry/dubbo-registry-zookeeper/src/main/java/org/apache/dubbo/registry/zookeeper/util/CuratorFrameworkUtils.java
 
b/dubbo-registry/dubbo-registry-zookeeper/src/main/java/org/apache/dubbo/registry/zookeeper/util/CuratorFrameworkUtils.java
index ecf88f4b4f..e2761c68af 100644
--- 
a/dubbo-registry/dubbo-registry-zookeeper/src/main/java/org/apache/dubbo/registry/zookeeper/util/CuratorFrameworkUtils.java
+++ 
b/dubbo-registry/dubbo-registry-zookeeper/src/main/java/org/apache/dubbo/registry/zookeeper/util/CuratorFrameworkUtils.java
@@ -18,6 +18,7 @@ package org.apache.dubbo.registry.zookeeper.util;
 
 import org.apache.dubbo.common.URL;
 import org.apache.dubbo.common.utils.StringUtils;
+import org.apache.dubbo.common.utils.UrlUtils;
 import org.apache.dubbo.registry.client.DefaultServiceInstance;
 import org.apache.dubbo.registry.client.ServiceInstance;
 import org.apache.dubbo.registry.zookeeper.ZookeeperInstance;
@@ -117,7 +118,8 @@ public abstract class CuratorFrameworkUtils {
             throw new IllegalStateException("zookeeper client initialization 
failed");
         }
 
-        if (!curatorFramework.getZookeeperClient().isConnected()) {
+        boolean check = UrlUtils.isCheck(connectionURL);
+        if (check && !curatorFramework.getZookeeperClient().isConnected()) {
             throw new IllegalStateException("failed to connect to zookeeper 
server");
         }
 
diff --git 
a/dubbo-registry/dubbo-registry-zookeeper/src/test/java/org/apache/dubbo/registry/zookeeper/ZookeeperServiceDiscoveryTest.java
 
b/dubbo-registry/dubbo-registry-zookeeper/src/test/java/org/apache/dubbo/registry/zookeeper/ZookeeperServiceDiscoveryTest.java
index 3243a30ea3..68191a022d 100644
--- 
a/dubbo-registry/dubbo-registry-zookeeper/src/test/java/org/apache/dubbo/registry/zookeeper/ZookeeperServiceDiscoveryTest.java
+++ 
b/dubbo-registry/dubbo-registry-zookeeper/src/test/java/org/apache/dubbo/registry/zookeeper/ZookeeperServiceDiscoveryTest.java
@@ -41,6 +41,7 @@ import org.apache.curator.x.discovery.ServiceDiscovery;
 import org.apache.curator.x.discovery.ServiceDiscoveryBuilder;
 import org.junit.jupiter.api.AfterAll;
 import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
@@ -50,6 +51,7 @@ import org.mockito.MockedStatic;
 import org.mockito.internal.util.collections.Sets;
 
 import static java.util.Arrays.asList;
+import static org.apache.dubbo.common.constants.CommonConstants.CHECK_KEY;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 import static org.mockito.ArgumentMatchers.any;
@@ -84,23 +86,20 @@ class ZookeeperServiceDiscoveryTest {
     private ServiceDiscovery mockServiceDiscovery;
     private ServiceCacheBuilder mockServiceCacheBuilder;
     private ServiceCache mockServiceCache;
+    private static final CuratorFrameworkFactory.Builder spyBuilder = 
spy(CuratorFrameworkFactory.builder());
 
     @BeforeAll
     public static void beforeAll() {
         zookeeperConnectionAddress1 = "zookeeper://localhost:" + "2181";
-    }
-
-    @BeforeEach
-    public void init() throws Exception {
-        // mock begin
-        // create mock bean begin
-        CuratorFrameworkFactory.Builder realBuilder = 
CuratorFrameworkFactory.builder();
-        CuratorFrameworkFactory.Builder spyBuilder = spy(realBuilder);
         curatorFrameworkFactoryMockedStatic = 
mockStatic(CuratorFrameworkFactory.class);
         curatorFrameworkFactoryMockedStatic
                 .when(CuratorFrameworkFactory::builder)
                 .thenReturn(spyBuilder);
         serviceDiscoveryBuilderMockedStatic = 
mockStatic(ServiceDiscoveryBuilder.class);
+    }
+
+    @BeforeEach
+    public void init() throws Exception {
         mockServiceDiscoveryBuilder = mock(ServiceDiscoveryBuilder.class);
         mockServiceDiscovery = mock(ServiceDiscovery.class);
         mockServiceCacheBuilder = mock(ServiceCacheBuilder.class);
@@ -200,6 +199,32 @@ class ZookeeperServiceDiscoveryTest {
         assertTrue(serviceInstances.isEmpty());
     }
 
+    @Test
+    void testRegistryCheckConnectDefault() {
+        when(mockCuratorZookeeperClient.isConnected()).thenReturn(false);
+
+        URL registryUrl = URL.valueOf(zookeeperConnectionAddress1);
+        ApplicationModel applicationModel = ApplicationModel.defaultModel();
+        registryUrl.setScopeModel(applicationModel);
+
+        Assertions.assertThrowsExactly(IllegalStateException.class, () -> {
+            new ZookeeperServiceDiscovery(applicationModel, registryUrl);
+        });
+    }
+
+    @Test
+    void testRegistryNotCheckConnect() {
+        when(mockCuratorZookeeperClient.isConnected()).thenReturn(false);
+
+        URL registryUrl = 
URL.valueOf(zookeeperConnectionAddress1).addParameter(CHECK_KEY, false);
+        ApplicationModel applicationModel = ApplicationModel.defaultModel();
+        registryUrl.setScopeModel(applicationModel);
+
+        Assertions.assertDoesNotThrow(() -> {
+            new ZookeeperServiceDiscovery(applicationModel, registryUrl);
+        });
+    }
+
     @AfterAll
     public static void afterAll() throws Exception {
         if (curatorFrameworkFactoryMockedStatic != null) {
diff --git 
a/dubbo-registry/dubbo-registry-zookeeper/src/test/java/org/apache/dubbo/registry/zookeeper/util/CuratorFrameworkUtilsTest.java
 
b/dubbo-registry/dubbo-registry-zookeeper/src/test/java/org/apache/dubbo/registry/zookeeper/util/CuratorFrameworkUtilsTest.java
index aacfc2610f..f60f1ace83 100644
--- 
a/dubbo-registry/dubbo-registry-zookeeper/src/test/java/org/apache/dubbo/registry/zookeeper/util/CuratorFrameworkUtilsTest.java
+++ 
b/dubbo-registry/dubbo-registry-zookeeper/src/test/java/org/apache/dubbo/registry/zookeeper/util/CuratorFrameworkUtilsTest.java
@@ -40,6 +40,7 @@ import org.junit.jupiter.api.Test;
 import org.mockito.MockedStatic;
 import org.mockito.Mockito;
 
+import static org.apache.dubbo.common.constants.CommonConstants.CHECK_KEY;
 import static 
org.apache.dubbo.registry.client.metadata.ServiceInstanceMetadataUtils.EXPORTED_SERVICES_REVISION_PROPERTY_NAME;
 import static 
org.apache.dubbo.registry.client.metadata.ServiceInstanceMetadataUtils.METADATA_STORAGE_TYPE_PROPERTY_NAME;
 import static 
org.apache.dubbo.registry.zookeeper.util.CuratorFrameworkParams.ROOT_PATH;
@@ -109,6 +110,25 @@ class CuratorFrameworkUtilsTest {
         curatorFramework.getZookeeperClient().close();
     }
 
+    @Test
+    void testBuildCuratorFrameworkCheckConnectDefault() {
+        when(mockCuratorZookeeperClient.isConnected()).thenReturn(false);
+        Assertions.assertThrowsExactly(IllegalStateException.class, () -> {
+            CuratorFramework curatorFramework = 
CuratorFrameworkUtils.buildCuratorFramework(registryUrl, null);
+            curatorFramework.getZookeeperClient().close();
+        });
+    }
+
+    @Test
+    void testBuildCuratorFrameworkNotCheckConnect() {
+        when(mockCuratorZookeeperClient.isConnected()).thenReturn(false);
+        URL url = registryUrl.addParameter(CHECK_KEY, false);
+        Assertions.assertDoesNotThrow(() -> {
+            CuratorFramework curatorFramework = 
CuratorFrameworkUtils.buildCuratorFramework(url, null);
+            curatorFramework.getZookeeperClient().close();
+        });
+    }
+
     @Test
     void testBuild() {
         ServiceInstance dubboServiceInstance =
diff --git 
a/dubbo-remoting/dubbo-remoting-zookeeper-curator5/src/main/java/org/apache/dubbo/remoting/zookeeper/curator5/Curator5ZookeeperClient.java
 
b/dubbo-remoting/dubbo-remoting-zookeeper-curator5/src/main/java/org/apache/dubbo/remoting/zookeeper/curator5/Curator5ZookeeperClient.java
index 4fd59ecb02..8cacab2dda 100644
--- 
a/dubbo-remoting/dubbo-remoting-zookeeper-curator5/src/main/java/org/apache/dubbo/remoting/zookeeper/curator5/Curator5ZookeeperClient.java
+++ 
b/dubbo-remoting/dubbo-remoting-zookeeper-curator5/src/main/java/org/apache/dubbo/remoting/zookeeper/curator5/Curator5ZookeeperClient.java
@@ -20,6 +20,7 @@ import org.apache.dubbo.common.URL;
 import org.apache.dubbo.common.config.configcenter.ConfigItem;
 import org.apache.dubbo.common.logger.ErrorTypeAwareLogger;
 import org.apache.dubbo.common.logger.LoggerFactory;
+import org.apache.dubbo.common.utils.UrlUtils;
 
 import java.nio.charset.Charset;
 import java.nio.charset.StandardCharsets;
@@ -96,8 +97,8 @@ public class Curator5ZookeeperClient
             client.getConnectionStateListenable().addListener(new 
CuratorConnectionStateListener(url));
             client.start();
             boolean connected = client.blockUntilConnected(timeout, 
TimeUnit.MILLISECONDS);
-
-            if (!connected) {
+            boolean check = UrlUtils.isCheck(url);
+            if (check && !connected) {
                 // close CuratorFramework to stop re-connection.
                 client.close();
                 IllegalStateException illegalStateException =
diff --git 
a/dubbo-remoting/dubbo-remoting-zookeeper-curator5/src/test/java/org/apache/dubbo/remoting/zookeeper/curator5/Curator5ZookeeperClientManagerTest.java
 
b/dubbo-remoting/dubbo-remoting-zookeeper-curator5/src/test/java/org/apache/dubbo/remoting/zookeeper/curator5/Curator5ZookeeperClientManagerTest.java
index b011f08467..2488bd5d4e 100644
--- 
a/dubbo-remoting/dubbo-remoting-zookeeper-curator5/src/test/java/org/apache/dubbo/remoting/zookeeper/curator5/Curator5ZookeeperClientManagerTest.java
+++ 
b/dubbo-remoting/dubbo-remoting-zookeeper-curator5/src/test/java/org/apache/dubbo/remoting/zookeeper/curator5/Curator5ZookeeperClientManagerTest.java
@@ -18,36 +18,55 @@ package org.apache.dubbo.remoting.zookeeper.curator5;
 
 import org.apache.dubbo.common.URL;
 
+import org.apache.curator.framework.CuratorFramework;
+import org.apache.curator.framework.CuratorFrameworkFactory;
+import org.apache.curator.framework.listen.StandardListenerManager;
 import org.junit.jupiter.api.AfterAll;
+import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
-import org.mockito.MockedConstruction;
+import org.mockito.MockedStatic;
 
+import static org.apache.dubbo.common.constants.CommonConstants.CHECK_KEY;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.core.IsNot.not;
 import static org.hamcrest.core.IsNull.nullValue;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.mockConstructionWithAnswer;
+import static org.mockito.Mockito.mockStatic;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.when;
 
 class Curator5ZookeeperClientManagerTest {
     private ZookeeperClient zookeeperClient;
-    private static MockedConstruction<Curator5ZookeeperClient> 
mockedCurator5ZookeeperClientConstruction;
-    private static String zookeeperConnectionAddress1;
+    private static URL zookeeperUrl;
+    private static MockedStatic<CuratorFrameworkFactory> 
curatorFrameworkFactoryMockedStatic;
+    private static CuratorFramework mockCuratorFramework;
 
     @BeforeAll
     public static void beforeAll() {
-        zookeeperConnectionAddress1 = "zookeeper://127.0.0.1:2181";
-        Curator5ZookeeperClient mockCurator5ZookeeperClient = 
mock(Curator5ZookeeperClient.class);
-        mockedCurator5ZookeeperClientConstruction =
-                mockConstructionWithAnswer(Curator5ZookeeperClient.class, 
invocationOnMock -> invocationOnMock
-                        .getMethod()
-                        .invoke(mockCurator5ZookeeperClient, 
invocationOnMock.getArguments()));
+        String zookeeperConnectionAddress1 = "zookeeper://127.0.0.1:2181";
+        zookeeperUrl = URL.valueOf(zookeeperConnectionAddress1 + "/service");
+
+        CuratorFrameworkFactory.Builder realBuilder = 
CuratorFrameworkFactory.builder();
+        CuratorFrameworkFactory.Builder spyBuilder = spy(realBuilder);
+
+        curatorFrameworkFactoryMockedStatic = 
mockStatic(CuratorFrameworkFactory.class);
+        curatorFrameworkFactoryMockedStatic
+                .when(CuratorFrameworkFactory::builder)
+                .thenReturn(spyBuilder);
+        mockCuratorFramework = mock(CuratorFramework.class);
+        doReturn(mockCuratorFramework).when(spyBuilder).build();
     }
 
     @BeforeEach
-    public void setUp() {
-        zookeeperClient = new 
ZookeeperClientManager().connect(URL.valueOf(zookeeperConnectionAddress1 + 
"/service"));
+    public void setUp() throws InterruptedException {
+        when(mockCuratorFramework.blockUntilConnected(anyInt(), 
any())).thenReturn(true);
+        
when(mockCuratorFramework.getConnectionStateListenable()).thenReturn(StandardListenerManager.standard());
+        zookeeperClient = new ZookeeperClientManager().connect(zookeeperUrl);
     }
 
     @Test
@@ -56,8 +75,29 @@ class Curator5ZookeeperClientManagerTest {
         zookeeperClient.close();
     }
 
+    @Test
+    void testRegistryCheckConnectDefault() throws InterruptedException {
+        when(mockCuratorFramework.blockUntilConnected(anyInt(), 
any())).thenReturn(false);
+
+        ZookeeperClientManager zookeeperClientManager = new 
ZookeeperClientManager();
+        Assertions.assertThrowsExactly(IllegalStateException.class, () -> {
+            zookeeperClientManager.connect(zookeeperUrl);
+        });
+    }
+
+    @Test
+    void testRegistryNotCheckConnect() throws InterruptedException {
+        when(mockCuratorFramework.blockUntilConnected(anyInt(), 
any())).thenReturn(false);
+
+        URL url = zookeeperUrl.addParameter(CHECK_KEY, false);
+        ZookeeperClientManager zookeeperClientManager = new 
ZookeeperClientManager();
+        Assertions.assertDoesNotThrow(() -> {
+            zookeeperClientManager.connect(url);
+        });
+    }
+
     @AfterAll
     public static void afterAll() {
-        mockedCurator5ZookeeperClientConstruction.close();
+        curatorFrameworkFactoryMockedStatic.close();
     }
 }
diff --git 
a/dubbo-remoting/dubbo-remoting-zookeeper-curator5/src/test/java/org/apache/dubbo/remoting/zookeeper/curator5/Curator5ZookeeperClientTest.java
 
b/dubbo-remoting/dubbo-remoting-zookeeper-curator5/src/test/java/org/apache/dubbo/remoting/zookeeper/curator5/Curator5ZookeeperClientTest.java
index 31da9b93b5..c416575b0e 100644
--- 
a/dubbo-remoting/dubbo-remoting-zookeeper-curator5/src/test/java/org/apache/dubbo/remoting/zookeeper/curator5/Curator5ZookeeperClientTest.java
+++ 
b/dubbo-remoting/dubbo-remoting-zookeeper-curator5/src/test/java/org/apache/dubbo/remoting/zookeeper/curator5/Curator5ZookeeperClientTest.java
@@ -59,6 +59,7 @@ import org.mockito.MockedConstruction;
 import org.mockito.MockedStatic;
 import org.mockito.stubbing.Answer;
 
+import static org.apache.dubbo.common.constants.CommonConstants.CHECK_KEY;
 import static org.awaitility.Awaitility.await;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.core.Is.is;
@@ -216,6 +217,16 @@ class Curator5ZookeeperClientTest {
         });
     }
 
+    @Test
+    void testWithInvalidServerWithoutCheck() throws InterruptedException {
+        when(mockCuratorFramework.blockUntilConnected(anyInt(), 
any())).thenReturn(false);
+        URL url = 
URL.valueOf("zookeeper://127.0.0.1:1/service").addParameter(CHECK_KEY, false);
+        Assertions.assertDoesNotThrow(() -> {
+            curatorClient = new Curator5ZookeeperClient(url);
+            curatorClient.create("/testPath", true, true);
+        });
+    }
+
     @Test
     void testRemoveChildrenListener() throws Exception {
         ChildListener childListener = mock(ChildListener.class);

Reply via email to