You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shenyu.apache.org by de...@apache.org on 2021/08/01 15:17:49 UTC

[incubator-shenyu] branch master updated: [ISSUE #1824] Improve test coverage of org.apache.shenyu.admin.service.* (#1846)

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

dengliming pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-shenyu.git


The following commit(s) were added to refs/heads/master by this push:
     new a4471c9  [ISSUE #1824] Improve test coverage of org.apache.shenyu.admin.service.* (#1846)
a4471c9 is described below

commit a4471c907bce49a08c2f25d3e36612ed6993d660
Author: Kunshuai Zhu <jo...@gmail.com>
AuthorDate: Sun Aug 1 23:17:43 2021 +0800

    [ISSUE #1824] Improve test coverage of org.apache.shenyu.admin.service.* (#1846)
    
    * Improve the coverage of SelectorServiceTest
    
    * Improve the coverage
    
    * Delete an extra stubbing
    
    * Improve the coverage of PermissionServiceImpl
    
    * Fix the UnnecessaryStubbingException
    
    * Improve the coverage using mockStatic
    
    * Refactor UpstreamCheckServiceTest to remove all unnecessary stubbings
---
 .../admin/service/DashboardUserServiceTest.java    |  42 ++++--
 .../shenyu/admin/service/MetaDataServiceTest.java  |  20 +++
 .../admin/service/PermissionServiceTest.java       |  49 ++++---
 .../shenyu/admin/service/RuleServiceTest.java      |  25 +++-
 .../shenyu/admin/service/SelectorServiceTest.java  |  58 ++++++--
 .../admin/service/UpstreamCheckServiceTest.java    | 149 +++++++++++++++++++--
 6 files changed, 286 insertions(+), 57 deletions(-)

diff --git a/shenyu-admin/src/test/java/org/apache/shenyu/admin/service/DashboardUserServiceTest.java b/shenyu-admin/src/test/java/org/apache/shenyu/admin/service/DashboardUserServiceTest.java
index 51e73d8..20edc1b 100644
--- a/shenyu-admin/src/test/java/org/apache/shenyu/admin/service/DashboardUserServiceTest.java
+++ b/shenyu-admin/src/test/java/org/apache/shenyu/admin/service/DashboardUserServiceTest.java
@@ -18,23 +18,29 @@
 package org.apache.shenyu.admin.service;
 
 import org.apache.shenyu.admin.config.properties.JwtProperties;
+import org.apache.shenyu.admin.config.properties.LdapProperties;
 import org.apache.shenyu.admin.config.properties.SecretProperties;
 import org.apache.shenyu.admin.mapper.DashboardUserMapper;
 import org.apache.shenyu.admin.mapper.DataPermissionMapper;
 import org.apache.shenyu.admin.mapper.RoleMapper;
 import org.apache.shenyu.admin.mapper.UserRoleMapper;
 import org.apache.shenyu.admin.model.dto.DashboardUserDTO;
+import org.apache.shenyu.admin.model.dto.RoleDTO;
 import org.apache.shenyu.admin.model.entity.DashboardUserDO;
+import org.apache.shenyu.admin.model.entity.RoleDO;
 import org.apache.shenyu.admin.model.page.CommonPager;
 import org.apache.shenyu.admin.model.page.PageParameter;
 import org.apache.shenyu.admin.model.query.DashboardUserQuery;
 import org.apache.shenyu.admin.model.vo.DashboardUserVO;
+import org.apache.shenyu.admin.model.vo.LoginDashboardUserVO;
 import org.apache.shenyu.admin.service.impl.DashboardUserServiceImpl;
+import org.apache.shenyu.admin.utils.AesUtils;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.InjectMocks;
 import org.mockito.Mock;
 import org.mockito.junit.MockitoJUnitRunner;
+import org.springframework.ldap.core.LdapTemplate;
 import org.springframework.test.util.ReflectionTestUtils;
 
 import java.sql.Timestamp;
@@ -47,7 +53,6 @@ import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.anyString;
 import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.BDDMockito.given;
-import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
@@ -57,6 +62,7 @@ import static org.mockito.Mockito.when;
  */
 @RunWith(MockitoJUnitRunner.class)
 public final class DashboardUserServiceTest {
+
     public static final String TEST_ID = "testId";
 
     public static final String TEST_USER_NAME = "userName";
@@ -84,6 +90,9 @@ public final class DashboardUserServiceTest {
     @Mock
     private JwtProperties jwtProperties;
 
+    @Mock
+    private LdapTemplate ldapTemplate;
+
     @Test
     public void testCreateOrUpdate() {
         DashboardUserDTO dashboardUserDTO = DashboardUserDTO.builder()
@@ -168,15 +177,28 @@ public final class DashboardUserServiceTest {
         String iv = "6075877187097700";
         when(secretProperties.getKey()).thenReturn(key, key);
         when(secretProperties.getIv()).thenReturn(iv, iv);
-        when(dashboardUserMapper.findByQuery(eq(TEST_USER_NAME), anyString())).thenReturn(null, dashboardUserDO, dashboardUserDO);
+        when(dashboardUserMapper.findByQuery(eq(TEST_USER_NAME), anyString())).thenReturn(dashboardUserDO);
         given(dashboardUserMapper.updateSelective(any(DashboardUserDO.class))).willReturn(1);
-
+        given(ldapTemplate.authenticate(anyString(), anyString(), anyString())).willReturn(true);
+        given(roleMapper.findByRoleName("default")).willReturn(RoleDO.buildRoleDO(new RoleDTO("1", "test", null, null)));
+
+        // test loginByLdap
+        LdapProperties ldapProperties = new LdapProperties();
+        ldapProperties.setBaseDn("test");
+        ReflectionTestUtils.setField(dashboardUserService, "ldapProperties", ldapProperties);
+        ReflectionTestUtils.setField(dashboardUserService, "ldapTemplate", ldapTemplate);
+        LoginDashboardUserVO loginDashboardUserVO = dashboardUserService.login(TEST_USER_NAME, TEST_PASSWORD);
+        assertEquals(TEST_USER_NAME, loginDashboardUserVO.getUserName());
+        assertEquals(AesUtils.aesEncryption(TEST_PASSWORD, secretProperties.getKey(), secretProperties.getIv()), loginDashboardUserVO.getPassword());
+
+        // test loginByDatabase
+        ReflectionTestUtils.setField(dashboardUserService, "ldapTemplate", null);
         assertLoginSuccessful(dashboardUserDO, dashboardUserService.login(TEST_USER_NAME, TEST_PASSWORD));
-        verify(dashboardUserMapper, times(2)).findByQuery(eq(TEST_USER_NAME), anyString());
-        verify(dashboardUserMapper, never()).updateSelective(any(DashboardUserDO.class));
-        assertLoginSuccessful(dashboardUserDO, dashboardUserService.login(TEST_USER_NAME, TEST_PASSWORD));
-        verify(dashboardUserMapper, times(3)).findByQuery(eq(TEST_USER_NAME), anyString());
+        verify(dashboardUserMapper).findByQuery(eq(TEST_USER_NAME), anyString());
         verify(dashboardUserMapper).updateSelective(any(DashboardUserDO.class));
+        assertLoginSuccessful(dashboardUserDO, dashboardUserService.login(TEST_USER_NAME, TEST_PASSWORD));
+        verify(dashboardUserMapper, times(2)).findByQuery(eq(TEST_USER_NAME), anyString());
+        verify(dashboardUserMapper, times(2)).updateSelective(any(DashboardUserDO.class));
     }
 
     private DashboardUserDO createDashboardUserDO() {
@@ -188,8 +210,8 @@ public final class DashboardUserServiceTest {
     }
 
     private void assertLoginSuccessful(final DashboardUserDO dashboardUserDO, final DashboardUserVO dashboardUserVO) {
-        assertEquals(dashboardUserVO.getId(), dashboardUserDO.getId());
-        assertEquals(dashboardUserVO.getUserName(), dashboardUserDO.getUserName());
-        assertEquals(dashboardUserVO.getPassword(), dashboardUserDO.getPassword());
+        assertEquals(dashboardUserDO.getId(), dashboardUserVO.getId());
+        assertEquals(dashboardUserDO.getUserName(), dashboardUserVO.getUserName());
+        assertEquals(dashboardUserDO.getPassword(), dashboardUserVO.getPassword());
     }
 }
diff --git a/shenyu-admin/src/test/java/org/apache/shenyu/admin/service/MetaDataServiceTest.java b/shenyu-admin/src/test/java/org/apache/shenyu/admin/service/MetaDataServiceTest.java
index c84b02a..c5166dc 100644
--- a/shenyu-admin/src/test/java/org/apache/shenyu/admin/service/MetaDataServiceTest.java
+++ b/shenyu-admin/src/test/java/org/apache/shenyu/admin/service/MetaDataServiceTest.java
@@ -29,6 +29,7 @@ import org.apache.shenyu.admin.service.impl.MetaDataServiceImpl;
 import org.apache.shenyu.admin.model.vo.MetaDataVO;
 import org.apache.shenyu.common.constant.AdminConstants;
 import org.apache.shenyu.common.dto.MetaData;
+import org.apache.shenyu.register.common.dto.MetaDataRegisterDTO;
 import org.junit.Assert;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -71,6 +72,15 @@ public final class MetaDataServiceTest {
     private MetaDataQuery metaDataQuery;
 
     /**
+     * Test case for saveOrUpdateMetaData().
+     */
+    @Test
+    public void testSaveOrUpdateMetaData() {
+        testSaveOrUpdateMetaDataForInsert();
+        testSaveOrUpdateMetaDataForUpdate();
+    }
+
+    /**
      * Test case for createOrUpdate.<br>
      * Note that the following methods have dependencies before and after.
      */
@@ -193,6 +203,16 @@ public final class MetaDataServiceTest {
                 metaDataDOList.size() - 1, all.size());
     }
 
+    private void testSaveOrUpdateMetaDataForInsert() {
+        metaDataService.saveOrUpdateMetaData(null, new MetaDataRegisterDTO());
+        verify(metaDataMapper).insert(any(MetaDataDO.class));
+    }
+
+    private void testSaveOrUpdateMetaDataForUpdate() {
+        metaDataService.saveOrUpdateMetaData(MetaDataDO.builder().id("1").build(), new MetaDataRegisterDTO());
+        verify(metaDataMapper).update(any(MetaDataDO.class));
+    }
+
     /**
      * Cases where the params error.
      */
diff --git a/shenyu-admin/src/test/java/org/apache/shenyu/admin/service/PermissionServiceTest.java b/shenyu-admin/src/test/java/org/apache/shenyu/admin/service/PermissionServiceTest.java
index 185fc35..6b4b700 100644
--- a/shenyu-admin/src/test/java/org/apache/shenyu/admin/service/PermissionServiceTest.java
+++ b/shenyu-admin/src/test/java/org/apache/shenyu/admin/service/PermissionServiceTest.java
@@ -21,6 +21,7 @@ import org.apache.shenyu.admin.mapper.DashboardUserMapper;
 import org.apache.shenyu.admin.mapper.PermissionMapper;
 import org.apache.shenyu.admin.mapper.ResourceMapper;
 import org.apache.shenyu.admin.mapper.UserRoleMapper;
+import org.apache.shenyu.admin.model.custom.UserInfo;
 import org.apache.shenyu.admin.model.entity.DashboardUserDO;
 import org.apache.shenyu.admin.model.entity.PermissionDO;
 import org.apache.shenyu.admin.model.entity.ResourceDO;
@@ -29,17 +30,21 @@ import org.apache.shenyu.admin.model.vo.PermissionMenuVO;
 import org.apache.shenyu.admin.service.impl.PermissionServiceImpl;
 import org.apache.shenyu.admin.service.impl.ResourceServiceImpl;
 import org.apache.shenyu.admin.spring.SpringBeanUtils;
+import org.apache.shenyu.admin.utils.JwtUtils;
 import org.apache.shiro.SecurityUtils;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
+import org.mockito.MockedStatic;
 import org.mockito.junit.MockitoJUnitRunner;
+import org.mockito.stubbing.Answer;
 import org.springframework.context.ConfigurableApplicationContext;
 
 import java.sql.Timestamp;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collections;
 import java.util.List;
 import java.util.Set;
 
@@ -47,12 +52,13 @@ import static org.hamcrest.Matchers.is;
 import static org.junit.Assert.assertThat;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
+import static org.mockito.Mockito.mockStatic;
 
 /**
  * add test case for {@link PermissionServiceImpl}.
  */
 @RunWith(MockitoJUnitRunner.class)
-public class PermissionServiceTest {
+public final class PermissionServiceTest {
 
     @Mock
     private DashboardUserMapper mockDashboardUserMapper;
@@ -66,8 +72,6 @@ public class PermissionServiceTest {
     @Mock
     private ResourceMapper mockResourceMapper;
 
-    private ResourceService resourceService;
-
     private PermissionServiceImpl permissionServiceImplUnderTest;
 
     @Mock
@@ -107,32 +111,37 @@ public class PermissionServiceTest {
                 .dateUpdated(new Timestamp(1610940313000L))
                 .id("1347053375029653504").build();
         when(mockDashboardUserMapper.selectByUserName("admin")).thenReturn(dashboardUserDO);
-        when(mockUserRoleMapper.findByUserId("1")).thenReturn(Arrays.asList(userRoleDO));
+        when(mockUserRoleMapper.findByUserId("1")).thenReturn(Collections.singletonList(userRoleDO));
         when(mockPermissionMapper.findByObjectId("1346358560427216896")).thenReturn(permissionDOS);
         when(mockResourceMapper.selectById("1346775491550474240")).thenReturn(resourceDO1);
         when(mockResourceMapper.selectById("1346776175553376256")).thenReturn(resourceDO2);
         when(mockResourceMapper.selectById("1346777157943259136")).thenReturn(resourceDO3);
         when(mockResourceMapper.selectById("1347053375029653504")).thenReturn(resourceDO4);
-        resourceService = new ResourceServiceImpl(mockResourceMapper, mockPermissionMapper);
+        when(mockResourceMapper.selectAll()).thenReturn(Arrays.asList(resourceDO1, resourceDO2, resourceDO3, resourceDO4));
+        ResourceService resourceService = new ResourceServiceImpl(mockResourceMapper, mockPermissionMapper);
         permissionServiceImplUnderTest = new PermissionServiceImpl(mockDashboardUserMapper, mockUserRoleMapper, mockPermissionMapper, mockResourceMapper, resourceService);
     }
 
-    @Test(expected = NullPointerException.class)
+    @Test
     public void testGetPermissionMenu() {
-        final PermissionMenuVO expectedResult = new PermissionMenuVO(Arrays.asList(
-                new PermissionMenuVO.MenuInfo("1346776175553376256", "system", "/system", "system",
-                        new PermissionMenuVO.Meta("setting", "SHENYU.MENU.SYSTEM.MANAGMENT"), Arrays.asList(
-                        new PermissionMenuVO.MenuInfo("1346777157943259136", "manage", "/system/manage", "manage",
-                                new PermissionMenuVO.Meta("", "SHENYU.MENU.SYSTEM.MANAGMENT.USER"), Arrays.asList(), 1)
-                ), 1),
-                new PermissionMenuVO.MenuInfo("1346775491550474240", "plug", "/plug", "PluginList",
-                        new PermissionMenuVO.Meta("dashboard", "SHENYU.MENU.PLUGIN.LIST"), Arrays.asList(), 0)
-        ),
-                Arrays.asList(new PermissionMenuVO.AuthPerm("plugin:sign:modify", "SHENYU.BUTTON.PLUGIN.SYNCHRONIZE", null)),
-                Arrays.asList(new PermissionMenuVO.AuthPerm("plugin:sign:modify", "SHENYU.BUTTON.PLUGIN.SYNCHRONIZE", null)));
-        String token = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJhZG1pbiIsImlhdCI6MTYxMTc5MjEzOX0.eFORUk5kZawKLTsfRYojy-uaaDySo9kWtcfgxISS_3g";
-        final PermissionMenuVO result = permissionServiceImplUnderTest.getPermissionMenu(token);
-        assertThat(result, is(expectedResult));
+        try (MockedStatic<JwtUtils> mocked = mockStatic(JwtUtils.class)) {
+            mocked.when(JwtUtils::getUserInfo)
+                    .thenAnswer((Answer<UserInfo>) invocation -> UserInfo.builder().userId("1").userName("admin").build());
+            final PermissionMenuVO expectedResult = new PermissionMenuVO(Arrays.asList(
+                    new PermissionMenuVO.MenuInfo("1346776175553376256", "system", "/system", "system",
+                            new PermissionMenuVO.Meta("setting", "SHENYU.MENU.SYSTEM.MANAGMENT"), Collections.singletonList(
+                            new PermissionMenuVO.MenuInfo("1346777157943259136", "manage", "/system/manage", "manage",
+                                    new PermissionMenuVO.Meta("", "SHENYU.MENU.SYSTEM.MANAGMENT.USER"), Collections.emptyList(), 1)
+                    ), 1),
+                    new PermissionMenuVO.MenuInfo("1346775491550474240", "plug", "/plug", "PluginList",
+                            new PermissionMenuVO.Meta("dashboard", "SHENYU.MENU.PLUGIN.LIST"), Collections.emptyList(), 0)
+            ),
+                    Collections.singletonList(new PermissionMenuVO.AuthPerm("plugin:sign:modify", "SHENYU.BUTTON.PLUGIN.SYNCHRONIZE", null)),
+                    Collections.singletonList(new PermissionMenuVO.AuthPerm("plugin:sign:modify", "SHENYU.BUTTON.PLUGIN.SYNCHRONIZE", null)));
+            String token = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJhZG1pbiIsImlhdCI6MTYxMTc5MjEzOX0.eFORUk5kZawKLTsfRYojy-uaaDySo9kWtcfgxISS_3g";
+            final PermissionMenuVO result = permissionServiceImplUnderTest.getPermissionMenu(token);
+            assertThat(result, is(expectedResult));
+        }
     }
 
     @Test
diff --git a/shenyu-admin/src/test/java/org/apache/shenyu/admin/service/RuleServiceTest.java b/shenyu-admin/src/test/java/org/apache/shenyu/admin/service/RuleServiceTest.java
index c5722fa..e8c11f9 100644
--- a/shenyu-admin/src/test/java/org/apache/shenyu/admin/service/RuleServiceTest.java
+++ b/shenyu-admin/src/test/java/org/apache/shenyu/admin/service/RuleServiceTest.java
@@ -23,8 +23,11 @@ import org.apache.shenyu.admin.mapper.PluginMapper;
 import org.apache.shenyu.admin.mapper.RuleConditionMapper;
 import org.apache.shenyu.admin.mapper.RuleMapper;
 import org.apache.shenyu.admin.mapper.SelectorMapper;
+import org.apache.shenyu.admin.model.custom.UserInfo;
+import org.apache.shenyu.admin.model.dto.DataPermissionDTO;
 import org.apache.shenyu.admin.model.dto.RuleConditionDTO;
 import org.apache.shenyu.admin.model.dto.RuleDTO;
+import org.apache.shenyu.admin.model.entity.DataPermissionDO;
 import org.apache.shenyu.admin.model.entity.PluginDO;
 import org.apache.shenyu.admin.model.entity.RuleConditionDO;
 import org.apache.shenyu.admin.model.entity.RuleDO;
@@ -35,14 +38,16 @@ import org.apache.shenyu.admin.model.query.RuleConditionQuery;
 import org.apache.shenyu.admin.model.query.RuleQuery;
 import org.apache.shenyu.admin.model.vo.RuleVO;
 import org.apache.shenyu.admin.service.impl.RuleServiceImpl;
+import org.apache.shenyu.admin.utils.JwtUtils;
 import org.apache.shenyu.common.dto.RuleData;
-import org.apache.shiro.SecurityUtils;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.InjectMocks;
 import org.mockito.Mock;
+import org.mockito.MockedStatic;
 import org.mockito.junit.MockitoJUnitRunner;
+import org.mockito.stubbing.Answer;
 import org.springframework.context.ApplicationEventPublisher;
 
 import java.sql.Timestamp;
@@ -58,6 +63,8 @@ import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertThat;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.BDDMockito.given;
+import static org.mockito.Mockito.mockStatic;
+import static org.mockito.Mockito.when;
 
 /**
  * Test cases for RuleService.
@@ -91,7 +98,7 @@ public final class RuleServiceTest {
 
     @Before
     public void setUp() {
-        SecurityUtils.setSecurityManager(securityManager);
+        when(dataPermissionMapper.listByUserId("1")).thenReturn(Collections.singletonList(DataPermissionDO.buildPermissionDO(new DataPermissionDTO())));
         ruleService = new RuleServiceImpl(ruleMapper, ruleConditionMapper, selectorMapper, pluginMapper, dataPermissionMapper, eventPublisher);
     }
 
@@ -102,11 +109,11 @@ public final class RuleServiceTest {
         testRegisterUpdate();
     }
 
-    @Test(expected = NullPointerException.class)
+    @Test
     public void testCreateOrUpdate() {
         publishEvent();
-        testCreate();
         testUpdate();
+        testCreate();
     }
 
     @Test
@@ -226,9 +233,13 @@ public final class RuleServiceTest {
     }
 
     private void testCreate() {
-        RuleDTO ruleDTO = buildRuleDTO("");
-        given(this.ruleMapper.insertSelective(any())).willReturn(1);
-        assertThat(this.ruleService.createOrUpdate(ruleDTO), greaterThan(0));
+        try (MockedStatic<JwtUtils> mocked = mockStatic(JwtUtils.class)) {
+            mocked.when(JwtUtils::getUserInfo)
+                    .thenAnswer((Answer<UserInfo>) invocation -> UserInfo.builder().userId("1").userName("admin").build());
+            RuleDTO ruleDTO = buildRuleDTO("");
+            given(this.ruleMapper.insertSelective(any())).willReturn(1);
+            assertThat(this.ruleService.createOrUpdate(ruleDTO), greaterThan(0));
+        }
     }
 
     private void testUpdate() {
diff --git a/shenyu-admin/src/test/java/org/apache/shenyu/admin/service/SelectorServiceTest.java b/shenyu-admin/src/test/java/org/apache/shenyu/admin/service/SelectorServiceTest.java
index e7f733b..f7d902a 100644
--- a/shenyu-admin/src/test/java/org/apache/shenyu/admin/service/SelectorServiceTest.java
+++ b/shenyu-admin/src/test/java/org/apache/shenyu/admin/service/SelectorServiceTest.java
@@ -19,8 +19,11 @@ package org.apache.shenyu.admin.service;
 
 import org.apache.commons.lang3.StringUtils;
 import org.apache.shenyu.admin.mapper.DataPermissionMapper;
+import org.apache.shenyu.admin.model.custom.UserInfo;
+import org.apache.shenyu.admin.model.dto.DataPermissionDTO;
 import org.apache.shenyu.admin.model.dto.SelectorConditionDTO;
 import org.apache.shenyu.admin.model.dto.SelectorDTO;
+import org.apache.shenyu.admin.model.entity.DataPermissionDO;
 import org.apache.shenyu.admin.model.entity.PluginDO;
 import org.apache.shenyu.admin.model.entity.RuleDO;
 import org.apache.shenyu.admin.model.entity.SelectorDO;
@@ -38,16 +41,19 @@ import org.apache.shenyu.admin.service.impl.SelectorServiceImpl;
 import org.apache.shenyu.admin.service.impl.UpstreamCheckService;
 import org.apache.shenyu.admin.model.vo.SelectorConditionVO;
 import org.apache.shenyu.admin.model.vo.SelectorVO;
+import org.apache.shenyu.admin.utils.JwtUtils;
 import org.apache.shenyu.common.dto.SelectorData;
 import org.apache.shenyu.common.enums.PluginEnum;
 import org.apache.shenyu.common.enums.SelectorTypeEnum;
-import org.apache.shiro.SecurityUtils;
+import org.apache.shenyu.register.common.dto.MetaDataRegisterDTO;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.InjectMocks;
 import org.mockito.Mock;
+import org.mockito.MockedStatic;
 import org.mockito.junit.MockitoJUnitRunner;
+import org.mockito.stubbing.Answer;
 import org.springframework.context.ApplicationEventPublisher;
 
 import java.sql.Timestamp;
@@ -60,6 +66,7 @@ import java.util.Random;
 
 import static org.hamcrest.Matchers.greaterThan;
 import static org.hamcrest.Matchers.notNullValue;
+import static org.hamcrest.Matchers.is;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertThat;
 import static org.junit.Assert.assertNotNull;
@@ -69,6 +76,7 @@ import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.BDDMockito.given;
 import static org.mockito.Mockito.when;
 import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.mockStatic;
 
 /**
  * Test cases for SelectorService.
@@ -103,12 +111,9 @@ public final class SelectorServiceTest {
     @Mock
     private UpstreamCheckService upstreamCheckService;
 
-    @Mock
-    private org.apache.shiro.mgt.SecurityManager securityManager;
-
     @Before
     public void setUp() {
-        SecurityUtils.setSecurityManager(securityManager);
+        when(dataPermissionMapper.listByUserId("1")).thenReturn(Collections.singletonList(DataPermissionDO.buildPermissionDO(new DataPermissionDTO())));
         selectorService = new SelectorServiceImpl(selectorMapper, selectorConditionMapper, pluginMapper,
                 ruleMapper, ruleConditionMapper, eventPublisher, dataPermissionMapper, upstreamCheckService);
     }
@@ -120,11 +125,12 @@ public final class SelectorServiceTest {
         testRegisterUpdate();
     }
 
-    @Test(expected = NullPointerException.class)
+    @Test
     public void testCreateOrUpdate() {
+        given(pluginMapper.selectByName("divide")).willReturn(buildPluginDO());
         publishEvent();
-        testCreate();
         testUpdate();
+        testCreate();
     }
 
     @Test
@@ -210,16 +216,35 @@ public final class SelectorServiceTest {
         assertEquals(selectorDOs.size(), dataList.size());
     }
 
+    @Test
+    public void testHandlerSelectorNeedUpstreamCheck() {
+        publishEvent();
+
+        // Test the situation where the selector cannot be found based on the contextPath.
+        given(pluginMapper.selectByName("test")).willReturn(buildPluginDO());
+        assertNotNull(selectorService.handlerSelectorNeedUpstreamCheck(buildMetaDataRegisterDTO(), "test"));
+
+        // Test the situation where the selector can be found based on the contextPath.
+        given(selectorMapper.selectByName("/test")).willReturn(buildSelectorDO());
+        assertThat(selectorService.handlerSelectorNeedUpstreamCheck(buildMetaDataRegisterDTO(), "test"), is("456"));
+    }
+
     private void testUpdate() {
         SelectorDTO selectorDTO = buildSelectorDTO("456");
+        selectorDTO.setPluginId("789");
         given(this.selectorMapper.updateSelective(any())).willReturn(1);
         assertThat(this.selectorService.createOrUpdate(selectorDTO), greaterThan(0));
     }
 
     private void testCreate() {
-        SelectorDTO selectorDTO = buildSelectorDTO("");
-        given(this.selectorMapper.insertSelective(any())).willReturn(1);
-        assertThat(this.selectorService.createOrUpdate(selectorDTO), greaterThan(0));
+        try (MockedStatic<JwtUtils> mocked = mockStatic(JwtUtils.class)) {
+            mocked.when(JwtUtils::getUserInfo)
+                    .thenAnswer((Answer<UserInfo>) invocation -> UserInfo.builder().userId("1").userName("admin").build());
+            SelectorDTO selectorDTO = buildSelectorDTO("");
+            given(this.selectorMapper.insertSelective(any())).willReturn(1);
+            // Because of the lack of shiro configuration, there would be a NullPointerException here.
+            assertThat(this.selectorService.createOrUpdate(selectorDTO), greaterThan(0));
+        }
     }
 
     private void testRegisterCreate() {
@@ -255,6 +280,7 @@ public final class SelectorServiceTest {
         selectorDTO.setPluginId("789");
         selectorDTO.setName("kuan");
         selectorDTO.setType(SelectorTypeEnum.FULL_FLOW.getCode());
+        selectorDTO.setHandle("[{\"upstreamHost\": \"127.0.0.1\", \"protocol\": \"http://\", \"upstreamUrl\": \"anotherUrl\"}]");
         SelectorConditionDTO selectorConditionDTO1 = new SelectorConditionDTO();
         selectorConditionDTO1.setId("111");
         selectorConditionDTO1.setSelectorId("456");
@@ -276,8 +302,8 @@ public final class SelectorServiceTest {
         }
         selectorDTO.setName("test-name-" + new Random().nextInt());
         selectorDTO.setEnabled(true);
-        selectorDTO.setHandle("test-handle");
-        selectorDTO.setPluginId("test-pluginId");
+        selectorDTO.setHandle("[{\"upstreamHost\": \"127.0.0.1\", \"protocol\": \"http://\", \"upstreamUrl\": \"anotherUrl\"}]");
+        selectorDTO.setPluginId("789");
         selectorDTO.setType(SelectorTypeEnum.FULL_FLOW.getCode());
         selectorDTO.setLoged(true);
         selectorDTO.setMatchMode(1);
@@ -304,4 +330,12 @@ public final class SelectorServiceTest {
         selectorQuery.setPageParameter(new PageParameter());
         return selectorQuery;
     }
+
+    private MetaDataRegisterDTO buildMetaDataRegisterDTO() {
+        MetaDataRegisterDTO metaDataRegisterDTO = new MetaDataRegisterDTO();
+        metaDataRegisterDTO.setPath("/test");
+        metaDataRegisterDTO.setHost("127.0.0.1");
+        metaDataRegisterDTO.setPort(13307);
+        return metaDataRegisterDTO;
+    }
 }
diff --git a/shenyu-admin/src/test/java/org/apache/shenyu/admin/service/UpstreamCheckServiceTest.java b/shenyu-admin/src/test/java/org/apache/shenyu/admin/service/UpstreamCheckServiceTest.java
index 8faa9fd..2da412f 100644
--- a/shenyu-admin/src/test/java/org/apache/shenyu/admin/service/UpstreamCheckServiceTest.java
+++ b/shenyu-admin/src/test/java/org/apache/shenyu/admin/service/UpstreamCheckServiceTest.java
@@ -17,17 +17,25 @@
 
 package org.apache.shenyu.admin.service;
 
+import com.google.common.collect.Lists;
+import org.apache.shenyu.admin.model.entity.PluginDO;
+import org.apache.shenyu.admin.model.entity.SelectorDO;
 import org.apache.shenyu.admin.mapper.PluginMapper;
 import org.apache.shenyu.admin.mapper.SelectorConditionMapper;
 import org.apache.shenyu.admin.mapper.SelectorMapper;
 import org.apache.shenyu.admin.service.impl.UpstreamCheckService;
+import org.apache.shenyu.common.constant.Constants;
 import org.apache.shenyu.common.dto.convert.DivideUpstream;
+import org.apache.shenyu.common.dto.convert.ZombieUpstream;
+import org.apache.shenyu.common.enums.PluginEnum;
+import org.apache.shenyu.common.utils.UpstreamCheckUtils;
 import org.apache.shenyu.register.common.config.ShenyuRegisterCenterConfig;
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
+import org.mockito.MockedStatic;
 import org.mockito.junit.MockitoJUnitRunner;
 import org.springframework.context.ApplicationEventPublisher;
 import org.springframework.test.util.ReflectionTestUtils;
@@ -35,6 +43,16 @@ import org.springframework.test.util.ReflectionTestUtils;
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
+import java.util.Properties;
+import java.util.Set;
+
+import static org.hamcrest.Matchers.is;
+import static org.junit.Assert.assertThat;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.ArgumentMatchers.anyList;
+import static org.mockito.Mockito.mockStatic;
+import static org.mockito.Mockito.when;
 
 /**
  * Test cases for UpstreamCheckService.
@@ -48,6 +66,8 @@ public final class UpstreamCheckServiceTest {
 
     private static final String MOCK_SELECTOR_NAME_OTHER = "mockSelectorNameOther";
 
+    private static final String MOCK_PLUGIN_ID = "mockPluginId";
+
     private UpstreamCheckService upstreamCheckService;
 
     @Mock
@@ -66,31 +86,89 @@ public final class UpstreamCheckServiceTest {
 
     private Map<String, List<DivideUpstream>> upstreamMap;
 
+    private Set<ZombieUpstream> zombieSet;
+
     @Before
     public void setUp() {
         shenyuRegisterCenterConfig.setRegisterType("http");
+        Properties properties = new Properties();
+        properties.setProperty(Constants.IS_CHECKED, "true");
+        shenyuRegisterCenterConfig.setProps(properties);
 
-        //get static variable reference by reflection
+        // get static variable reference by reflection
         upstreamMap = (Map<String, List<DivideUpstream>>) ReflectionTestUtils.getField(UpstreamCheckService.class, "UPSTREAM_MAP");
+        zombieSet = (Set<ZombieUpstream>) ReflectionTestUtils.getField(UpstreamCheckService.class, "ZOMBIE_SET");
+
         upstreamCheckService = new UpstreamCheckService(selectorMapper, eventPublisher, pluginMapper, selectorConditionMapper, shenyuRegisterCenterConfig);
-        //spring bean creation lifecycle phase:post construct.
-        upstreamCheckService.setup();
+    }
+
+    @Test
+    public void testScheduled() {
+        PluginDO pluginDO = PluginDO.builder()
+                .name(PluginEnum.DIVIDE.getName())
+                .id(MOCK_PLUGIN_ID)
+                .build();
+        SelectorDO selectorDOWithUrlError = SelectorDO.builder()
+                .pluginId(MOCK_PLUGIN_ID)
+                .name("UrlError")
+                .handle("[{\"upstreamHost\":\"localhost\",\"protocol\":\"http://\",\"upstreamUrl\":\"divide-upstream-50\",\"weight\":50}]")
+                .build();
+        SelectorDO selectorDOWithUrlReachable = SelectorDO.builder()
+                .pluginId(MOCK_PLUGIN_ID)
+                .name("UrlReachable")
+                .handle("[{\"upstreamHost\":\"localhost\",\"protocol\":\"http://\",\"localhost\":\"divide-upstream-60\",\"weight\":60}]")
+                .build();
+
+        when(pluginMapper.selectById(anyString())).thenReturn(pluginDO);
+        when(selectorMapper.selectByName(anyString())).then(invocationOnMock -> {
+            Object[] args = invocationOnMock.getArguments();
+            if ("UrlError".equals(args[0])) {
+                return selectorDOWithUrlError;
+            } else if ("UrlReachable".equals(args[0])) {
+                return selectorDOWithUrlReachable;
+            }
+            return null;
+        });
+        try (MockedStatic<UpstreamCheckUtils> mocked = mockStatic(UpstreamCheckUtils.class)) {
+            mocked.when(() -> UpstreamCheckUtils.checkUrl("ReachableUrl"))
+                    .thenReturn(true);
+            mocked.when(() -> UpstreamCheckUtils.checkUrl("ErrorUrl"))
+                    .thenReturn(false);
+
+            zombieSet.clear();
+            setupZombieSet();
+            upstreamMap.clear();
+            setupUpstreamMap();
+            ReflectionTestUtils.invokeMethod(upstreamCheckService, "scheduled");
+        }
+        assertThat(zombieSet.size(), is(2));
+        assertThat(upstreamMap.size(), is(2));
+        assertTrue(upstreamMap.containsKey("UrlReachable"));
+        assertTrue(upstreamMap.containsKey("UrlReachableAnother"));
     }
 
     @Test
     public void testRemoveByKey() {
+        upstreamMap.put(MOCK_SELECTOR_NAME, Collections.emptyList());
         UpstreamCheckService.removeByKey(MOCK_SELECTOR_NAME);
         Assert.assertFalse(upstreamMap.containsKey(MOCK_SELECTOR_NAME));
     }
 
     @Test
-    public void testSubmitWhenSelectorNameNotExists() {
+    public void testSubmit() {
+        // Test submit when selector name not exists
+        testSubmitOnce();
+        // Test submit when selector name exists
+        testSubmitOnce();
+    }
+
+    private void testSubmitOnce() {
         final DivideUpstream divideUpstream = DivideUpstream.builder()
                 .upstreamUrl("divide-upstream-60")
                 .weight(60)
                 .build();
         upstreamCheckService.submit(MOCK_SELECTOR_NAME_OTHER, divideUpstream);
-        Assert.assertTrue(upstreamMap.containsKey(MOCK_SELECTOR_NAME_OTHER));
+        assertTrue(upstreamMap.containsKey(MOCK_SELECTOR_NAME_OTHER));
     }
 
     @Test
@@ -108,8 +186,63 @@ public final class UpstreamCheckServiceTest {
     }
 
     @Test
-    public void testScheduled() {
-        ReflectionTestUtils.invokeMethod(upstreamCheckService, "scheduled");
-        Assert.assertFalse(upstreamMap.containsKey(MOCK_SELECTOR_NAME));
+    public void testFetchUpstreamData() {
+        PluginDO pluginDO = PluginDO.builder()
+                .name(PluginEnum.DIVIDE.getName())
+                .id(MOCK_PLUGIN_ID)
+                .build();
+        SelectorDO selectorDOWithUrlError = SelectorDO.builder()
+                .pluginId(MOCK_PLUGIN_ID)
+                .name(MOCK_SELECTOR_NAME)
+                .handle("[{\"upstreamHost\":\"localhost\",\"protocol\":\"http://\",\"upstreamUrl\":\"divide-upstream-50\",\"weight\":50}]")
+                .build();
+        SelectorDO selectorDOWithUrlReachable = SelectorDO.builder()
+                .pluginId(MOCK_PLUGIN_ID)
+                .name(MOCK_SELECTOR_NAME_OTHER)
+                .handle("[{\"upstreamHost\":\"localhost\",\"protocol\":\"http://\",\"localhost\":\"divide-upstream-60\",\"weight\":60}]")
+                .build();
+        when(pluginMapper.selectByNames(anyList())).thenReturn(Lists.newArrayList(pluginDO));
+        when(selectorMapper.findByPluginId(anyString())).thenReturn(Lists.newArrayList(selectorDOWithUrlError, selectorDOWithUrlReachable));
+        upstreamCheckService.fetchUpstreamData();
+        assertTrue(upstreamMap.containsKey(MOCK_SELECTOR_NAME));
+        assertTrue(upstreamMap.containsKey(MOCK_SELECTOR_NAME_OTHER));
+    }
+
+    private void setupZombieSet() {
+        final DivideUpstream divideUpstream1 = DivideUpstream.builder()
+                .upstreamHost("127.0.0.1")
+                .upstreamUrl("ReachableUrl")
+                .status(false)
+                .build();
+        final DivideUpstream divideUpstream2 = DivideUpstream.builder()
+                .upstreamHost("ErrorUrl")
+                .build();
+        ZombieUpstream zombieUpstream1 = ZombieUpstream.builder()
+                .divideUpstream(divideUpstream1)
+                .zombieCheckTimes(5)
+                .selectorName("UrlReachable")
+                .build();
+        ZombieUpstream zombieUpstream2 = ZombieUpstream.builder()
+                .divideUpstream(divideUpstream2)
+                .zombieCheckTimes(5)
+                .selectorName("UrlError")
+                .build();
+
+        zombieSet.add(zombieUpstream1);
+        zombieSet.add(zombieUpstream2);
+    }
+
+    private void setupUpstreamMap() {
+        final DivideUpstream divideUpstream1 = DivideUpstream.builder()
+                .upstreamHost("127.0.0.1")
+                .upstreamUrl("ReachableUrl")
+                .status(false)
+                .build();
+        final DivideUpstream divideUpstream2 = DivideUpstream.builder()
+                .upstreamHost("ErrorUrl")
+                .build();
+
+        upstreamMap.put("UrlReachableAnother", Collections.singletonList(divideUpstream1));
+        upstreamMap.put("UrlErrorAnother", Collections.singletonList(divideUpstream2));
     }
 }