You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by wu...@apache.org on 2022/10/11 08:25:25 UTC

[shardingsphere-elasticjob] branch master updated: Support building project by Java 19 (#2130)

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

wuweijie pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shardingsphere-elasticjob.git


The following commit(s) were added to refs/heads/master by this push:
     new 76199ab2e Support building project by Java 19 (#2130)
76199ab2e is described below

commit 76199ab2e48875eddf92ef34c6126599869d2205
Author: 吴伟杰 <wu...@apache.org>
AuthorDate: Tue Oct 11 16:25:19 2022 +0800

    Support building project by Java 19 (#2130)
    
    * Bump plugins and dependencies
    
    * Refactor LogJobErrorHandlerTest
    
    * Refactor WechatJobErrorHandlerTest
    
    * Refactor DingtalkJobErrorHandlerTest
    
    * Refactor EmailJobErrorHandlerTest
    
    * Bump Java to 19 in maven.yml
---
 .github/workflows/maven.yml                        |  4 +-
 .../dingtalk/DingtalkJobErrorHandlerTest.java      | 78 +++++++++-------------
 .../src/test/resources/logback-test.xml            | 22 ++----
 .../handler/email/EmailJobErrorHandlerTest.java    | 61 ++++++++---------
 .../src/test/resources/logback-test.xml            | 22 ++----
 .../elasticjob-error-handler-general/pom.xml       |  6 ++
 .../handler/general/LogJobErrorHandlerTest.java    | 64 ++++++++----------
 .../src/test/resources/logback-test.xml            | 26 ++------
 .../handler/wechat/WechatJobErrorHandlerTest.java  | 73 +++++++++-----------
 .../src/test/resources/logback-test.xml            | 22 ++----
 pom.xml                                            | 10 +--
 11 files changed, 150 insertions(+), 238 deletions(-)

diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml
index 639a5f4f5..b37a9bc92 100644
--- a/.github/workflows/maven.yml
+++ b/.github/workflows/maven.yml
@@ -30,7 +30,7 @@ jobs:
   build:
     strategy:
       matrix:
-        java: [ 8, 11, 17 ]
+        java: [ 8, 17, 19 ]
         os: [ 'windows-latest', 'macos-latest', 'ubuntu-latest' ]
 
     runs-on: ${{ matrix.os }}
@@ -52,4 +52,4 @@ jobs:
       - name: Upload coverage to Codecov
         uses: codecov/codecov-action@v3
         with:
-          file: '**/target/site/jacoco/jacoco.xml'
\ No newline at end of file
+          file: '**/target/site/jacoco/jacoco.xml'
diff --git a/elasticjob-ecosystem/elasticjob-error-handler/elasticjob-error-handler-type/elasticjob-error-handler-dingtalk/src/test/java/org/apache/shardingsphere/elasticjob/error/handler/dingtalk/DingtalkJobErrorHandlerTest.java b/elasticjob-ecosystem/elasticjob-error-handler/elasticjob-error-handler-type/elasticjob-error-handler-dingtalk/src/test/java/org/apache/shardingsphere/elasticjob/error/handler/dingtalk/DingtalkJobErrorHandlerTest.java
index 1dfdff5b4..58f1685cf 100644
--- a/elasticjob-ecosystem/elasticjob-error-handler/elasticjob-error-handler-type/elasticjob-error-handler-dingtalk/src/test/java/org/apache/shardingsphere/elasticjob/error/handler/dingtalk/DingtalkJobErrorHandlerTest.java
+++ b/elasticjob-ecosystem/elasticjob-error-handler/elasticjob-error-handler-type/elasticjob-error-handler-dingtalk/src/test/java/org/apache/shardingsphere/elasticjob/error/handler/dingtalk/DingtalkJobErrorHandlerTest.java
@@ -17,7 +17,9 @@
 
 package org.apache.shardingsphere.elasticjob.error.handler.dingtalk;
 
-import lombok.SneakyThrows;
+import ch.qos.logback.classic.Level;
+import ch.qos.logback.classic.spi.LoggingEvent;
+import ch.qos.logback.core.read.ListAppender;
 import org.apache.shardingsphere.elasticjob.error.handler.JobErrorHandlerFactory;
 import org.apache.shardingsphere.elasticjob.error.handler.dingtalk.fixture.DingtalkInternalController;
 import org.apache.shardingsphere.elasticjob.infra.exception.JobConfigurationException;
@@ -25,22 +27,17 @@ import org.apache.shardingsphere.elasticjob.restful.NettyRestfulService;
 import org.apache.shardingsphere.elasticjob.restful.NettyRestfulServiceConfiguration;
 import org.apache.shardingsphere.elasticjob.restful.RestfulService;
 import org.junit.AfterClass;
+import org.junit.Before;
 import org.junit.BeforeClass;
 import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.junit.MockitoJUnitRunner;
-import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
-import java.lang.reflect.Field;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.lang.reflect.Modifier;
+import java.util.List;
 import java.util.Properties;
 
-import static org.mockito.Mockito.verify;
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
 
-@RunWith(MockitoJUnitRunner.class)
 public final class DingtalkJobErrorHandlerTest {
     
     private static final int PORT = 9875;
@@ -49,9 +46,9 @@ public final class DingtalkJobErrorHandlerTest {
     
     private static RestfulService restfulService;
     
-    @Mock
-    private Logger log;
+    private static List<LoggingEvent> appenderList;
     
+    @SuppressWarnings({"unchecked", "rawtypes"})
     @BeforeClass
     public static void init() {
         NettyRestfulServiceConfiguration config = new NettyRestfulServiceConfiguration(PORT);
@@ -59,6 +56,14 @@ public final class DingtalkJobErrorHandlerTest {
         config.addControllerInstances(new DingtalkInternalController());
         restfulService = new NettyRestfulService(config);
         restfulService.startup();
+        ch.qos.logback.classic.Logger log = (ch.qos.logback.classic.Logger) LoggerFactory.getLogger(DingtalkJobErrorHandler.class);
+        ListAppender<LoggingEvent> appender = (ListAppender) log.getAppender("DingtalkJobErrorHandlerTestAppender");
+        appenderList = appender.list;
+    }
+    
+    @Before
+    public void setUp() {
+        appenderList.clear();
     }
     
     @AfterClass
@@ -71,62 +76,57 @@ public final class DingtalkJobErrorHandlerTest {
     @Test
     public void assertHandleExceptionWithNotifySuccessful() {
         DingtalkJobErrorHandler actual = getDingtalkJobErrorHandler(createConfigurationProperties("http://localhost:9875/send?access_token=mocked_token"));
-        setStaticFieldValue(actual);
         Throwable cause = new RuntimeException("test");
         actual.handleException("test_job", cause);
-        verify(log).info("An exception has occurred in Job '{}', an dingtalk message been sent successful.", "test_job", cause);
+        assertThat(appenderList.size(), is(1));
+        assertThat(appenderList.get(0).getLevel(), is(Level.INFO));
+        assertThat(appenderList.get(0).getFormattedMessage(), is("An exception has occurred in Job 'test_job', an dingtalk message been sent successful."));
     }
     
     @Test
     public void assertHandleExceptionWithWrongToken() {
         DingtalkJobErrorHandler actual = getDingtalkJobErrorHandler(createConfigurationProperties("http://localhost:9875/send?access_token=wrong_token"));
-        setStaticFieldValue(actual);
         Throwable cause = new RuntimeException("test");
         actual.handleException("test_job", cause);
-        verify(log).error("An exception has occurred in Job '{}' but failed to send dingtalk because of: {}", "test_job", "token is not exist", cause);
+        assertThat(appenderList.size(), is(1));
+        assertThat(appenderList.get(0).getLevel(), is(Level.ERROR));
+        assertThat(appenderList.get(0).getFormattedMessage(), is("An exception has occurred in Job 'test_job' but failed to send dingtalk because of: token is not exist"));
     }
     
     @Test
     public void assertHandleExceptionWithUrlIsNotFound() {
         DingtalkJobErrorHandler actual = getDingtalkJobErrorHandler(createConfigurationProperties("http://localhost:9875/404"));
-        setStaticFieldValue(actual);
         Throwable cause = new RuntimeException("test");
         actual.handleException("test_job", cause);
-        verify(log).error("An exception has occurred in Job '{}' but failed to send dingtalk because of: unexpected http response status: {}", "test_job", 404, cause);
+        assertThat(appenderList.size(), is(1));
+        assertThat(appenderList.get(0).getLevel(), is(Level.ERROR));
+        assertThat(appenderList.get(0).getFormattedMessage(), is("An exception has occurred in Job 'test_job' but failed to send dingtalk because of: unexpected http response status: 404"));
     }
     
     @Test
     public void assertHandleExceptionWithWrongUrl() {
         DingtalkJobErrorHandler actual = getDingtalkJobErrorHandler(createNoSignJobConfigurationProperties("http://wrongUrl"));
-        setStaticFieldValue(actual);
         Throwable cause = new RuntimeException("test");
         actual.handleException("test_job", cause);
-        verify(log).error("An exception has occurred in Job '{}', but failed to send dingtalk because of", "test_job", cause);
+        assertThat(appenderList.size(), is(1));
+        assertThat(appenderList.get(0).getLevel(), is(Level.ERROR));
+        assertThat(appenderList.get(0).getFormattedMessage(), is("An exception has occurred in Job 'test_job', but failed to send dingtalk because of"));
     }
     
     @Test
     public void assertHandleExceptionWithNoSign() {
         DingtalkJobErrorHandler actual = getDingtalkJobErrorHandler(createNoSignJobConfigurationProperties("http://localhost:9875/send?access_token=mocked_token"));
-        setStaticFieldValue(actual);
         Throwable cause = new RuntimeException("test");
         actual.handleException("test_job", cause);
-        verify(log).info("An exception has occurred in Job '{}', an dingtalk message been sent successful.", "test_job", cause);
+        assertThat(appenderList.size(), is(1));
+        assertThat(appenderList.get(0).getLevel(), is(Level.INFO));
+        assertThat(appenderList.get(0).getFormattedMessage(), is("An exception has occurred in Job 'test_job', an dingtalk message been sent successful."));
     }
     
     private DingtalkJobErrorHandler getDingtalkJobErrorHandler(final Properties props) {
         return (DingtalkJobErrorHandler) JobErrorHandlerFactory.createHandler("DINGTALK", props).orElseThrow(() -> new JobConfigurationException("DINGTALK error handler not found."));
     }
     
-    @SneakyThrows
-    private void setStaticFieldValue(final DingtalkJobErrorHandler dingtalkJobErrorHandler) {
-        Field field = dingtalkJobErrorHandler.getClass().getDeclaredField("log");
-        field.setAccessible(true);
-        Field modifiers = getModifierField();
-        modifiers.setAccessible(true);
-        modifiers.setInt(field, field.getModifiers() & ~Modifier.FINAL);
-        field.set(dingtalkJobErrorHandler, log);
-    }
-    
     private Properties createConfigurationProperties(final String webhook) {
         Properties result = new Properties();
         result.setProperty(DingtalkPropertiesConstants.WEBHOOK, webhook);
@@ -145,16 +145,4 @@ public final class DingtalkJobErrorHandlerTest {
         result.setProperty(DingtalkPropertiesConstants.READ_TIMEOUT_MILLISECONDS, "6000");
         return result;
     }
-    
-    @SneakyThrows({NoSuchMethodException.class, IllegalAccessException.class, InvocationTargetException.class})
-    private static Field getModifierField() {
-        Method getDeclaredFields0 = Class.class.getDeclaredMethod("getDeclaredFields0", boolean.class);
-        getDeclaredFields0.setAccessible(true);
-        for (Field each : (Field[]) getDeclaredFields0.invoke(Field.class, false)) {
-            if ("modifiers".equals(each.getName())) {
-                return each;
-            }
-        }
-        throw new UnsupportedOperationException();
-    }
 }
diff --git a/elasticjob-ecosystem/elasticjob-error-handler/elasticjob-error-handler-type/elasticjob-error-handler-dingtalk/src/test/resources/logback-test.xml b/elasticjob-ecosystem/elasticjob-error-handler/elasticjob-error-handler-type/elasticjob-error-handler-dingtalk/src/test/resources/logback-test.xml
index 0af2535c6..a33f47dff 100644
--- a/elasticjob-ecosystem/elasticjob-error-handler/elasticjob-error-handler-type/elasticjob-error-handler-dingtalk/src/test/resources/logback-test.xml
+++ b/elasticjob-ecosystem/elasticjob-error-handler/elasticjob-error-handler-type/elasticjob-error-handler-dingtalk/src/test/resources/logback-test.xml
@@ -17,22 +17,8 @@
   -->
 
 <configuration>
-    <property name="log.context.name" value="elasticjob-lite-core-test" />
-    <property name="log.charset" value="UTF-8" />
-    <property name="log.pattern" value="[%-5level] %date --%thread-- [%logger] %msg %n" />
-    
-    <contextName>${log.context.name}</contextName>
-    
-    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
-        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
-            <level>ERROR</level>
-        </filter>
-        <encoder charset="${log.charset}">
-            <pattern>${log.pattern}</pattern>
-        </encoder>
-    </appender>
-    
-    <root>
-        <appender-ref ref="STDOUT" />
-    </root>
+    <appender name="DingtalkJobErrorHandlerTestAppender" class="ch.qos.logback.core.read.ListAppender" />
+    <logger name="org.apache.shardingsphere.elasticjob.error.handler.dingtalk.DingtalkJobErrorHandler" level="info" additivity="false">
+        <appender-ref ref="DingtalkJobErrorHandlerTestAppender" />
+    </logger>
 </configuration>
diff --git a/elasticjob-ecosystem/elasticjob-error-handler/elasticjob-error-handler-type/elasticjob-error-handler-email/src/test/java/org/apache/shardingsphere/elasticjob/error/handler/email/EmailJobErrorHandlerTest.java b/elasticjob-ecosystem/elasticjob-error-handler/elasticjob-error-handler-type/elasticjob-error-handler-email/src/test/java/org/apache/shardingsphere/elasticjob/error/handler/email/EmailJobErrorHandlerTest.java
index 448eede65..dd3375932 100644
--- a/elasticjob-ecosystem/elasticjob-error-handler/elasticjob-error-handler-type/elasticjob-error-handler-email/src/test/java/org/apache/shardingsphere/elasticjob/error/handler/email/EmailJobErrorHandlerTest.java
+++ b/elasticjob-ecosystem/elasticjob-error-handler/elasticjob-error-handler-type/elasticjob-error-handler-email/src/test/java/org/apache/shardingsphere/elasticjob/error/handler/email/EmailJobErrorHandlerTest.java
@@ -17,25 +17,30 @@
 
 package org.apache.shardingsphere.elasticjob.error.handler.email;
 
+import ch.qos.logback.classic.Level;
+import ch.qos.logback.classic.spi.LoggingEvent;
+import ch.qos.logback.core.read.ListAppender;
 import lombok.SneakyThrows;
 import org.apache.shardingsphere.elasticjob.error.handler.JobErrorHandlerFactory;
 import org.apache.shardingsphere.elasticjob.infra.exception.JobConfigurationException;
+import org.junit.Before;
+import org.junit.BeforeClass;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.junit.MockitoJUnitRunner;
-import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import javax.mail.Address;
 import javax.mail.Message;
 import javax.mail.Session;
 import javax.mail.Transport;
 import java.lang.reflect.Field;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.lang.reflect.Modifier;
+import java.util.List;
 import java.util.Properties;
 
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
@@ -43,8 +48,7 @@ import static org.mockito.Mockito.when;
 @RunWith(MockitoJUnitRunner.class)
 public final class EmailJobErrorHandlerTest {
     
-    @Mock
-    private Logger log;
+    private static List<LoggingEvent> appenderList;
     
     @Mock
     private Session session;
@@ -52,21 +56,34 @@ public final class EmailJobErrorHandlerTest {
     @Mock
     private Transport transport;
     
+    @SuppressWarnings({"unchecked", "rawtypes"})
+    @BeforeClass
+    public static void init() {
+        ch.qos.logback.classic.Logger log = (ch.qos.logback.classic.Logger) LoggerFactory.getLogger(EmailJobErrorHandler.class);
+        ListAppender<LoggingEvent> appender = (ListAppender) log.getAppender("EmailJobErrorHandlerTestAppender");
+        appenderList = appender.list;
+    }
+    
+    @Before
+    public void setUp() {
+        appenderList.clear();
+    }
+    
     @Test
     public void assertHandleExceptionWithMessagingException() {
         EmailJobErrorHandler emailJobErrorHandler = getEmailJobErrorHandler(createConfigurationProperties());
-        setStaticFieldValue(emailJobErrorHandler, "log", log);
         Throwable cause = new RuntimeException("test");
         String jobName = "test_job";
         emailJobErrorHandler.handleException(jobName, cause);
-        verify(log).error("An exception has occurred in Job '{}' but failed to send email because of", jobName, cause);
+        assertThat(appenderList.size(), is(1));
+        assertThat(appenderList.get(0).getLevel(), is(Level.ERROR));
+        assertThat(appenderList.get(0).getFormattedMessage(), is("An exception has occurred in Job 'test_job' but failed to send email because of"));
     }
     
     @Test
     @SneakyThrows
     public void assertHandleExceptionSucceedInSendingEmail() {
         EmailJobErrorHandler emailJobErrorHandler = getEmailJobErrorHandler(createConfigurationProperties());
-        setStaticFieldValue(emailJobErrorHandler, "log", log);
         setUpMockSession(session);
         setFieldValue(emailJobErrorHandler, "session", session);
         Throwable cause = new RuntimeException("test");
@@ -74,7 +91,9 @@ public final class EmailJobErrorHandlerTest {
         when(session.getTransport()).thenReturn(transport);
         emailJobErrorHandler.handleException(jobName, cause);
         verify(transport).sendMessage(any(Message.class), any(Address[].class));
-        verify(log).info("An exception has occurred in Job '{}', an email has been sent successfully.", jobName, cause);
+        assertThat(appenderList.size(), is(1));
+        assertThat(appenderList.get(0).getLevel(), is(Level.INFO));
+        assertThat(appenderList.get(0).getFormattedMessage(), is("An exception has occurred in Job 'test_job', an email has been sent successfully."));
     }
     
     private EmailJobErrorHandler getEmailJobErrorHandler(final Properties props) {
@@ -87,16 +106,6 @@ public final class EmailJobErrorHandlerTest {
         when(session.getProperties()).thenReturn(props);
     }
     
-    @SneakyThrows
-    private void setStaticFieldValue(final EmailJobErrorHandler wechatJobErrorHandler, final String name, final Object value) {
-        Field fieldLog = wechatJobErrorHandler.getClass().getDeclaredField(name);
-        fieldLog.setAccessible(true);
-        Field modifiers = getModifierField();
-        modifiers.setAccessible(true);
-        modifiers.setInt(fieldLog, fieldLog.getModifiers() & ~Modifier.FINAL);
-        fieldLog.set(wechatJobErrorHandler, value);
-    }
-    
     @SneakyThrows
     private void setFieldValue(final Object target, final String fieldName, final Object fieldValue) {
         Field field = target.getClass().getDeclaredField(fieldName);
@@ -118,16 +127,4 @@ public final class EmailJobErrorHandlerTest {
         result.setProperty(EmailPropertiesConstants.BCC, "bcc@xxx.xx");
         return result;
     }
-    
-    @SneakyThrows({NoSuchMethodException.class, IllegalAccessException.class, InvocationTargetException.class})
-    private static Field getModifierField() {
-        Method getDeclaredFields0 = Class.class.getDeclaredMethod("getDeclaredFields0", boolean.class);
-        getDeclaredFields0.setAccessible(true);
-        for (Field each : (Field[]) getDeclaredFields0.invoke(Field.class, false)) {
-            if ("modifiers".equals(each.getName())) {
-                return each;
-            }
-        }
-        throw new UnsupportedOperationException();
-    }
 }
diff --git a/elasticjob-ecosystem/elasticjob-error-handler/elasticjob-error-handler-type/elasticjob-error-handler-wechat/src/test/resources/logback-test.xml b/elasticjob-ecosystem/elasticjob-error-handler/elasticjob-error-handler-type/elasticjob-error-handler-email/src/test/resources/logback-test.xml
similarity index 57%
copy from elasticjob-ecosystem/elasticjob-error-handler/elasticjob-error-handler-type/elasticjob-error-handler-wechat/src/test/resources/logback-test.xml
copy to elasticjob-ecosystem/elasticjob-error-handler/elasticjob-error-handler-type/elasticjob-error-handler-email/src/test/resources/logback-test.xml
index 0af2535c6..dafd4e306 100644
--- a/elasticjob-ecosystem/elasticjob-error-handler/elasticjob-error-handler-type/elasticjob-error-handler-wechat/src/test/resources/logback-test.xml
+++ b/elasticjob-ecosystem/elasticjob-error-handler/elasticjob-error-handler-type/elasticjob-error-handler-email/src/test/resources/logback-test.xml
@@ -17,22 +17,8 @@
   -->
 
 <configuration>
-    <property name="log.context.name" value="elasticjob-lite-core-test" />
-    <property name="log.charset" value="UTF-8" />
-    <property name="log.pattern" value="[%-5level] %date --%thread-- [%logger] %msg %n" />
-    
-    <contextName>${log.context.name}</contextName>
-    
-    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
-        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
-            <level>ERROR</level>
-        </filter>
-        <encoder charset="${log.charset}">
-            <pattern>${log.pattern}</pattern>
-        </encoder>
-    </appender>
-    
-    <root>
-        <appender-ref ref="STDOUT" />
-    </root>
+    <appender name="EmailJobErrorHandlerTestAppender" class="ch.qos.logback.core.read.ListAppender" />
+    <logger name="org.apache.shardingsphere.elasticjob.error.handler.email.EmailJobErrorHandler" level="info" additivity="false">
+        <appender-ref ref="EmailJobErrorHandlerTestAppender" />
+    </logger>
 </configuration>
diff --git a/elasticjob-ecosystem/elasticjob-error-handler/elasticjob-error-handler-type/elasticjob-error-handler-general/pom.xml b/elasticjob-ecosystem/elasticjob-error-handler/elasticjob-error-handler-type/elasticjob-error-handler-general/pom.xml
index 0c633b4e9..83863d7d2 100644
--- a/elasticjob-ecosystem/elasticjob-error-handler/elasticjob-error-handler-type/elasticjob-error-handler-general/pom.xml
+++ b/elasticjob-ecosystem/elasticjob-error-handler/elasticjob-error-handler-type/elasticjob-error-handler-general/pom.xml
@@ -61,5 +61,11 @@
             <groupId>org.mockito</groupId>
             <artifactId>mockito-inline</artifactId>
         </dependency>
+    
+        <dependency>
+            <groupId>ch.qos.logback</groupId>
+            <artifactId>logback-classic</artifactId>
+            <scope>test</scope>
+        </dependency>
     </dependencies>
 </project>
diff --git a/elasticjob-ecosystem/elasticjob-error-handler/elasticjob-error-handler-type/elasticjob-error-handler-general/src/test/java/org/apache/shardingsphere/elasticjob/error/handler/general/LogJobErrorHandlerTest.java b/elasticjob-ecosystem/elasticjob-error-handler/elasticjob-error-handler-type/elasticjob-error-handler-general/src/test/java/org/apache/shardingsphere/elasticjob/error/handler/general/LogJobErrorHandlerTest.java
index c8339f860..4b2277de7 100644
--- a/elasticjob-ecosystem/elasticjob-error-handler/elasticjob-error-handler-type/elasticjob-error-handler-general/src/test/java/org/apache/shardingsphere/elasticjob/error/handler/general/LogJobErrorHandlerTest.java
+++ b/elasticjob-ecosystem/elasticjob-error-handler/elasticjob-error-handler-type/elasticjob-error-handler-general/src/test/java/org/apache/shardingsphere/elasticjob/error/handler/general/LogJobErrorHandlerTest.java
@@ -17,57 +17,47 @@
 
 package org.apache.shardingsphere.elasticjob.error.handler.general;
 
-import lombok.SneakyThrows;
+import ch.qos.logback.classic.Level;
+import ch.qos.logback.classic.spi.LoggingEvent;
+import ch.qos.logback.core.read.ListAppender;
 import org.apache.shardingsphere.elasticjob.error.handler.JobErrorHandlerFactory;
 import org.apache.shardingsphere.elasticjob.infra.exception.JobConfigurationException;
+import org.junit.Before;
+import org.junit.BeforeClass;
 import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.junit.MockitoJUnitRunner;
-import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
-import java.lang.reflect.Field;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.lang.reflect.Modifier;
+import java.util.List;
 import java.util.Properties;
 
-import static org.mockito.Mockito.verify;
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
 
-@RunWith(MockitoJUnitRunner.class)
 public final class LogJobErrorHandlerTest {
     
-    @Mock
-    private Logger log;
+    private static List<LoggingEvent> appenderList;
+    
+    @SuppressWarnings({"unchecked", "rawtypes"})
+    @BeforeClass
+    public static void setupLogger() {
+        ch.qos.logback.classic.Logger log = (ch.qos.logback.classic.Logger) LoggerFactory.getLogger(LogJobErrorHandler.class);
+        ListAppender<LoggingEvent> appender = (ListAppender) log.getAppender("LogJobErrorHandlerTestAppender");
+        appenderList = appender.list;
+    }
+    
+    @Before
+    public void setUp() {
+        appenderList.clear();
+    }
     
     @Test
     public void assertHandleException() {
         LogJobErrorHandler actual = (LogJobErrorHandler) JobErrorHandlerFactory.createHandler("LOG", new Properties()).orElseThrow(() -> new JobConfigurationException("LOG error handler not found."));
-        setStaticFieldValue(actual);
         Throwable cause = new RuntimeException("test");
         actual.handleException("test_job", cause);
-        verify(log).error("Job 'test_job' exception occur in job processing", cause);
-    }
-    
-    @SneakyThrows
-    private void setStaticFieldValue(final LogJobErrorHandler logJobErrorHandler) {
-        Field field = logJobErrorHandler.getClass().getDeclaredField("log");
-        field.setAccessible(true);
-        Field modifiers = getModifierField();
-        modifiers.setAccessible(true);
-        modifiers.setInt(field, field.getModifiers() & ~Modifier.FINAL);
-        field.set(logJobErrorHandler, log);
-    }
-    
-    @SneakyThrows({NoSuchMethodException.class, IllegalAccessException.class, InvocationTargetException.class})
-    private static Field getModifierField() {
-        Method getDeclaredFields0 = Class.class.getDeclaredMethod("getDeclaredFields0", boolean.class);
-        getDeclaredFields0.setAccessible(true);
-        for (Field each : (Field[]) getDeclaredFields0.invoke(Field.class, false)) {
-            if ("modifiers".equals(each.getName())) {
-                return each;
-            }
-        }
-        throw new UnsupportedOperationException();
+        assertThat(appenderList.size(), is(1));
+        assertThat(appenderList.get(0).getLevel(), is(Level.ERROR));
+        assertThat(appenderList.get(0).getFormattedMessage(), is("Job 'test_job' exception occur in job processing"));
+        actual.close();
     }
 }
diff --git a/elasticjob-ecosystem/elasticjob-error-handler/elasticjob-error-handler-type/elasticjob-error-handler-wechat/src/test/resources/logback-test.xml b/elasticjob-ecosystem/elasticjob-error-handler/elasticjob-error-handler-type/elasticjob-error-handler-general/src/test/resources/logback-test.xml
similarity index 53%
copy from elasticjob-ecosystem/elasticjob-error-handler/elasticjob-error-handler-type/elasticjob-error-handler-wechat/src/test/resources/logback-test.xml
copy to elasticjob-ecosystem/elasticjob-error-handler/elasticjob-error-handler-type/elasticjob-error-handler-general/src/test/resources/logback-test.xml
index 0af2535c6..a0c3fbb71 100644
--- a/elasticjob-ecosystem/elasticjob-error-handler/elasticjob-error-handler-type/elasticjob-error-handler-wechat/src/test/resources/logback-test.xml
+++ b/elasticjob-ecosystem/elasticjob-error-handler/elasticjob-error-handler-type/elasticjob-error-handler-general/src/test/resources/logback-test.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="UTF-8"?>
+<?xml version="1.0"?>
 <!--
   ~ Licensed to the Apache Software Foundation (ASF) under one or more
   ~ contributor license agreements.  See the NOTICE file distributed with
@@ -17,22 +17,8 @@
   -->
 
 <configuration>
-    <property name="log.context.name" value="elasticjob-lite-core-test" />
-    <property name="log.charset" value="UTF-8" />
-    <property name="log.pattern" value="[%-5level] %date --%thread-- [%logger] %msg %n" />
-    
-    <contextName>${log.context.name}</contextName>
-    
-    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
-        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
-            <level>ERROR</level>
-        </filter>
-        <encoder charset="${log.charset}">
-            <pattern>${log.pattern}</pattern>
-        </encoder>
-    </appender>
-    
-    <root>
-        <appender-ref ref="STDOUT" />
-    </root>
-</configuration>
+    <appender name="LogJobErrorHandlerTestAppender" class="ch.qos.logback.core.read.ListAppender" />
+    <logger name="org.apache.shardingsphere.elasticjob.error.handler.general.LogJobErrorHandler" level="error" additivity="false">
+        <appender-ref ref="LogJobErrorHandlerTestAppender" />
+    </logger>
+</configuration> 
diff --git a/elasticjob-ecosystem/elasticjob-error-handler/elasticjob-error-handler-type/elasticjob-error-handler-wechat/src/test/java/org/apache/shardingsphere/elasticjob/error/handler/wechat/WechatJobErrorHandlerTest.java b/elasticjob-ecosystem/elasticjob-error-handler/elasticjob-error-handler-type/elasticjob-error-handler-wechat/src/test/java/org/apache/shardingsphere/elasticjob/error/handler/wechat/WechatJobErrorHandlerTest.java
index 717030132..e30470c80 100644
--- a/elasticjob-ecosystem/elasticjob-error-handler/elasticjob-error-handler-type/elasticjob-error-handler-wechat/src/test/java/org/apache/shardingsphere/elasticjob/error/handler/wechat/WechatJobErrorHandlerTest.java
+++ b/elasticjob-ecosystem/elasticjob-error-handler/elasticjob-error-handler-type/elasticjob-error-handler-wechat/src/test/java/org/apache/shardingsphere/elasticjob/error/handler/wechat/WechatJobErrorHandlerTest.java
@@ -17,7 +17,9 @@
 
 package org.apache.shardingsphere.elasticjob.error.handler.wechat;
 
-import lombok.SneakyThrows;
+import ch.qos.logback.classic.Level;
+import ch.qos.logback.classic.spi.LoggingEvent;
+import ch.qos.logback.core.read.ListAppender;
 import org.apache.shardingsphere.elasticjob.error.handler.JobErrorHandlerFactory;
 import org.apache.shardingsphere.elasticjob.error.handler.wechat.fixture.WechatInternalController;
 import org.apache.shardingsphere.elasticjob.infra.exception.JobConfigurationException;
@@ -25,22 +27,17 @@ import org.apache.shardingsphere.elasticjob.restful.NettyRestfulService;
 import org.apache.shardingsphere.elasticjob.restful.NettyRestfulServiceConfiguration;
 import org.apache.shardingsphere.elasticjob.restful.RestfulService;
 import org.junit.AfterClass;
+import org.junit.Before;
 import org.junit.BeforeClass;
 import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.junit.MockitoJUnitRunner;
-import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
-import java.lang.reflect.Field;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.lang.reflect.Modifier;
+import java.util.List;
 import java.util.Properties;
 
-import static org.mockito.Mockito.verify;
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
 
-@RunWith(MockitoJUnitRunner.class)
 public final class WechatJobErrorHandlerTest {
     
     private static final int PORT = 9872;
@@ -49,9 +46,9 @@ public final class WechatJobErrorHandlerTest {
     
     private static RestfulService restfulService;
     
-    @Mock
-    private Logger log;
+    private static List<LoggingEvent> appenderList;
     
+    @SuppressWarnings({"unchecked", "rawtypes"})
     @BeforeClass
     public static void init() {
         NettyRestfulServiceConfiguration configuration = new NettyRestfulServiceConfiguration(PORT);
@@ -59,6 +56,14 @@ public final class WechatJobErrorHandlerTest {
         configuration.addControllerInstances(new WechatInternalController());
         restfulService = new NettyRestfulService(configuration);
         restfulService.startup();
+        ch.qos.logback.classic.Logger log = (ch.qos.logback.classic.Logger) LoggerFactory.getLogger(WechatJobErrorHandler.class);
+        ListAppender<LoggingEvent> appender = (ListAppender) log.getAppender("WechatJobErrorHandlerTestAppender");
+        appenderList = appender.list;
+    }
+    
+    @Before
+    public void setUp() {
+        appenderList.clear();
     }
     
     @AfterClass
@@ -71,53 +76,47 @@ public final class WechatJobErrorHandlerTest {
     @Test
     public void assertHandleExceptionWithNotifySuccessful() {
         WechatJobErrorHandler actual = getWechatJobErrorHandler(createConfigurationProperties("http://localhost:9872/send?key=mocked_key"));
-        setStaticFieldValue(actual);
         Throwable cause = new RuntimeException("test");
         actual.handleException("test_job", cause);
-        verify(log).info("An exception has occurred in Job '{}', an wechat message has been sent successful.", "test_job", cause);
+        assertThat(appenderList.size(), is(1));
+        assertThat(appenderList.get(0).getLevel(), is(Level.INFO));
+        assertThat(appenderList.get(0).getFormattedMessage(), is("An exception has occurred in Job 'test_job', an wechat message has been sent successful."));
     }
     
     @Test
     public void assertHandleExceptionWithWrongToken() {
         WechatJobErrorHandler actual = getWechatJobErrorHandler(createConfigurationProperties("http://localhost:9872/send?key=wrong_key"));
-        setStaticFieldValue(actual);
         Throwable cause = new RuntimeException("test");
         actual.handleException("test_job", cause);
-        verify(log).error("An exception has occurred in Job '{}' but failed to send wechat because of: {}", "test_job", "token is invalid", cause);
+        assertThat(appenderList.size(), is(1));
+        assertThat(appenderList.get(0).getLevel(), is(Level.ERROR));
+        assertThat(appenderList.get(0).getFormattedMessage(), is("An exception has occurred in Job 'test_job' but failed to send wechat because of: token is invalid"));
     }
     
     @Test
     public void assertHandleExceptionWithWrongUrl() {
         WechatJobErrorHandler actual = getWechatJobErrorHandler(createConfigurationProperties("http://wrongUrl"));
-        setStaticFieldValue(actual);
         Throwable cause = new RuntimeException("test");
         actual.handleException("test_job", cause);
-        verify(log).error("An exception has occurred in Job '{}' but failed to send wechat because of", "test_job", cause);
+        assertThat(appenderList.size(), is(1));
+        assertThat(appenderList.get(0).getLevel(), is(Level.ERROR));
+        assertThat(appenderList.get(0).getFormattedMessage(), is("An exception has occurred in Job 'test_job' but failed to send wechat because of"));
     }
     
     @Test
     public void assertHandleExceptionWithUrlIsNotFound() {
         WechatJobErrorHandler actual = getWechatJobErrorHandler(createConfigurationProperties("http://localhost:9872/404"));
-        setStaticFieldValue(actual);
         Throwable cause = new RuntimeException("test");
         actual.handleException("test_job", cause);
-        verify(log).error("An exception has occurred in Job '{}' but failed to send wechat because of: unexpected http response status: {}", "test_job", 404, cause);
+        assertThat(appenderList.size(), is(1));
+        assertThat(appenderList.get(0).getLevel(), is(Level.ERROR));
+        assertThat(appenderList.get(0).getFormattedMessage(), is("An exception has occurred in Job 'test_job' but failed to send wechat because of: unexpected http response status: 404"));
     }
     
     private WechatJobErrorHandler getWechatJobErrorHandler(final Properties props) {
         return (WechatJobErrorHandler) JobErrorHandlerFactory.createHandler("WECHAT", props).orElseThrow(() -> new JobConfigurationException("WECHAT error handler not found."));
     }
     
-    @SneakyThrows
-    private void setStaticFieldValue(final WechatJobErrorHandler wechatJobErrorHandler) {
-        Field field = wechatJobErrorHandler.getClass().getDeclaredField("log");
-        field.setAccessible(true);
-        Field modifiers = getModifierField();
-        modifiers.setAccessible(true);
-        modifiers.setInt(field, field.getModifiers() & ~Modifier.FINAL);
-        field.set(wechatJobErrorHandler, log);
-    }
-    
     private Properties createConfigurationProperties(final String webhook) {
         Properties result = new Properties();
         result.setProperty(WechatPropertiesConstants.WEBHOOK, webhook);
@@ -125,16 +124,4 @@ public final class WechatJobErrorHandlerTest {
         result.setProperty(WechatPropertiesConstants.READ_TIMEOUT_MILLISECONDS, "2000");
         return result;
     }
-    
-    @SneakyThrows({NoSuchMethodException.class, IllegalAccessException.class, InvocationTargetException.class})
-    private static Field getModifierField() {
-        Method getDeclaredFields0 = Class.class.getDeclaredMethod("getDeclaredFields0", boolean.class);
-        getDeclaredFields0.setAccessible(true);
-        for (Field each : (Field[]) getDeclaredFields0.invoke(Field.class, false)) {
-            if ("modifiers".equals(each.getName())) {
-                return each;
-            }
-        }
-        throw new UnsupportedOperationException();
-    }
 }
diff --git a/elasticjob-ecosystem/elasticjob-error-handler/elasticjob-error-handler-type/elasticjob-error-handler-wechat/src/test/resources/logback-test.xml b/elasticjob-ecosystem/elasticjob-error-handler/elasticjob-error-handler-type/elasticjob-error-handler-wechat/src/test/resources/logback-test.xml
index 0af2535c6..624641fd5 100644
--- a/elasticjob-ecosystem/elasticjob-error-handler/elasticjob-error-handler-type/elasticjob-error-handler-wechat/src/test/resources/logback-test.xml
+++ b/elasticjob-ecosystem/elasticjob-error-handler/elasticjob-error-handler-type/elasticjob-error-handler-wechat/src/test/resources/logback-test.xml
@@ -17,22 +17,8 @@
   -->
 
 <configuration>
-    <property name="log.context.name" value="elasticjob-lite-core-test" />
-    <property name="log.charset" value="UTF-8" />
-    <property name="log.pattern" value="[%-5level] %date --%thread-- [%logger] %msg %n" />
-    
-    <contextName>${log.context.name}</contextName>
-    
-    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
-        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
-            <level>ERROR</level>
-        </filter>
-        <encoder charset="${log.charset}">
-            <pattern>${log.pattern}</pattern>
-        </encoder>
-    </appender>
-    
-    <root>
-        <appender-ref ref="STDOUT" />
-    </root>
+    <appender name="WechatJobErrorHandlerTestAppender" class="ch.qos.logback.core.read.ListAppender" />
+    <logger name="org.apache.shardingsphere.elasticjob.error.handler.wechat.WechatJobErrorHandler" level="info" additivity="false">
+        <appender-ref ref="WechatJobErrorHandlerTestAppender" />
+    </logger>
 </configuration>
diff --git a/pom.xml b/pom.xml
index cc1f6d7c8..c597462b5 100644
--- a/pom.xml
+++ b/pom.xml
@@ -73,21 +73,21 @@
         <h2.version>1.4.184</h2.version>
         <junit.version>4.12</junit.version>
         <hamcrest.version>2.2</hamcrest.version>
-        <mockito.version>3.11.2</mockito.version>
+        <mockito.version>4.8.0</mockito.version>
         
-        <apache-rat-plugin.version>0.12</apache-rat-plugin.version>
+        <apache-rat-plugin.version>0.15</apache-rat-plugin.version>
         <maven-compiler-plugin.version>3.8.0</maven-compiler-plugin.version>
         <maven-resources-plugin.version>2.7</maven-resources-plugin.version>
-        <maven-jar-plugin.version>2.6</maven-jar-plugin.version>
+        <maven-jar-plugin.version>3.3.0</maven-jar-plugin.version>
         <maven-surefire-plugin.version>2.19.1</maven-surefire-plugin.version>
         <maven-surefire-report-plugin.version>2.18.1</maven-surefire-report-plugin.version>
         <maven-site-plugin.version>3.4</maven-site-plugin.version>
         <lifecycle-mapping.version>1.0.0</lifecycle-mapping.version>
         <maven-plugin-plugin.version>3.4</maven-plugin-plugin.version>
-        <maven-enforcer-plugin.version>1.4</maven-enforcer-plugin.version>
+        <maven-enforcer-plugin.version>3.1.0</maven-enforcer-plugin.version>
         <maven-project-info-reports-plugin.version>2.8</maven-project-info-reports-plugin.version>
         <maven-javadoc-plugin.version>3.3.0</maven-javadoc-plugin.version>
-        <maven-source-plugin.version>2.4</maven-source-plugin.version>
+        <maven-source-plugin.version>3.2.1</maven-source-plugin.version>
         <maven-jxr-plugin.version>2.5</maven-jxr-plugin.version>
         <coveralls-maven-plugin.version>4.3.0</coveralls-maven-plugin.version>
         <cobertura-maven-plugin.version>2.7</cobertura-maven-plugin.version>