You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@dolphinscheduler.apache.org by ch...@apache.org on 2022/09/29 00:16:37 UTC

[dolphinscheduler] branch dev updated: [Improvement][Test] Remove powermock in service and server modules (#12164)

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

chufenggao pushed a commit to branch dev
in repository https://gitbox.apache.org/repos/asf/dolphinscheduler.git


The following commit(s) were added to refs/heads/dev by this push:
     new d1e409e9a2 [Improvement][Test] Remove powermock in service and server modules (#12164)
d1e409e9a2 is described below

commit d1e409e9a2b7756bb73659d067dc3e0e7b0bb98f
Author: Eric Gao <er...@gmail.com>
AuthorDate: Thu Sep 29 08:16:23 2022 +0800

    [Improvement][Test] Remove powermock in service and server modules (#12164)
    
    * Remove powermock and refactor some related code in dolphinscheduler-service and dolphinscheduler-server modules
    * Remove redundant comments
    * Add null check
---
 dolphinscheduler-server/pom.xml                    |  53 ++++----
 .../server/utils/ProcessUtils.java                 |  28 ++--
 .../server/utils/ProcessUtilsTest.java             |  47 +++----
 dolphinscheduler-service/pom.xml                   |  36 ++++--
 .../service/alert/AlertClientService.java          |  17 ++-
 .../factory/NettyRemotingClientFactory.java        |  38 ++++++
 .../dolphinscheduler/service/log/LogClient.java    |   6 +-
 .../service/process/ProcessServiceImpl.java        |  17 ++-
 .../service/alert/AlertClientServiceTest.java      |  36 +++---
 .../service/alert/ProcessAlertManagerTest.java     |   4 +-
 .../service/log/LogClientTest.java                 | 144 ++++++++++++---------
 .../service/process/ProcessServiceTest.java        |  28 ++--
 12 files changed, 261 insertions(+), 193 deletions(-)

diff --git a/dolphinscheduler-server/pom.xml b/dolphinscheduler-server/pom.xml
index 40c8d166b7..5a0ee9972e 100644
--- a/dolphinscheduler-server/pom.xml
+++ b/dolphinscheduler-server/pom.xml
@@ -15,7 +15,6 @@
   ~ See the License for the specific language governing permissions and
   ~ limitations under the License.
   -->
-
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
@@ -25,8 +24,20 @@
         <version>dev-SNAPSHOT</version>
     </parent>
     <artifactId>dolphinscheduler-server</artifactId>
-    <name>dolphinscheduler-server</name>
     <packaging>jar</packaging>
+    <name>dolphinscheduler-server</name>
+
+    <dependencyManagement>
+        <dependencies>
+            <dependency>
+                <groupId>org.apache.dolphinscheduler</groupId>
+                <artifactId>dolphinscheduler-bom</artifactId>
+                <version>${project.version}</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+        </dependencies>
+    </dependencyManagement>
 
     <dependencies>
         <!-- dolphinscheduler -->
@@ -47,7 +58,13 @@
             <artifactId>mockito-core</artifactId>
             <scope>test</scope>
         </dependency>
-
+        <dependency>
+            <groupId>org.mockito</groupId>
+            <artifactId>mockito-inline</artifactId>
+            <version>3.12.4</version>
+            <!-- TODO: move this dependency to root pom after removing powermock in the whole project -->
+            <scope>test</scope>
+        </dependency>
         <dependency>
             <groupId>org.apache.hadoop</groupId>
             <artifactId>hadoop-common</artifactId>
@@ -62,8 +79,8 @@
                     <artifactId>jdk.tools</artifactId>
                 </exclusion>
                 <exclusion>
-                    <artifactId>servlet-api</artifactId>
                     <groupId>javax.servlet</groupId>
+                    <artifactId>servlet-api</artifactId>
                 </exclusion>
                 <exclusion>
                     <groupId>javax.servlet</groupId>
@@ -127,16 +144,16 @@
                     <artifactId>jsp-api</artifactId>
                 </exclusion>
                 <exclusion>
-                    <artifactId>jersey-json</artifactId>
                     <groupId>com.sun.jersey</groupId>
+                    <artifactId>jersey-json</artifactId>
                 </exclusion>
                 <exclusion>
-                    <artifactId>jersey-server</artifactId>
                     <groupId>com.sun.jersey</groupId>
+                    <artifactId>jersey-server</artifactId>
                 </exclusion>
                 <exclusion>
-                    <artifactId>jersey-core</artifactId>
                     <groupId>com.sun.jersey</groupId>
+                    <artifactId>jersey-core</artifactId>
                 </exclusion>
             </exclusions>
         </dependency>
@@ -154,8 +171,8 @@
                     <artifactId>slf4j-log4j12</artifactId>
                 </exclusion>
                 <exclusion>
-                    <artifactId>servlet-api</artifactId>
                     <groupId>javax.servlet</groupId>
+                    <artifactId>servlet-api</artifactId>
                 </exclusion>
                 <exclusion>
                     <groupId>org.codehaus.jackson</groupId>
@@ -179,37 +196,25 @@
                     <artifactId>hadoop-mapreduce-client-shuffle</artifactId>
                 </exclusion>
                 <exclusion>
-                    <artifactId>jersey-client</artifactId>
                     <groupId>com.sun.jersey</groupId>
+                    <artifactId>jersey-client</artifactId>
                 </exclusion>
                 <exclusion>
-                    <artifactId>jersey-core</artifactId>
                     <groupId>com.sun.jersey</groupId>
+                    <artifactId>jersey-core</artifactId>
                 </exclusion>
                 <exclusion>
-                    <artifactId>jaxb-api</artifactId>
                     <groupId>javax.xml.bind</groupId>
+                    <artifactId>jaxb-api</artifactId>
                 </exclusion>
                 <exclusion>
-                    <artifactId>log4j</artifactId>
                     <groupId>log4j</groupId>
+                    <artifactId>log4j</artifactId>
                 </exclusion>
             </exclusions>
         </dependency>
     </dependencies>
 
-    <dependencyManagement>
-        <dependencies>
-            <dependency>
-                <groupId>org.apache.dolphinscheduler</groupId>
-                <artifactId>dolphinscheduler-bom</artifactId>
-                <version>${project.version}</version>
-                <type>pom</type>
-                <scope>import</scope>
-            </dependency>
-        </dependencies>
-    </dependencyManagement>
-
     <build>
         <plugins>
             <plugin>
diff --git a/dolphinscheduler-server/src/main/java/org/apache/dolphinscheduler/server/utils/ProcessUtils.java b/dolphinscheduler-server/src/main/java/org/apache/dolphinscheduler/server/utils/ProcessUtils.java
index a8361fa4ed..35794cf3d0 100644
--- a/dolphinscheduler-server/src/main/java/org/apache/dolphinscheduler/server/utils/ProcessUtils.java
+++ b/dolphinscheduler-server/src/main/java/org/apache/dolphinscheduler/server/utils/ProcessUtils.java
@@ -17,10 +17,6 @@
 
 package org.apache.dolphinscheduler.server.utils;
 
-import lombok.NonNull;
-import org.apache.commons.collections.CollectionUtils;
-import org.apache.commons.lang3.StringUtils;
-import org.apache.commons.lang3.SystemUtils;
 import org.apache.dolphinscheduler.common.Constants;
 import org.apache.dolphinscheduler.common.utils.CommonUtils;
 import org.apache.dolphinscheduler.common.utils.FileUtils;
@@ -31,10 +27,11 @@ import org.apache.dolphinscheduler.plugin.task.api.TaskExecutionContext;
 import org.apache.dolphinscheduler.plugin.task.api.enums.TaskExecutionStatus;
 import org.apache.dolphinscheduler.remote.utils.Host;
 import org.apache.dolphinscheduler.service.log.LogClient;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
-import javax.annotation.Nullable;
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang3.SystemUtils;
+
 import java.io.File;
 import java.nio.charset.StandardCharsets;
 import java.util.ArrayList;
@@ -43,6 +40,13 @@ import java.util.List;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
+import javax.annotation.Nullable;
+
+import lombok.NonNull;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 /**
  * mainly used to get the start command line of a process.
  */
@@ -166,7 +170,9 @@ public class ProcessUtils {
             }
         } else {
             String pids = OSUtils.exeCmd(String.format("%s -p %d", Constants.PSTREE, processId));
-            mat = WINDOWSATTERN.matcher(pids);
+            if (null != pids) {
+                mat = WINDOWSATTERN.matcher(pids);
+            }
         }
 
         if (null != mat) {
@@ -206,10 +212,12 @@ public class ProcessUtils {
                                     taskExecutionContext.getTaskInstanceId()));
                 }
                 FileUtils.createWorkDirIfAbsent(taskExecutionContext.getExecutePath());
-                cancelApplication(appIds, logger, taskExecutionContext.getTenantCode(), taskExecutionContext.getExecutePath());
+                cancelApplication(appIds, logger, taskExecutionContext.getTenantCode(),
+                        taskExecutionContext.getExecutePath());
                 return appIds;
             } else {
-                logger.info("The current appId is empty, don't need to kill the yarn job, taskInstanceId: {}", taskExecutionContext.getTaskInstanceId());
+                logger.info("The current appId is empty, don't need to kill the yarn job, taskInstanceId: {}",
+                        taskExecutionContext.getTaskInstanceId());
             }
         } catch (Exception e) {
             logger.error("Kill yarn job failure, taskInstanceId: {}", taskExecutionContext.getTaskInstanceId(), e);
diff --git a/dolphinscheduler-server/src/test/java/org/apache/dolphinscheduler/server/utils/ProcessUtilsTest.java b/dolphinscheduler-server/src/test/java/org/apache/dolphinscheduler/server/utils/ProcessUtilsTest.java
index 232f4dbaf2..7664ed7f05 100644
--- a/dolphinscheduler-server/src/test/java/org/apache/dolphinscheduler/server/utils/ProcessUtilsTest.java
+++ b/dolphinscheduler-server/src/test/java/org/apache/dolphinscheduler/server/utils/ProcessUtilsTest.java
@@ -17,31 +17,28 @@
 
 package org.apache.dolphinscheduler.server.utils;
 
-import static org.powermock.api.mockito.PowerMockito.when;
-import org.apache.commons.lang3.SystemUtils;
+import static org.mockito.ArgumentMatchers.anyString;
+
 import org.apache.dolphinscheduler.common.Constants;
 import org.apache.dolphinscheduler.common.utils.HadoopUtils;
 import org.apache.dolphinscheduler.common.utils.OSUtils;
 import org.apache.dolphinscheduler.common.utils.PropertyUtils;
+import org.apache.dolphinscheduler.plugin.task.api.enums.TaskExecutionStatus;
 
 import java.util.ArrayList;
 import java.util.List;
 
-import org.apache.dolphinscheduler.plugin.task.api.enums.TaskExecutionStatus;
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.mockito.Mockito;
 import org.mockito.MockitoAnnotations;
-import org.powermock.api.mockito.PowerMockito;
-import org.powermock.core.classloader.annotations.PrepareForTest;
-import org.powermock.modules.junit4.PowerMockRunner;
-import org.powermock.reflect.Whitebox;
+import org.mockito.junit.MockitoJUnitRunner;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-@RunWith(PowerMockRunner.class)
-@PrepareForTest({System.class, OSUtils.class, HadoopUtils.class, PropertyUtils.class, SystemUtils.class})
+@RunWith(MockitoJUnitRunner.class)
 public class ProcessUtilsTest {
 
     private static final Logger logger = LoggerFactory.getLogger(ProcessUtils.class);
@@ -54,23 +51,22 @@ public class ProcessUtilsTest {
     @Test
     public void getPidsStr() throws Exception {
         int processId = 1;
-        PowerMockito.mockStatic(OSUtils.class);
-        Whitebox.setInternalState(SystemUtils.class, "IS_OS_MAC", true);
-        when(OSUtils.exeCmd(String.format("%s -p %d", Constants.PSTREE, processId))).thenReturn(null);
-        String pidListMac = ProcessUtils.getPidsStr(processId);
-        Assert.assertEquals("", pidListMac);
+        Mockito.mockStatic(OSUtils.class);
+        Mockito.when(OSUtils.exeCmd(anyString())).thenReturn(null);
+        String pidList = ProcessUtils.getPidsStr(processId);
+        Assert.assertEquals("", pidList);
     }
 
     @Test
     public void testGetKerberosInitCommand() {
-        PowerMockito.mockStatic(PropertyUtils.class);
-        PowerMockito.when(PropertyUtils.getBoolean(Constants.HADOOP_SECURITY_AUTHENTICATION_STARTUP_STATE, false))
+        Mockito.mockStatic(PropertyUtils.class);
+        Mockito.when(PropertyUtils.getBoolean(Constants.HADOOP_SECURITY_AUTHENTICATION_STARTUP_STATE, false))
                 .thenReturn(true);
-        PowerMockito.when(PropertyUtils.getString(Constants.JAVA_SECURITY_KRB5_CONF_PATH)).thenReturn("/etc/krb5.conf");
-        PowerMockito.when(PropertyUtils.getString(Constants.LOGIN_USER_KEY_TAB_PATH)).thenReturn("/etc/krb5.keytab");
-        PowerMockito.when(PropertyUtils.getString(Constants.LOGIN_USER_KEY_TAB_USERNAME)).thenReturn("test@DS.COM");
+        Mockito.when(PropertyUtils.getString(Constants.JAVA_SECURITY_KRB5_CONF_PATH)).thenReturn("/etc/krb5.conf");
+        Mockito.when(PropertyUtils.getString(Constants.LOGIN_USER_KEY_TAB_PATH)).thenReturn("/etc/krb5.keytab");
+        Mockito.when(PropertyUtils.getString(Constants.LOGIN_USER_KEY_TAB_USERNAME)).thenReturn("test@DS.COM");
         Assert.assertNotEquals("", ProcessUtils.getKerberosInitCommand());
-        PowerMockito.when(PropertyUtils.getBoolean(Constants.HADOOP_SECURITY_AUTHENTICATION_STARTUP_STATE, false))
+        Mockito.when(PropertyUtils.getBoolean(Constants.HADOOP_SECURITY_AUTHENTICATION_STARTUP_STATE, false))
                 .thenReturn(false);
         Assert.assertEquals("", ProcessUtils.getKerberosInitCommand());
     }
@@ -84,17 +80,12 @@ public class ProcessUtilsTest {
         String executePath = "/ds-exec/1/1/1";
         TaskExecutionStatus running = TaskExecutionStatus.RUNNING_EXECUTION;
 
-        PowerMockito.mockStatic(HadoopUtils.class);
+        Mockito.mockStatic(HadoopUtils.class);
         HadoopUtils hadoop = HadoopUtils.getInstance();
 
         try {
-            PowerMockito.whenNew(HadoopUtils.class).withAnyArguments().thenReturn(hadoop);
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-        try {
-            when(hadoop.getApplicationStatus("application_1585532379175_228491")).thenReturn(running);
-            when(hadoop.getApplicationStatus("application_1598885606600_3677")).thenReturn(running);
+            Mockito.when(hadoop.getApplicationStatus("application_1585532379175_228491")).thenReturn(running);
+            Mockito.when(hadoop.getApplicationStatus("application_1598885606600_3677")).thenReturn(running);
         } catch (Exception e) {
             e.printStackTrace();
             ProcessUtils.cancelApplication(appIds, logger, tenantCode, executePath);
diff --git a/dolphinscheduler-service/pom.xml b/dolphinscheduler-service/pom.xml
index 8b450f9f53..b8d89c0a6a 100644
--- a/dolphinscheduler-service/pom.xml
+++ b/dolphinscheduler-service/pom.xml
@@ -17,17 +17,29 @@
   -->
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
     <parent>
-        <artifactId>dolphinscheduler</artifactId>
         <groupId>org.apache.dolphinscheduler</groupId>
+        <artifactId>dolphinscheduler</artifactId>
         <version>dev-SNAPSHOT</version>
     </parent>
-    <modelVersion>4.0.0</modelVersion>
 
     <artifactId>dolphinscheduler-service</artifactId>
 
     <name>dolphinscheduler-service</name>
 
+    <dependencyManagement>
+        <dependencies>
+            <dependency>
+                <groupId>org.apache.dolphinscheduler</groupId>
+                <artifactId>dolphinscheduler-bom</artifactId>
+                <version>${project.version}</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+        </dependencies>
+    </dependencyManagement>
+
     <dependencies>
         <!-- dolphinscheduler -->
         <dependency>
@@ -51,6 +63,14 @@
             <artifactId>dolphinscheduler-task-api</artifactId>
         </dependency>
 
+        <dependency>
+            <groupId>org.mockito</groupId>
+            <artifactId>mockito-inline</artifactId>
+            <version>3.12.4</version>
+            <!-- TODO: move this dependency to root pom after removing powermock in the whole project -->
+            <scope>test</scope>
+        </dependency>
+
         <dependency>
             <groupId>com.cronutils</groupId>
             <artifactId>cron-utils</artifactId>
@@ -63,16 +83,4 @@
         </dependency>
 
     </dependencies>
-
-    <dependencyManagement>
-        <dependencies>
-            <dependency>
-                <groupId>org.apache.dolphinscheduler</groupId>
-                <artifactId>dolphinscheduler-bom</artifactId>
-                <version>${project.version}</version>
-                <type>pom</type>
-                <scope>import</scope>
-            </dependency>
-        </dependencies>
-    </dependencyManagement>
 </project>
diff --git a/dolphinscheduler-service/src/main/java/org/apache/dolphinscheduler/service/alert/AlertClientService.java b/dolphinscheduler-service/src/main/java/org/apache/dolphinscheduler/service/alert/AlertClientService.java
index ce6ad57035..178cd6b2cc 100644
--- a/dolphinscheduler-service/src/main/java/org/apache/dolphinscheduler/service/alert/AlertClientService.java
+++ b/dolphinscheduler-service/src/main/java/org/apache/dolphinscheduler/service/alert/AlertClientService.java
@@ -21,9 +21,9 @@ import org.apache.dolphinscheduler.remote.NettyRemotingClient;
 import org.apache.dolphinscheduler.remote.command.Command;
 import org.apache.dolphinscheduler.remote.command.alert.AlertSendRequestCommand;
 import org.apache.dolphinscheduler.remote.command.alert.AlertSendResponseCommand;
-import org.apache.dolphinscheduler.remote.config.NettyClientConfig;
 import org.apache.dolphinscheduler.remote.utils.Host;
 import org.apache.dolphinscheduler.remote.utils.JsonSerializer;
+import org.apache.dolphinscheduler.service.factory.NettyRemotingClientFactory;
 
 import java.util.concurrent.atomic.AtomicBoolean;
 
@@ -34,8 +34,6 @@ public class AlertClientService implements AutoCloseable {
 
     private static final Logger logger = LoggerFactory.getLogger(AlertClientService.class);
 
-    private final NettyClientConfig clientConfig;
-
     private final NettyRemotingClient client;
 
     private final AtomicBoolean isRunning;
@@ -53,8 +51,7 @@ public class AlertClientService implements AutoCloseable {
      * alert client
      */
     public AlertClientService() {
-        this.clientConfig = new NettyClientConfig();
-        this.client = new NettyRemotingClient(clientConfig);
+        this.client = NettyRemotingClientFactory.buildNettyRemotingClient();
         this.isRunning = new AtomicBoolean(true);
     }
 
@@ -89,8 +86,8 @@ public class AlertClientService implements AutoCloseable {
      * @param content
      * @return
      */
-    public AlertSendResponseCommand sendAlert(int groupId, String title,  String content, int strategy) {
-        return this.sendAlert(this.host,this.port,groupId,title,content,strategy);
+    public AlertSendResponseCommand sendAlert(int groupId, String title, String content, int strategy) {
+        return this.sendAlert(this.host, this.port, groupId, title, content, strategy);
     }
 
     /**
@@ -102,8 +99,10 @@ public class AlertClientService implements AutoCloseable {
      * @param content content
      * @return AlertSendResponseCommand
      */
-    public AlertSendResponseCommand sendAlert(String host, int port, int groupId, String title,  String content, int strategy) {
-        logger.info("sync alert send, host : {}, port : {}, groupId : {}, title : {} , strategy : {} ", host, port, groupId, title, strategy);
+    public AlertSendResponseCommand sendAlert(String host, int port, int groupId, String title, String content,
+                                              int strategy) {
+        logger.info("sync alert send, host : {}, port : {}, groupId : {}, title : {} , strategy : {} ", host, port,
+                groupId, title, strategy);
         AlertSendRequestCommand request = new AlertSendRequestCommand(groupId, title, content, strategy);
         final Host address = new Host(host, port);
         try {
diff --git a/dolphinscheduler-service/src/main/java/org/apache/dolphinscheduler/service/factory/NettyRemotingClientFactory.java b/dolphinscheduler-service/src/main/java/org/apache/dolphinscheduler/service/factory/NettyRemotingClientFactory.java
new file mode 100644
index 0000000000..450b052be4
--- /dev/null
+++ b/dolphinscheduler-service/src/main/java/org/apache/dolphinscheduler/service/factory/NettyRemotingClientFactory.java
@@ -0,0 +1,38 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.dolphinscheduler.service.factory;
+
+import org.apache.dolphinscheduler.remote.NettyRemotingClient;
+import org.apache.dolphinscheduler.remote.config.NettyClientConfig;
+
+import lombok.experimental.UtilityClass;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+@UtilityClass
+public class NettyRemotingClientFactory {
+
+    private final Logger logger = LoggerFactory.getLogger(NettyRemotingClientFactory.class);
+
+    public NettyRemotingClient buildNettyRemotingClient() {
+        NettyClientConfig nettyClientConfig = new NettyClientConfig();
+        logger.info("NettyRemotingClient initialized with config: {}", nettyClientConfig);
+        return new NettyRemotingClient(nettyClientConfig);
+    }
+}
diff --git a/dolphinscheduler-service/src/main/java/org/apache/dolphinscheduler/service/log/LogClient.java b/dolphinscheduler-service/src/main/java/org/apache/dolphinscheduler/service/log/LogClient.java
index 611bb49b67..d72dfeba13 100644
--- a/dolphinscheduler-service/src/main/java/org/apache/dolphinscheduler/service/log/LogClient.java
+++ b/dolphinscheduler-service/src/main/java/org/apache/dolphinscheduler/service/log/LogClient.java
@@ -33,9 +33,9 @@ import org.apache.dolphinscheduler.remote.command.log.RollViewLogRequestCommand;
 import org.apache.dolphinscheduler.remote.command.log.RollViewLogResponseCommand;
 import org.apache.dolphinscheduler.remote.command.log.ViewLogRequestCommand;
 import org.apache.dolphinscheduler.remote.command.log.ViewLogResponseCommand;
-import org.apache.dolphinscheduler.remote.config.NettyClientConfig;
 import org.apache.dolphinscheduler.remote.exceptions.RemotingException;
 import org.apache.dolphinscheduler.remote.utils.Host;
+import org.apache.dolphinscheduler.service.factory.NettyRemotingClientFactory;
 
 import java.util.List;
 
@@ -59,9 +59,7 @@ public class LogClient implements AutoCloseable {
     private static final long LOG_REQUEST_TIMEOUT = 10 * 1000L;
 
     public LogClient() {
-        NettyClientConfig nettyClientConfig = new NettyClientConfig();
-        this.client = new NettyRemotingClient(nettyClientConfig);
-        logger.info("Initialized LogClientService with config: {}", nettyClientConfig);
+        client = NettyRemotingClientFactory.buildNettyRemotingClient();
     }
 
     /**
diff --git a/dolphinscheduler-service/src/main/java/org/apache/dolphinscheduler/service/process/ProcessServiceImpl.java b/dolphinscheduler-service/src/main/java/org/apache/dolphinscheduler/service/process/ProcessServiceImpl.java
index 5d9c952617..57e16d2250 100644
--- a/dolphinscheduler-service/src/main/java/org/apache/dolphinscheduler/service/process/ProcessServiceImpl.java
+++ b/dolphinscheduler-service/src/main/java/org/apache/dolphinscheduler/service/process/ProcessServiceImpl.java
@@ -169,7 +169,6 @@ import com.fasterxml.jackson.databind.node.ObjectNode;
 import com.google.common.base.Joiner;
 import com.google.common.base.Strings;
 import com.google.common.collect.Lists;
-
 import io.micrometer.core.annotation.Counted;
 
 /**
@@ -939,7 +938,7 @@ public class ProcessServiceImpl implements ProcessService {
             throw new IllegalArgumentException("Cannot find the process definition for this workflowInstance");
         }
         Map<String, String> cmdParam = JSONUtils.toMap(command.getCommandParam());
-        if(cmdParam == null){
+        if (cmdParam == null) {
             cmdParam = new HashMap<>();
         }
         int processInstanceId = command.getProcessInstanceId();
@@ -963,10 +962,10 @@ public class ProcessServiceImpl implements ProcessService {
 
         // Recalculate global parameters after rerun.
         String globalParams = curingGlobalParamsService.curingGlobalParams(processInstance.getId(),
-            processDefinition.getGlobalParamMap(),
-            processDefinition.getGlobalParamList(),
-            commandTypeIfComplement,
-            processInstance.getScheduleTime(), timezoneId);
+                processDefinition.getGlobalParamMap(),
+                processDefinition.getGlobalParamList(),
+                commandTypeIfComplement,
+                processInstance.getScheduleTime(), timezoneId);
         processInstance.setGlobalParams(globalParams);
         processInstance.setProcessDefinition(processDefinition);
 
@@ -1014,7 +1013,7 @@ public class ProcessServiceImpl implements ProcessService {
                     initTaskInstance(this.findTaskInstanceById(taskId));
                 }
                 cmdParam.put(Constants.CMD_PARAM_RECOVERY_START_NODE_STRING,
-                    String.join(Constants.COMMA, convertIntListToString(failedList)));
+                        String.join(Constants.COMMA, convertIntListToString(failedList)));
                 processInstance.setCommandParam(JSONUtils.toJsonString(cmdParam));
                 processInstance.setRunTimes(runTime + 1);
                 break;
@@ -1032,7 +1031,7 @@ public class ProcessServiceImpl implements ProcessService {
                     initTaskInstance(this.findTaskInstanceById(taskId));
                 }
                 cmdParam.put(Constants.CMD_PARAM_RECOVERY_START_NODE_STRING,
-                    String.join(Constants.COMMA, convertIntListToString(stopNodeList)));
+                        String.join(Constants.COMMA, convertIntListToString(stopNodeList)));
                 processInstance.setCommandParam(JSONUtils.toJsonString(cmdParam));
                 processInstance.setRunTimes(runTime + 1);
                 break;
@@ -1817,7 +1816,7 @@ public class ProcessServiceImpl implements ProcessService {
      * @param res origin resource info
      * @return {@link ResourceInfo}
      */
-    private ResourceInfo updateResourceInfo(ResourceInfo res) {
+    protected ResourceInfo updateResourceInfo(ResourceInfo res) {
         ResourceInfo resourceInfo = null;
         // only if mainJar is not null and does not contains "resourceName" field
         if (res != null) {
diff --git a/dolphinscheduler-service/src/test/java/org/apache/dolphinscheduler/service/alert/AlertClientServiceTest.java b/dolphinscheduler-service/src/test/java/org/apache/dolphinscheduler/service/alert/AlertClientServiceTest.java
index 5dbd26b173..0140f6e770 100644
--- a/dolphinscheduler-service/src/test/java/org/apache/dolphinscheduler/service/alert/AlertClientServiceTest.java
+++ b/dolphinscheduler-service/src/test/java/org/apache/dolphinscheduler/service/alert/AlertClientServiceTest.java
@@ -23,27 +23,24 @@ import org.apache.dolphinscheduler.remote.command.Command;
 import org.apache.dolphinscheduler.remote.command.alert.AlertSendRequestCommand;
 import org.apache.dolphinscheduler.remote.command.alert.AlertSendResponseCommand;
 import org.apache.dolphinscheduler.remote.command.alert.AlertSendResponseResult;
+import org.apache.dolphinscheduler.service.factory.NettyRemotingClientFactory;
 
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Objects;
 
+import org.junit.After;
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.mockito.MockedStatic;
 import org.mockito.Mockito;
-import org.powermock.api.mockito.PowerMockito;
-import org.powermock.core.classloader.annotations.PrepareForTest;
-import org.powermock.modules.junit4.PowerMockRunner;
+import org.mockito.junit.MockitoJUnitRunner;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-/**
- * alert client service test
- */
-@RunWith(PowerMockRunner.class)
-@PrepareForTest({AlertClientService.class})
+@RunWith(MockitoJUnitRunner.class)
 public class AlertClientServiceTest {
 
     private static final Logger logger = LoggerFactory.getLogger(AlertClientServiceTest.class);
@@ -52,13 +49,22 @@ public class AlertClientServiceTest {
 
     private AlertClientService alertClient;
 
+    private MockedStatic<NettyRemotingClientFactory> mockedNettyRemotingClientFactory;
+
     @Before
     public void before() throws Exception {
-        client = PowerMockito.mock(NettyRemotingClient.class);
-        PowerMockito.whenNew(NettyRemotingClient.class).withAnyArguments().thenReturn(client);
+        client = Mockito.mock(NettyRemotingClient.class);
+        mockedNettyRemotingClientFactory = Mockito.mockStatic(NettyRemotingClientFactory.class);
+        mockedNettyRemotingClientFactory.when(NettyRemotingClientFactory::buildNettyRemotingClient)
+                .thenReturn(client);
         alertClient = new AlertClientService();
     }
 
+    @After
+    public void after() {
+        mockedNettyRemotingClientFactory.close();
+    }
+
     @Test
     public void testSendAlert() throws Exception {
         String host = "127.0.0.1";
@@ -89,7 +95,7 @@ public class AlertClientServiceTest {
                 new AlertSendResponseCommand(sendResponseStatus, sendResponseResults);
         Command resCommand = alertSendResponseCommandData.convert2Command(reqCommand.getOpaque());
 
-        PowerMockito.when(client.sendSync(Mockito.any(), Mockito.any(), Mockito.anyLong())).thenReturn(resCommand);
+        Mockito.when(client.sendSync(Mockito.any(), Mockito.any(), Mockito.anyLong())).thenReturn(resCommand);
         alertSendResponseCommand =
                 alertClient.sendAlert(host, port, groupId, title, content, WarningType.FAILURE.getCode());
         Assert.assertFalse(alertSendResponseCommand.isSuccess());
@@ -104,7 +110,7 @@ public class AlertClientServiceTest {
         alertResult.setMessage(message);
         alertSendResponseCommandData = new AlertSendResponseCommand(sendResponseStatus, sendResponseResults);
         resCommand = alertSendResponseCommandData.convert2Command(reqCommand.getOpaque());
-        PowerMockito.when(client.sendSync(Mockito.any(), Mockito.any(), Mockito.anyLong())).thenReturn(resCommand);
+        Mockito.when(client.sendSync(Mockito.any(), Mockito.any(), Mockito.anyLong())).thenReturn(resCommand);
         alertSendResponseCommand =
                 alertClient.sendAlert(host, port, groupId, title, content, WarningType.FAILURE.getCode());
         Assert.assertFalse(alertSendResponseCommand.isSuccess());
@@ -118,7 +124,7 @@ public class AlertClientServiceTest {
         alertResult.setMessage(message);
         alertSendResponseCommandData = new AlertSendResponseCommand(sendResponseStatus, sendResponseResults);
         resCommand = alertSendResponseCommandData.convert2Command(reqCommand.getOpaque());
-        PowerMockito.when(client.sendSync(Mockito.any(), Mockito.any(), Mockito.anyLong())).thenReturn(resCommand);
+        Mockito.when(client.sendSync(Mockito.any(), Mockito.any(), Mockito.anyLong())).thenReturn(resCommand);
         alertSendResponseCommand =
                 alertClient.sendAlert(host, port, groupId, title, content, WarningType.FAILURE.getCode());
         Assert.assertFalse(alertSendResponseCommand.isSuccess());
@@ -131,7 +137,7 @@ public class AlertClientServiceTest {
         alertResult.setMessage("Abnormal information inside the alert plug-in code");
         alertSendResponseCommandData = new AlertSendResponseCommand(sendResponseStatus, sendResponseResults);
         resCommand = alertSendResponseCommandData.convert2Command(reqCommand.getOpaque());
-        PowerMockito.when(client.sendSync(Mockito.any(), Mockito.any(), Mockito.anyLong())).thenReturn(resCommand);
+        Mockito.when(client.sendSync(Mockito.any(), Mockito.any(), Mockito.anyLong())).thenReturn(resCommand);
         alertSendResponseCommand =
                 alertClient.sendAlert(host, port, groupId, title, content, WarningType.FAILURE.getCode());
         Assert.assertFalse(alertSendResponseCommand.isSuccess());
@@ -145,7 +151,7 @@ public class AlertClientServiceTest {
         alertResult.setMessage(message);
         alertSendResponseCommandData = new AlertSendResponseCommand(sendResponseStatus, sendResponseResults);
         resCommand = alertSendResponseCommandData.convert2Command(reqCommand.getOpaque());
-        PowerMockito.when(client.sendSync(Mockito.any(), Mockito.any(), Mockito.anyLong())).thenReturn(resCommand);
+        Mockito.when(client.sendSync(Mockito.any(), Mockito.any(), Mockito.anyLong())).thenReturn(resCommand);
         alertSendResponseCommand =
                 alertClient.sendAlert(host, port, groupId, title, content, WarningType.FAILURE.getCode());
         Assert.assertTrue(alertSendResponseCommand.isSuccess());
diff --git a/dolphinscheduler-service/src/test/java/org/apache/dolphinscheduler/service/alert/ProcessAlertManagerTest.java b/dolphinscheduler-service/src/test/java/org/apache/dolphinscheduler/service/alert/ProcessAlertManagerTest.java
index ec37903c9c..e0fbc58b9a 100644
--- a/dolphinscheduler-service/src/test/java/org/apache/dolphinscheduler/service/alert/ProcessAlertManagerTest.java
+++ b/dolphinscheduler-service/src/test/java/org/apache/dolphinscheduler/service/alert/ProcessAlertManagerTest.java
@@ -33,14 +33,14 @@ import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.InjectMocks;
 import org.mockito.Mock;
-import org.powermock.modules.junit4.PowerMockRunner;
+import org.mockito.junit.MockitoJUnitRunner;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 /**
  * ProcessAlertManager Test
  */
-@RunWith(PowerMockRunner.class)
+@RunWith(MockitoJUnitRunner.class)
 public class ProcessAlertManagerTest {
 
     private static final Logger logger = LoggerFactory.getLogger(ProcessAlertManagerTest.class);
diff --git a/dolphinscheduler-service/src/test/java/org/apache/dolphinscheduler/service/log/LogClientTest.java b/dolphinscheduler-service/src/test/java/org/apache/dolphinscheduler/service/log/LogClientTest.java
index c0b6001303..449cbc5a3c 100644
--- a/dolphinscheduler-service/src/test/java/org/apache/dolphinscheduler/service/log/LogClientTest.java
+++ b/dolphinscheduler-service/src/test/java/org/apache/dolphinscheduler/service/log/LogClientTest.java
@@ -27,20 +27,18 @@ import org.apache.dolphinscheduler.remote.command.log.RemoveTaskLogResponseComma
 import org.apache.dolphinscheduler.remote.command.log.RollViewLogResponseCommand;
 import org.apache.dolphinscheduler.remote.command.log.ViewLogResponseCommand;
 import org.apache.dolphinscheduler.remote.utils.Host;
+import org.apache.dolphinscheduler.service.factory.NettyRemotingClientFactory;
 
 import java.nio.charset.StandardCharsets;
 
 import org.junit.Assert;
 import org.junit.Test;
-import org.junit.Test.None;
 import org.junit.runner.RunWith;
+import org.mockito.MockedStatic;
 import org.mockito.Mockito;
-import org.powermock.api.mockito.PowerMockito;
-import org.powermock.core.classloader.annotations.PrepareForTest;
-import org.powermock.modules.junit4.PowerMockRunner;
+import org.mockito.junit.MockitoJUnitRunner;
 
-@RunWith(PowerMockRunner.class)
-@PrepareForTest({LogClient.class, NetUtils.class, LoggerUtils.class, NettyRemotingClient.class})
+@RunWith(MockitoJUnitRunner.class)
 public class LogClientTest {
 
     @Test
@@ -49,14 +47,17 @@ public class LogClientTest {
         int port = 1234;
         String path = "/tmp/log";
 
-        PowerMockito.mockStatic(NetUtils.class);
-        PowerMockito.when(NetUtils.getHost()).thenReturn(localMachine);
-        PowerMockito.mockStatic(LoggerUtils.class);
-        PowerMockito.when(LoggerUtils.readWholeFileContent(Mockito.anyString())).thenReturn("application_xx_11");
-
-        LogClient logClient = new LogClient();
-        String log = logClient.viewLog(localMachine, port, path);
-        Assert.assertNotNull(log);
+        try (
+                MockedStatic<NetUtils> mockedNetUtils = Mockito.mockStatic(NetUtils.class);
+                MockedStatic<LoggerUtils> mockedLoggerUtils = Mockito.mockStatic(LoggerUtils.class)) {
+            mockedNetUtils.when(NetUtils::getHost)
+                    .thenReturn(localMachine);
+            mockedLoggerUtils.when(() -> LoggerUtils.readWholeFileContent(Mockito.anyString()))
+                    .thenReturn("application_xx_11");
+            LogClient logClient = new LogClient();
+            String log = logClient.viewLog(localMachine, port, path);
+            Assert.assertNotNull(log);
+        }
     }
 
     @Test
@@ -65,74 +66,93 @@ public class LogClientTest {
         int port = 1234;
         String path = "/tmp/log";
 
-        PowerMockito.mockStatic(NetUtils.class);
-        PowerMockito.when(NetUtils.getHost()).thenReturn(localMachine + "1");
-
-        NettyRemotingClient remotingClient = PowerMockito.mock(NettyRemotingClient.class);
-        PowerMockito.whenNew(NettyRemotingClient.class).withAnyArguments().thenReturn(remotingClient);
+        try (MockedStatic<NetUtils> mockedNetUtils = Mockito.mockStatic(NetUtils.class)) {
+            mockedNetUtils.when(NetUtils::getHost)
+                    .thenReturn(localMachine + "1");
+            LogClient logClient = new LogClient();
+            String log = logClient.viewLog(localMachine, port, path);
+            Assert.assertNotNull(log);
+        }
 
         Command command = new Command();
         command.setBody(JSONUtils.toJsonString(new ViewLogResponseCommand("")).getBytes(StandardCharsets.UTF_8));
-        PowerMockito.when(remotingClient.sendSync(Mockito.any(Host.class), Mockito.any(Command.class), Mockito.anyLong()))
-                .thenReturn(command);
         LogClient logClient = new LogClient();
         String log = logClient.viewLog(localMachine, port, path);
         Assert.assertNotNull(log);
     }
 
-    @Test(expected = None.class)
-    public void testClose() throws Exception {
-        NettyRemotingClient remotingClient = PowerMockito.mock(NettyRemotingClient.class);
-        PowerMockito.whenNew(NettyRemotingClient.class).withAnyArguments().thenReturn(remotingClient);
-        PowerMockito.doNothing().when(remotingClient).close();
-
-        LogClient logClient = new LogClient();
-        logClient.close();
+    @Test
+    public void testClose() {
+        try (
+                MockedStatic<NettyRemotingClientFactory> mockedNettyRemotingClientFactory =
+                        Mockito.mockStatic(NettyRemotingClientFactory.class)) {
+            NettyRemotingClient remotingClient = Mockito.mock(NettyRemotingClient.class);
+            mockedNettyRemotingClientFactory.when(NettyRemotingClientFactory::buildNettyRemotingClient)
+                    .thenReturn(remotingClient);
+            LogClient logClient = new LogClient();
+            logClient.close();
+        }
     }
 
     @Test
     public void testRollViewLog() throws Exception {
-        NettyRemotingClient remotingClient = PowerMockito.mock(NettyRemotingClient.class);
-        PowerMockito.whenNew(NettyRemotingClient.class).withAnyArguments().thenReturn(remotingClient);
-
-        Command command = new Command();
-        command.setBody(JSONUtils.toJsonByteArray(new RollViewLogResponseCommand("success")));
-        PowerMockito.when(remotingClient.sendSync(Mockito.any(Host.class), Mockito.any(Command.class), Mockito.anyLong()))
-                .thenReturn(command);
-
-        LogClient logClient = new LogClient();
-        String msg = logClient.rollViewLog("localhost", 1234, "/tmp/log", 0, 10);
-        Assert.assertNotNull(msg);
+        try (
+                MockedStatic<NettyRemotingClientFactory> mockedNettyRemotingClientFactory =
+                        Mockito.mockStatic(NettyRemotingClientFactory.class)) {
+            NettyRemotingClient remotingClient = Mockito.mock(NettyRemotingClient.class);
+            mockedNettyRemotingClientFactory.when(NettyRemotingClientFactory::buildNettyRemotingClient)
+                    .thenReturn(remotingClient);
+            Command command = new Command();
+            command.setBody(JSONUtils.toJsonByteArray(new RollViewLogResponseCommand("success")));
+            Mockito.when(
+                    remotingClient.sendSync(Mockito.any(Host.class), Mockito.any(Command.class), Mockito.anyLong()))
+                    .thenReturn(command);
+
+            LogClient logClient = new LogClient();
+            String msg = logClient.rollViewLog("localhost", 1234, "/tmp/log", 0, 10);
+            Assert.assertNotNull(msg);
+        }
     }
 
     @Test
     public void testGetLogBytes() throws Exception {
-        NettyRemotingClient remotingClient = PowerMockito.mock(NettyRemotingClient.class);
-        PowerMockito.whenNew(NettyRemotingClient.class).withAnyArguments().thenReturn(remotingClient);
-
-        Command command = new Command();
-        command.setBody(JSONUtils.toJsonByteArray(new GetLogBytesResponseCommand("log".getBytes(StandardCharsets.UTF_8))));
-        PowerMockito.when(remotingClient.sendSync(Mockito.any(Host.class), Mockito.any(Command.class), Mockito.anyLong()))
-                .thenReturn(command);
-
-        LogClient logClient = new LogClient();
-        byte[] logBytes = logClient.getLogBytes("localhost", 1234, "/tmp/log");
-        Assert.assertNotNull(logBytes);
+        try (
+                MockedStatic<NettyRemotingClientFactory> mockedNettyRemotingClientFactory =
+                        Mockito.mockStatic(NettyRemotingClientFactory.class)) {
+            NettyRemotingClient remotingClient = Mockito.mock(NettyRemotingClient.class);
+            mockedNettyRemotingClientFactory.when(NettyRemotingClientFactory::buildNettyRemotingClient)
+                    .thenReturn(remotingClient);
+            Command command = new Command();
+            command.setBody(
+                    JSONUtils.toJsonByteArray(new GetLogBytesResponseCommand("log".getBytes(StandardCharsets.UTF_8))));
+            Mockito.when(
+                    remotingClient.sendSync(Mockito.any(Host.class), Mockito.any(Command.class), Mockito.anyLong()))
+                    .thenReturn(command);
+
+            LogClient logClient = new LogClient();
+            byte[] logBytes = logClient.getLogBytes("localhost", 1234, "/tmp/log");
+            Assert.assertNotNull(logBytes);
+        }
     }
 
     @Test
     public void testRemoveTaskLog() throws Exception {
-        NettyRemotingClient remotingClient = PowerMockito.mock(NettyRemotingClient.class);
-        PowerMockito.whenNew(NettyRemotingClient.class).withAnyArguments().thenReturn(remotingClient);
-
-        Command command = new Command();
-        command.setBody(JSONUtils.toJsonByteArray(new RemoveTaskLogResponseCommand(true)));
-        PowerMockito.when(remotingClient.sendSync(Mockito.any(Host.class), Mockito.any(Command.class), Mockito.anyLong()))
-                .thenReturn(command);
 
-        LogClient logClient = new LogClient();
-        Boolean status = logClient.removeTaskLog("localhost", 1234, "/log/path");
-        Assert.assertTrue(status);
+        try (
+                MockedStatic<NettyRemotingClientFactory> mockedNettyRemotingClientFactory =
+                        Mockito.mockStatic(NettyRemotingClientFactory.class)) {
+            NettyRemotingClient remotingClient = Mockito.mock(NettyRemotingClient.class);
+            mockedNettyRemotingClientFactory.when(NettyRemotingClientFactory::buildNettyRemotingClient)
+                    .thenReturn(remotingClient);
+            Command command = new Command();
+            command.setBody(JSONUtils.toJsonByteArray(new RemoveTaskLogResponseCommand(true)));
+            Mockito.when(
+                    remotingClient.sendSync(Mockito.any(Host.class), Mockito.any(Command.class), Mockito.anyLong()))
+                    .thenReturn(command);
+
+            LogClient logClient = new LogClient();
+            Boolean status = logClient.removeTaskLog("localhost", 1234, "/log/path");
+            Assert.assertTrue(status);
+        }
     }
-
 }
diff --git a/dolphinscheduler-service/src/test/java/org/apache/dolphinscheduler/service/process/ProcessServiceTest.java b/dolphinscheduler-service/src/test/java/org/apache/dolphinscheduler/service/process/ProcessServiceTest.java
index b1d64e67c3..1cb0794875 100644
--- a/dolphinscheduler-service/src/test/java/org/apache/dolphinscheduler/service/process/ProcessServiceTest.java
+++ b/dolphinscheduler-service/src/test/java/org/apache/dolphinscheduler/service/process/ProcessServiceTest.java
@@ -102,7 +102,6 @@ import org.mockito.InjectMocks;
 import org.mockito.Mock;
 import org.mockito.Mockito;
 import org.mockito.junit.MockitoJUnitRunner;
-import org.powermock.reflect.Whitebox;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -823,16 +822,12 @@ public class ProcessServiceTest {
     public void testUpdateResourceInfo() throws Exception {
         // test if input is null
         ResourceInfo resourceInfoNull = null;
-        ResourceInfo updatedResourceInfo1 = Whitebox.invokeMethod(processService,
-                "updateResourceInfo",
-                resourceInfoNull);
+        ResourceInfo updatedResourceInfo1 = processService.updateResourceInfo(resourceInfoNull);
         Assert.assertNull(updatedResourceInfo1);
 
         // test if resource id less than 1
         ResourceInfo resourceInfoVoid = new ResourceInfo();
-        ResourceInfo updatedResourceInfo2 = Whitebox.invokeMethod(processService,
-                "updateResourceInfo",
-                resourceInfoVoid);
+        ResourceInfo updatedResourceInfo2 = processService.updateResourceInfo(resourceInfoVoid);
         Assert.assertNull(updatedResourceInfo2);
 
         // test normal situation
@@ -843,9 +838,8 @@ public class ProcessServiceTest {
         resource.setFileName("test.txt");
         resource.setFullName("/test.txt");
         Mockito.when(resourceMapper.selectById(1)).thenReturn(resource);
-        ResourceInfo updatedResourceInfo3 = Whitebox.invokeMethod(processService,
-                "updateResourceInfo",
-                resourceInfoNormal);
+
+        ResourceInfo updatedResourceInfo3 = processService.updateResourceInfo(resourceInfoNormal);
 
         Assert.assertEquals(1, updatedResourceInfo3.getId().intValue());
         Assert.assertEquals("test.txt", updatedResourceInfo3.getRes());
@@ -911,13 +905,15 @@ public class ProcessServiceTest {
         DateInterval dateInterval = new DateInterval(new Date(), new Date());
         int testFlag = 1;
 
-        //find test lastManualProcessInterval
-        ProcessInstance lastManualProcessInterval = processService.findLastManualProcessInterval(definitionCode, dateInterval, testFlag);
+        // find test lastManualProcessInterval
+        ProcessInstance lastManualProcessInterval =
+                processService.findLastManualProcessInterval(definitionCode, dateInterval, testFlag);
         Assert.assertEquals(null, lastManualProcessInterval);
 
-        //find online lastManualProcessInterval
+        // find online lastManualProcessInterval
         testFlag = 0;
-        lastManualProcessInterval = processService.findLastManualProcessInterval(definitionCode, dateInterval, testFlag);
+        lastManualProcessInterval =
+                processService.findLastManualProcessInterval(definitionCode, dateInterval, testFlag);
         Assert.assertEquals(null, lastManualProcessInterval);
     }
 
@@ -925,12 +921,12 @@ public class ProcessServiceTest {
     public void testQueryTestDataSourceId() {
         Integer onlineDataSourceId = 1;
 
-        //unbound testDataSourceId
+        // unbound testDataSourceId
         Mockito.when(dataSourceMapper.queryTestDataSourceId(any(Integer.class))).thenReturn(null);
         Integer result = processService.queryTestDataSourceId(onlineDataSourceId);
         Assert.assertNull(result);
 
-        //bound testDataSourceId
+        // bound testDataSourceId
         Integer testDataSourceId = 2;
         Mockito.when(dataSourceMapper.queryTestDataSourceId(any(Integer.class))).thenReturn(testDataSourceId);
         result = processService.queryTestDataSourceId(onlineDataSourceId);