diff --git a/before_ut.bat b/before_ut.bat
index 5296d0f8769b7b9f521f82e68bf3b10f4b5d16b4..a5557ae1ab32e80b077d22c2c006a084288549cf 100644
--- a/before_ut.bat
+++ b/before_ut.bat
@@ -15,7 +15,8 @@
 ::  limitations under the License.
 
 set zkJar=zookeeper-3.4.9-fatjar.jar
-md remoting\zookeeper\zookeeper-4unittest\contrib\fatjar config_center\zookeeper\zookeeper-4unittest\contrib\fatjar registry\zookeeper\zookeeper-4unittest\contrib\fatjar
+md remoting\zookeeper\zookeeper-4unittest\contrib\fatjar config_center\zookeeper\zookeeper-4unittest\contrib\fatjar registry\zookeeper\zookeeper-4unittest\contrib\fatjar cluster\router\chain\zookeeper-4unittest\contrib\fatjar
 curl -L https://github.com/dubbogo/resources/raw/master/zookeeper-4unitest/contrib/fatjar/%zkJar% -o remoting/zookeeper/zookeeper-4unittest/contrib/fatjar/%zkJar%
 xcopy /f "remoting/zookeeper/zookeeper-4unittest/contrib/fatjar/%zkJar%" "config_center/zookeeper/zookeeper-4unittest/contrib/fatjar/"
-xcopy /f "remoting/zookeeper/zookeeper-4unittest/contrib/fatjar/%zkJar%" "registry/zookeeper/zookeeper-4unittest/contrib/fatjar/"
\ No newline at end of file
+xcopy /f "remoting/zookeeper/zookeeper-4unittest/contrib/fatjar/%zkJar%" "registry/zookeeper/zookeeper-4unittest/contrib/fatjar/"
+xcopy /f "remoting/zookeeper/zookeeper-4unittest/contrib/fatjar/%zkJar%" "cluster/router/chain/zookeeper-4unittest/contrib/fatjar/"
\ No newline at end of file
diff --git a/before_ut.sh b/before_ut.sh
old mode 100644
new mode 100755
index 323173bcc64c3cbe9916747e10dd3ea8538457ea..185c05274baff906e3f1dbef9b6c9fb2276c7533
--- a/before_ut.sh
+++ b/before_ut.sh
@@ -15,7 +15,8 @@
 #  limitations under the License.
 
 
-mkdir -p remoting/zookeeper/zookeeper-4unittest/contrib/fatjar config_center/zookeeper/zookeeper-4unittest/contrib/fatjar registry/zookeeper/zookeeper-4unittest/contrib/fatjar
+mkdir -p remoting/zookeeper/zookeeper-4unittest/contrib/fatjar config_center/zookeeper/zookeeper-4unittest/contrib/fatjar registry/zookeeper/zookeeper-4unittest/contrib/fatjar cluster/router/chain/zookeeper-4unittest/contrib/fatjar
 wget -P "remoting/zookeeper/zookeeper-4unittest/contrib/fatjar" https://github.com/dubbogo/resources/raw/master/zookeeper-4unitest/contrib/fatjar/zookeeper-3.4.9-fatjar.jar
 cp remoting/zookeeper/zookeeper-4unittest/contrib/fatjar/zookeeper-3.4.9-fatjar.jar config_center/zookeeper/zookeeper-4unittest/contrib/fatjar/
-cp remoting/zookeeper/zookeeper-4unittest/contrib/fatjar/zookeeper-3.4.9-fatjar.jar registry/zookeeper/zookeeper-4unittest/contrib/fatjar/
\ No newline at end of file
+cp remoting/zookeeper/zookeeper-4unittest/contrib/fatjar/zookeeper-3.4.9-fatjar.jar registry/zookeeper/zookeeper-4unittest/contrib/fatjar/
+cp remoting/zookeeper/zookeeper-4unittest/contrib/fatjar/zookeeper-3.4.9-fatjar.jar cluster/router/chain/zookeeper-4unittest/contrib/fatjar
\ No newline at end of file
diff --git a/cluster/router/chain/chain.go b/cluster/router/chain/chain.go
index d65f6d201970d955ee97202664faf4ef1de3d45b..1107e854a8220d3e8d298d40e96f29a66f931c74 100644
--- a/cluster/router/chain/chain.go
+++ b/cluster/router/chain/chain.go
@@ -52,16 +52,16 @@ func (c Chain) AddRouters(routers []router.Router) {
 	c.routers = newRouters
 }
 
-func NewRouterChain(url common.URL) *Chain {
+func NewRouterChain(url *common.URL) *Chain {
 	routerFactories := extension.GetRouters()
 	if len(routerFactories) == 0 {
 		return nil
 	}
 	routers := make([]router.Router, 0)
 	for _, routerFactory := range routerFactories {
-		r, err := routerFactory().Router(&url)
-		if err != nil {
-			logger.Errorf("router chain build router fail! error:%v", err)
+		r, err := routerFactory().Router(url)
+		if r == nil || err != nil {
+			logger.Errorf("router chain build router fail! error:%s", err.Error())
 			continue
 		}
 		routers = append(routers, r)
diff --git a/cluster/router/chain/chain_test.go b/cluster/router/chain/chain_test.go
index 6825ddfd3ac22518a50453e8cc76cc50952659bf..228c700d905cfd57a5f5373321fd74264d52d5c6 100644
--- a/cluster/router/chain/chain_test.go
+++ b/cluster/router/chain/chain_test.go
@@ -16,3 +16,42 @@
  */
 
 package chain
+
+import (
+	"context"
+	"github.com/apache/dubbo-go/common"
+	"github.com/apache/dubbo-go/common/extension"
+	_ "github.com/apache/dubbo-go/config_center/zookeeper"
+	"github.com/apache/dubbo-go/remoting/zookeeper"
+	"github.com/stretchr/testify/assert"
+	"testing"
+	"time"
+)
+
+import (
+	_ "github.com/apache/dubbo-go/cluster/router/condition"
+)
+
+func TestNewRouterChain(t *testing.T) {
+	ts, z, _, err := zookeeper.NewMockZookeeperClient("test", 15*time.Second)
+	assert.NoError(t, err)
+	defer ts.Stop()
+	defer z.Close()
+
+	t.Log(z.ZkAddrs)
+
+	zkUrl, _ := common.NewURL(context.TODO(), "zookeeper://127.0.0.1:2181")
+	configuration, err := extension.GetConfigCenterFactory("zookeeper").GetDynamicConfiguration(&zkUrl)
+	assert.Nil(t, err)
+	assert.NotNil(t, configuration)
+
+	chain := NewRouterChain(getRouteUrl("test"))
+	t.Log(chain.routers)
+}
+
+func getRouteUrl(applicationKey string) *common.URL {
+	url, _ := common.NewURL(context.TODO(), "condition://0.0.0.0/com.foo.BarService")
+	url.AddParam("application", applicationKey)
+	url.AddParam("force", "true")
+	return &url
+}
diff --git a/cluster/router/condition/app_router.go b/cluster/router/condition/app_router.go
index d5af0c36c9661d3b7a176e6e4f16a1b0d2aa0d09..2b07f8fd714aa639ded20cd8e37f3792a62766a2 100644
--- a/cluster/router/condition/app_router.go
+++ b/cluster/router/condition/app_router.go
@@ -31,8 +31,7 @@ type AppRouter struct {
 }
 
 func NewAppRouter(url *common.URL) (*AppRouter, error) {
-	appRouter := &AppRouter{}
-	err := appRouter.newListenableRouter(url, url.GetParam(constant.APPLICATION_KEY, ""))
+	appRouter, err := newListenableRouter(url, url.GetParam(constant.APPLICATION_KEY, ""))
 	if err != nil {
 		return nil, err
 	}
diff --git a/cluster/router/condition/listenable_router.go b/cluster/router/condition/listenable_router.go
index 2beb60227e3221586ff293b03f48e18f97a3d3c1..8d8de42eb314de03bdba026b853f7c5335d448e5 100644
--- a/cluster/router/condition/listenable_router.go
+++ b/cluster/router/condition/listenable_router.go
@@ -49,28 +49,34 @@ type listenableRouter struct {
 	priority         int64
 }
 
-func (l *listenableRouter) newListenableRouter(url *common.URL, ruleKey string) error {
-	l.url = url
-	l.priority = DEFAULT_PRIORITY
+func newListenableRouter(url *common.URL, ruleKey string) (*AppRouter, error) {
 	if ruleKey == "" {
-		return nil
+		return nil, perrors.Errorf("newListenableRouter ruleKey is nil, can't create Listenable router")
 	}
+	l := &AppRouter{}
+
+	l.url = url
+	l.priority = DEFAULT_PRIORITY
 
 	routerKey := ruleKey + RULE_SUFFIX
 	//add listener
 	dynamicConfiguration := config.GetEnvInstance().GetDynamicConfiguration()
+	if dynamicConfiguration == nil {
+		return nil, perrors.Errorf("get dynamicConfiguration fail, dynamicConfiguration is nil, init config center plugin please")
+	}
+
 	dynamicConfiguration.AddListener(routerKey, l)
 	//get rule
 	rule, err := dynamicConfiguration.GetRule(routerKey, config_center.WithGroup(config_center.DEFAULT_GROUP))
 	if len(rule) == 0 || err != nil {
-		return perrors.Errorf("get rule fail, config rule{%s},  error{%v}", rule, err)
+		return nil, perrors.Errorf("get rule fail, config rule{%s},  error{%v}", rule, err)
 	}
 	l.Process(&config_center.ConfigChangeEvent{
 		Key:        routerKey,
 		Value:      rule,
 		ConfigType: remoting.EventTypeUpdate})
 
-	return nil
+	return l, nil
 }
 
 func (l *listenableRouter) Process(event *config_center.ConfigChangeEvent) {