You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by ma...@apache.org on 2020/08/29 23:50:01 UTC

[logging-log4j2] branch release-2.x updated (103f126 -> 501c87f)

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

mattsicker pushed a change to branch release-2.x
in repository https://gitbox.apache.org/repos/asf/logging-log4j2.git.


    from 103f126  [LOG4J2-2653] Migrate layout tests to JUnit 5
     new 6eadedf  [LOG4J2-2653] Migrate filter and impl tests to JUnit 5
     new 501c87f  Simplify concurrent test and improve Windows resiliency

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../log4j/core/filter/AbstractFilterTest.java      |   4 +-
 .../log4j/core/filter/AbstractFilterableTest.java  |  14 +-
 .../core/filter/AbstractScriptFilterTest.java      |  38 ++--
 .../log4j/core/filter/BurstFilterLogDelayTest.java |   8 +-
 .../logging/log4j/core/filter/BurstFilterTest.java |  56 +++---
 .../core/filter/DynamicThresholdFilterTest.java    |  62 ++-----
 .../log4j/core/filter/LevelRangeFilterTest.java    |   7 +-
 .../logging/log4j/core/filter/MapFilterTest.java   |  47 +++--
 .../log4j/core/filter/MarkerFilterTest.java        |   7 +-
 .../log4j/core/filter/NoMarkerFilterTest.java      |   5 +-
 .../logging/log4j/core/filter/RegexFilterTest.java |  19 +-
 .../filter/ScriptFileFilterPropertiesTest.java     |  21 +--
 .../log4j/core/filter/ScriptFileFilterTest.java    |  21 +--
 .../log4j/core/filter/ScriptFilterTest.java        |  21 +--
 .../log4j/core/filter/ScriptRefFilterTest.java     |  21 +--
 .../core/filter/StructuredDataFilterTest.java      |  43 ++---
 .../core/filter/ThreadContextMapFilterTest.java    |  11 +-
 .../log4j/core/filter/ThresholdFilterTest.java     |   7 +-
 .../logging/log4j/core/filter/TimeFilterTest.java  |  81 ++++----
 ...taFactoryPropertySetMissingConstructorTest.java |   4 +-
 .../impl/ContextDataFactoryPropertySetTest.java    |   4 +-
 .../log4j/core/impl/ContextDataFactoryTest.java    |   4 +-
 .../core/impl/JdkMapAdapterStringMapTest.java      | 203 ++++++++-------------
 .../log4j/core/impl/Log4jLogEventNanoTimeTest.java |  28 +--
 .../logging/log4j/core/impl/Log4jLogEventTest.java | 117 ++++++------
 .../log4j/core/impl/MutableLogEventTest.java       | 203 ++++++++++-----------
 .../core/impl/ReusableLogEventFactoryTest.java     |  42 ++---
 .../core/impl/ThrowableFormatOptionsTest.java      |  90 ++++-----
 .../log4j/core/impl/ThrowableProxyTest.java        |  56 +++---
 .../ConcurrentLoggingWithGelfLayoutTest.java       |  80 ++++----
 30 files changed, 568 insertions(+), 756 deletions(-)


[logging-log4j2] 02/02: Simplify concurrent test and improve Windows resiliency

Posted by ma...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

mattsicker pushed a commit to branch release-2.x
in repository https://gitbox.apache.org/repos/asf/logging-log4j2.git

commit 501c87f0ad0d6982b944fa668a8d34c1dd8e0315
Author: Matt Sicker <bo...@gmail.com>
AuthorDate: Sat Aug 29 18:13:28 2020 -0500

    Simplify concurrent test and improve Windows resiliency
    
    Signed-off-by: Matt Sicker <bo...@gmail.com>
---
 .../ConcurrentLoggingWithGelfLayoutTest.java       | 80 +++++++++-------------
 1 file changed, 32 insertions(+), 48 deletions(-)

diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/layout/ConcurrentLoggingWithGelfLayoutTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/layout/ConcurrentLoggingWithGelfLayoutTest.java
index 7f16909..9bef502 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/layout/ConcurrentLoggingWithGelfLayoutTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/layout/ConcurrentLoggingWithGelfLayoutTest.java
@@ -16,6 +16,13 @@
  */
 package org.apache.logging.log4j.core.layout;
 
+import org.apache.logging.log4j.Logger;
+import org.apache.logging.log4j.core.LoggerContext;
+import org.apache.logging.log4j.junit.LoggerContextSource;
+import org.junit.jupiter.api.AfterAll;
+import org.junit.jupiter.api.Tag;
+import org.junit.jupiter.api.Test;
+
 import java.io.IOException;
 import java.nio.charset.Charset;
 import java.nio.file.Files;
@@ -23,20 +30,12 @@ import java.nio.file.Path;
 import java.nio.file.Paths;
 import java.util.ArrayList;
 import java.util.Collections;
-import java.util.HashSet;
 import java.util.List;
-import java.util.Set;
+import java.util.concurrent.CountDownLatch;
+import java.util.stream.Stream;
 
-import org.apache.logging.log4j.Logger;
-import org.apache.logging.log4j.core.LoggerContext;
-import org.apache.logging.log4j.junit.LoggerContextSource;
-import org.junit.jupiter.api.AfterAll;
-import org.junit.jupiter.api.Tag;
-import org.junit.jupiter.api.Test;
-
-import static org.hamcrest.CoreMatchers.endsWith;
-import static org.hamcrest.CoreMatchers.startsWith;
-import static org.hamcrest.MatcherAssert.*;
+import static org.hamcrest.CoreMatchers.*;
+import static org.hamcrest.MatcherAssert.assertThat;
 
 /**
  * Test for LOG4J2-1769, kind of.
@@ -44,24 +43,35 @@ import static org.hamcrest.MatcherAssert.*;
  * @since 2.8
  */
 @Tag("concurrency")
-@LoggerContextSource("log4j2-gelf-layout.xml")
 public class ConcurrentLoggingWithGelfLayoutTest {
     private static final Path PATH = Paths.get("target", "test-gelf-layout.log");
 
     @AfterAll
     static void after() throws IOException {
+        // on Windows, this will need to happen after the LoggerContext is stopped
         Files.deleteIfExists(PATH);
     }
 
     @Test
+    @LoggerContextSource("log4j2-gelf-layout.xml")
     public void testConcurrentLogging(final LoggerContext context) throws Throwable {
-        final Logger log = context.getLogger(ConcurrentLoggingWithGelfLayoutTest.class.getName());
-        final Set<Thread> threads = Collections.synchronizedSet(new HashSet<>());
+        final Logger log = context.getLogger(ConcurrentLoggingWithGelfLayoutTest.class);
+        final int threadCount = Runtime.getRuntime().availableProcessors() * 2;
+        final CountDownLatch latch = new CountDownLatch(threadCount);
         final List<Throwable> thrown = Collections.synchronizedList(new ArrayList<>());
 
-        for (int x = 0; x < Runtime.getRuntime().availableProcessors() * 2; x++) {
-            final Thread t = new LoggingThread(threads, log);
-            threads.add(t);
+        for (int x = 0; x < threadCount; x++) {
+            final Thread t = new Thread(() -> {
+                log.info(latch.getCount());
+                try {
+                    for (int i = 0; i < 64; i++) {
+                        log.info("First message.");
+                        log.info("Second message.");
+                    }
+                } finally {
+                    latch.countDown();
+                }
+            });
 
             // Appender is configured with ignoreExceptions="false";
             // any exceptions are propagated to the caller, so we can catch them here.
@@ -69,10 +79,7 @@ public class ConcurrentLoggingWithGelfLayoutTest {
             t.start();
         }
 
-        while (!threads.isEmpty()) {
-            log.info("not done going to sleep...");
-            Thread.sleep(10);
-        }
+        latch.await();
 
         // if any error occurred, fail this test
         if (!thrown.isEmpty()) {
@@ -81,34 +88,11 @@ public class ConcurrentLoggingWithGelfLayoutTest {
 
         // simple test to ensure content is not corrupted
         if (Files.exists(PATH)) {
-            final List<String> lines = Files.readAllLines(PATH, Charset.defaultCharset());
-            for (final String line : lines) {
-                assertThat(line, startsWith("{\"version\":\"1.1\",\"host\":\"myself\",\"timestamp\":"));
-                assertThat(line, endsWith("\"}"));
+            try (Stream<String> lines = Files.lines(PATH, Charset.defaultCharset())) {
+                lines.forEach(line -> assertThat(line,
+                        both(startsWith("{\"version\":\"1.1\",\"host\":\"myself\",\"timestamp\":")).and(endsWith("\"}"))));
             }
         }
     }
 
-    private static class LoggingThread extends Thread {
-        private final Set<Thread> threads;
-        private final Logger log;
-
-        LoggingThread(final Set<Thread> threads, final Logger log) {
-            this.threads = threads;
-            this.log = log;
-        }
-
-        @Override
-        public void run() {
-            log.info(threads.size());
-            try {
-                for (int i = 0; i < 64; i++) {
-                    log.info("First message.");
-                    log.info("Second message.");
-                }
-            } finally {
-                threads.remove(this);
-            }
-        }
-    }
 }


[logging-log4j2] 01/02: [LOG4J2-2653] Migrate filter and impl tests to JUnit 5

Posted by ma...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

mattsicker pushed a commit to branch release-2.x
in repository https://gitbox.apache.org/repos/asf/logging-log4j2.git

commit 6eadedf423c64a375f84a896d321a1495e246647
Author: Matt Sicker <bo...@gmail.com>
AuthorDate: Sat Aug 29 17:58:58 2020 -0500

    [LOG4J2-2653] Migrate filter and impl tests to JUnit 5
    
    Backported from 3.x.
    
    Signed-off-by: Matt Sicker <bo...@gmail.com>
---
 .../log4j/core/filter/AbstractFilterTest.java      |   4 +-
 .../log4j/core/filter/AbstractFilterableTest.java  |  14 +-
 .../core/filter/AbstractScriptFilterTest.java      |  38 ++--
 .../log4j/core/filter/BurstFilterLogDelayTest.java |   8 +-
 .../logging/log4j/core/filter/BurstFilterTest.java |  56 +++---
 .../core/filter/DynamicThresholdFilterTest.java    |  62 ++-----
 .../log4j/core/filter/LevelRangeFilterTest.java    |   7 +-
 .../logging/log4j/core/filter/MapFilterTest.java   |  47 +++--
 .../log4j/core/filter/MarkerFilterTest.java        |   7 +-
 .../log4j/core/filter/NoMarkerFilterTest.java      |   5 +-
 .../logging/log4j/core/filter/RegexFilterTest.java |  19 +-
 .../filter/ScriptFileFilterPropertiesTest.java     |  21 +--
 .../log4j/core/filter/ScriptFileFilterTest.java    |  21 +--
 .../log4j/core/filter/ScriptFilterTest.java        |  21 +--
 .../log4j/core/filter/ScriptRefFilterTest.java     |  21 +--
 .../core/filter/StructuredDataFilterTest.java      |  43 ++---
 .../core/filter/ThreadContextMapFilterTest.java    |  11 +-
 .../log4j/core/filter/ThresholdFilterTest.java     |   7 +-
 .../logging/log4j/core/filter/TimeFilterTest.java  |  81 ++++----
 ...taFactoryPropertySetMissingConstructorTest.java |   4 +-
 .../impl/ContextDataFactoryPropertySetTest.java    |   4 +-
 .../log4j/core/impl/ContextDataFactoryTest.java    |   4 +-
 .../core/impl/JdkMapAdapterStringMapTest.java      | 203 ++++++++-------------
 .../log4j/core/impl/Log4jLogEventNanoTimeTest.java |  28 +--
 .../logging/log4j/core/impl/Log4jLogEventTest.java | 117 ++++++------
 .../log4j/core/impl/MutableLogEventTest.java       | 203 ++++++++++-----------
 .../core/impl/ReusableLogEventFactoryTest.java     |  42 ++---
 .../core/impl/ThrowableFormatOptionsTest.java      |  90 ++++-----
 .../log4j/core/impl/ThrowableProxyTest.java        |  56 +++---
 29 files changed, 536 insertions(+), 708 deletions(-)

diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/filter/AbstractFilterTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/filter/AbstractFilterTest.java
index 077e2b1..b3688b4 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/filter/AbstractFilterTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/filter/AbstractFilterTest.java
@@ -22,9 +22,9 @@ import org.apache.logging.log4j.core.Filter;
 import org.apache.logging.log4j.core.LogEvent;
 import org.apache.logging.log4j.core.Logger;
 import org.apache.logging.log4j.message.Message;
-import org.junit.Test;
+import org.junit.jupiter.api.Test;
 
-import static org.junit.Assert.*;
+import static org.junit.jupiter.api.Assertions.*;
 
 /**
  * Tests the AbstractFilter test.
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/filter/AbstractFilterableTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/filter/AbstractFilterableTest.java
index 4e0830d..21df91a 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/filter/AbstractFilterableTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/filter/AbstractFilterableTest.java
@@ -17,18 +17,18 @@
  */
 package org.apache.logging.log4j.core.filter;
 
-import static org.junit.Assert.*;
-
 import org.apache.logging.log4j.Level;
 import org.apache.logging.log4j.core.Filter;
-import org.junit.Before;
-import org.junit.Test;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.*;
 
 public class AbstractFilterableTest {
 
     MockedAbstractFilterable filterable;
 
-    @Before
+    @BeforeEach
     public void setup() {
         filterable = new MockedAbstractFilterable();
     }
@@ -253,9 +253,9 @@ public class AbstractFilterableTest {
         assertSame(anotherFilter, filterable.getFilter());
     }
 
-    private class MockedAbstractFilterable extends AbstractFilterable {}
+    private static class MockedAbstractFilterable extends AbstractFilterable {}
 
-    private class EqualFilter extends AbstractFilter {
+    private static class EqualFilter extends AbstractFilter {
         private final String key;
         public EqualFilter(final String key) {
             this.key = key;
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/filter/AbstractScriptFilterTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/filter/AbstractScriptFilterTest.java
index 53f9cd7..6f2dc63 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/filter/AbstractScriptFilterTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/filter/AbstractScriptFilterTest.java
@@ -16,56 +16,52 @@
  */
 package org.apache.logging.log4j.core.filter;
 
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-
 import java.util.List;
 
-import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
 import org.apache.logging.log4j.ThreadContext;
-import org.apache.logging.log4j.junit.LoggerContextRule;
+import org.apache.logging.log4j.core.LoggerContext;
+import org.apache.logging.log4j.junit.Named;
+import org.apache.logging.log4j.junit.UsingThreadContextMap;
 import org.apache.logging.log4j.test.appender.ListAppender;
-import org.junit.Test;
+import org.junit.jupiter.api.Tag;
+import org.junit.jupiter.api.Test;
 
-/**
- *
- */
-public abstract class AbstractScriptFilterTest {
+import static org.junit.jupiter.api.Assertions.*;
 
-    public abstract LoggerContextRule getContext();
+@UsingThreadContextMap
+@Tag("groovy")
+public abstract class AbstractScriptFilterTest {
 
     @Test
-    public void testGroovyFilter() throws Exception {
-        final Logger logger = LogManager.getLogger("TestGroovyFilter");
+    public void testGroovyFilter(final LoggerContext context, @Named("List") final ListAppender app) throws Exception {
+        final Logger logger = context.getLogger("TestGroovyFilter");
         logger.traceEntry();
         logger.info("This should not be logged");
         ThreadContext.put("UserId", "JohnDoe");
         logger.info("This should be logged");
         ThreadContext.clearMap();
-        final ListAppender app = getContext().getListAppender("List");
         try {
             final List<String> messages = app.getMessages();
-            assertNotNull("No Messages", messages);
-            assertTrue("Incorrect number of messages. Expected 2, Actual " + messages.size(), messages.size() == 2);
+            assertNotNull(messages, "No Messages");
+            assertEquals(messages.size(), 2, "Incorrect number of messages. Expected 2, Actual " + messages.size());
         } finally {
             app.clear();
         }
     }
 
     @Test
-    public void testJavascriptFilter() throws Exception {
-        final Logger logger = LogManager.getLogger("TestJavaScriptFilter");
+    public void testJavascriptFilter(final LoggerContext context, @Named("List") final ListAppender app) throws Exception {
+        final Logger logger = context.getLogger("TestJavaScriptFilter");
         logger.traceEntry();
         logger.info("This should not be logged");
         ThreadContext.put("UserId", "JohnDoe");
         logger.info("This should be logged");
         ThreadContext.clearMap();
-        final ListAppender app = getContext().getListAppender("List");
         final List<String> messages = app.getMessages();
         try {
-            assertNotNull("No Messages", messages);
-            assertTrue("Incorrect number of messages. Expected 2, Actual " + messages.size(), messages.size() == 2);
+            assertNotNull(messages, "No Messages");
+            assertEquals(messages.size(), 2, "Incorrect number of messages. Expected 2, Actual " + messages.size());
         } finally {
             app.clear();
         }
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/filter/BurstFilterLogDelayTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/filter/BurstFilterLogDelayTest.java
index 3d8af9d..9913381 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/filter/BurstFilterLogDelayTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/filter/BurstFilterLogDelayTest.java
@@ -17,14 +17,14 @@
  */
 package org.apache.logging.log4j.core.filter;
 
-import static org.hamcrest.Matchers.greaterThan;
-import static org.hamcrest.Matchers.is;
-import static org.junit.Assert.assertThat;
+import org.junit.jupiter.api.Test;
 
 import java.util.concurrent.Delayed;
 import java.util.concurrent.TimeUnit;
 
-import org.junit.Test;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.greaterThan;
+import static org.hamcrest.Matchers.is;
 
 /**
  * Unit test for <code>BurstFilter</code>.
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/filter/BurstFilterTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/filter/BurstFilterTest.java
index 31aea6d..16484f4 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/filter/BurstFilterTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/filter/BurstFilterTest.java
@@ -20,35 +20,31 @@ package org.apache.logging.log4j.core.filter;
 import java.util.List;
 
 import org.apache.logging.log4j.Logger;
-import org.apache.logging.log4j.junit.LoggerContextRule;
+import org.apache.logging.log4j.core.LoggerContext;
+import org.apache.logging.log4j.junit.LoggerContextSource;
+import org.apache.logging.log4j.junit.Named;
 import org.apache.logging.log4j.test.appender.ListAppender;
-import org.junit.Before;
-import org.junit.ClassRule;
-import org.junit.Test;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.*;
 
-import static org.junit.Assert.*;
 /**
  * Unit test for <code>BurstFilter</code>.
  */
+@LoggerContextSource("log4j-burst.xml")
 public class BurstFilterTest {
 
-    private static final String CONFIG = "log4j-burst.xml";
-
-    @ClassRule
-    public static LoggerContextRule context = new LoggerContextRule(CONFIG);
+    private final ListAppender app;
+    private final BurstFilter filter;
+    private final Logger logger;
 
-    @Before
-    public void setUp() throws Exception {
-        app = context.getListAppender("ListAppender");
-        filter = (BurstFilter) app.getFilter();
-        assertNotNull("No BurstFilter", filter);
+    public BurstFilterTest(final LoggerContext context, @Named("ListAppender") final ListAppender app) {
+        this.app = app;
+        this.filter = (BurstFilter) app.getFilter();
+        assertNotNull(filter);
+        this.logger = context.getLogger(getClass());
     }
 
-    private ListAppender app;
-    private BurstFilter filter;
-
-    private final Logger logger = context.getLogger();
-
     /**
      * Test BurstFilter by surpassing maximum number of log messages allowed by filter and
      * making sure only the maximum number are indeed logged, then wait for while and make
@@ -62,13 +58,13 @@ public class BurstFilterTest {
                 Thread.sleep(200);
             }
             logger.info("Logging 110 messages, should only see 100 logs # " + (i + 1));
-            assertTrue("Incorrect number of available slots", filter.getAvailable() < 100);
+            assertTrue(filter.getAvailable() < 100, "Incorrect number of available slots");
         }
         List<String> msgs = app.getMessages();
-        assertEquals("Incorrect message count. Should be 100, actual " + msgs.size(), 100, msgs.size());
+        assertEquals(100, msgs.size(), "Incorrect message count. Should be 100, actual " + msgs.size());
         app.clear();
 
-        assertTrue("Incorrect number of available slots", filter.getAvailable() < 100);
+        assertTrue(filter.getAvailable() < 100, "Incorrect number of available slots");
         // Allow some of the events to clear
         Thread.sleep(1500);
 
@@ -77,8 +73,8 @@ public class BurstFilterTest {
         }
 
         msgs = app.getMessages();
-        assertFalse("No messages were counted.", msgs.isEmpty());
-        assertTrue("Incorrect message count. Should be > 0 and < 100, actual " + msgs.size(), msgs.size() < 100);
+        assertFalse(msgs.isEmpty(), "No messages were counted.");
+        assertTrue(msgs.size() < 100, "Incorrect message count. Should be > 0 and < 100, actual " + msgs.size());
         app.clear();
 
         filter.clear();
@@ -86,7 +82,7 @@ public class BurstFilterTest {
         for (int i = 0; i < 110; i++) {
             logger.info("Waited 1.5 seconds and trying to log again, should see more than 0 and less than 100" + (i + 1));
         }
-        assertEquals("", 0, filter.getAvailable());
+        assertEquals(0, filter.getAvailable(), "");
         app.clear();
 
 
@@ -97,7 +93,7 @@ public class BurstFilterTest {
         }
 
         msgs = app.getMessages();
-        assertTrue("Incorrect message count. Should be 0, actual " + msgs.size(), msgs.isEmpty());
+        assertTrue(msgs.isEmpty(), "Incorrect message count. Should be 0, actual " + msgs.size());
         app.clear();
 
         // now log 100 warns, they should all get through because the filter's level is set at info
@@ -106,7 +102,7 @@ public class BurstFilterTest {
         }
 
         msgs = app.getMessages();
-        assertEquals("Incorrect message count. Should be 110, actual " + msgs.size(), 110, msgs.size());
+        assertEquals(110, msgs.size(), "Incorrect message count. Should be 110, actual " + msgs.size());
         app.clear();
 
         // now log 100 errors, they should all get through because the filter level is set at info
@@ -115,7 +111,7 @@ public class BurstFilterTest {
         }
 
         msgs = app.getMessages();
-        assertEquals("Incorrect message count. Should be 110, actual " + msgs.size(), 110, msgs.size());
+        assertEquals(110, msgs.size(), "Incorrect message count. Should be 110, actual " + msgs.size());
         app.clear();
 
         // now log 100 fatals, they should all get through because the filter level is set at info
@@ -124,7 +120,7 @@ public class BurstFilterTest {
         }
 
         msgs = app.getMessages();
-        assertEquals("Incorrect message count. Should be 110, actual " + msgs.size(), 110, msgs.size());
+        assertEquals(110, msgs.size(), "Incorrect message count. Should be 110, actual " + msgs.size());
         app.clear();
 
         // wait and make sure we can log messages again despite the fact we just logged a bunch of warns, errors, fatals
@@ -134,7 +130,7 @@ public class BurstFilterTest {
             logger.debug("Waited 3+ seconds, should see 100 logs #" + (i + 1));
         }
         msgs = app.getMessages();
-        assertEquals("Incorrect message count. Should be 100, actual " + msgs.size(), 100, msgs.size());
+        assertEquals(100, msgs.size(), "Incorrect message count. Should be 100, actual " + msgs.size());
         app.clear();
 
     }
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/filter/DynamicThresholdFilterTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/filter/DynamicThresholdFilterTest.java
index fce48e5..87ba9dd 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/filter/DynamicThresholdFilterTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/filter/DynamicThresholdFilterTest.java
@@ -16,43 +16,24 @@
  */
 package org.apache.logging.log4j.core.filter;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertSame;
-import static org.junit.Assert.assertTrue;
-
-import java.util.Map;
-
 import org.apache.logging.log4j.Level;
 import org.apache.logging.log4j.ThreadContext;
 import org.apache.logging.log4j.core.Filter;
 import org.apache.logging.log4j.core.LogEvent;
-import org.apache.logging.log4j.core.LoggerContext;
 import org.apache.logging.log4j.core.config.Configuration;
-import org.apache.logging.log4j.core.config.Configurator;
 import org.apache.logging.log4j.core.impl.Log4jLogEvent;
 import org.apache.logging.log4j.core.util.KeyValuePair;
-import org.apache.logging.log4j.junit.ThreadContextMapRule;
+import org.apache.logging.log4j.junit.LoggerContextSource;
+import org.apache.logging.log4j.junit.UsingThreadContextMap;
 import org.apache.logging.log4j.message.SimpleMessage;
-import org.apache.logging.log4j.status.StatusLogger;
-import org.junit.After;
-import org.junit.Rule;
-import org.junit.Test;
+import org.junit.jupiter.api.Test;
 
-/**
- *
- */
-public class DynamicThresholdFilterTest {
+import java.util.Map;
 
-    @Rule
-    public final ThreadContextMapRule threadContextRule = new ThreadContextMapRule();
+import static org.junit.jupiter.api.Assertions.*;
 
-    @After
-    public void cleanup() {
-        final LoggerContext ctx = LoggerContext.getContext(false);
-        ctx.reconfigure();
-        StatusLogger.getLogger().reset();
-    }
+@UsingThreadContextMap
+public class DynamicThresholdFilterTest {
 
     @Test
     public void testFilter() {
@@ -92,22 +73,19 @@ public class DynamicThresholdFilterTest {
         assertSame(Filter.Result.ACCEPT, filter.filter(null, Level.DEBUG, null, "some test message", "one", "two", "three"));
         ThreadContext.clearMap();
     }
-
+    
     @Test
-    public void testConfig() {
-        try (final LoggerContext ctx = Configurator.initialize("Test1",
-                "target/test-classes/log4j2-dynamicfilter.xml")) {
-            final Configuration config = ctx.getConfiguration();
-            final Filter filter = config.getFilter();
-            assertNotNull("No DynamicThresholdFilter", filter);
-            assertTrue("Not a DynamicThresholdFilter", filter instanceof DynamicThresholdFilter);
-            final DynamicThresholdFilter dynamic = (DynamicThresholdFilter) filter;
-            final String key = dynamic.getKey();
-            assertNotNull("Key is null", key);
-            assertEquals("Incorrect key value", "loginId", key);
-            final Map<String, Level> map = dynamic.getLevelMap();
-            assertNotNull("Map is null", map);
-            assertEquals("Incorrect number of map elements", 1, map.size());
-        }
+    @LoggerContextSource("log4j2-dynamicfilter.xml")
+    public void testConfig(final Configuration config) {
+        final Filter filter = config.getFilter();
+        assertNotNull(filter, "No DynamicThresholdFilter");
+        assertTrue(filter instanceof DynamicThresholdFilter, "Not a DynamicThresholdFilter");
+        final DynamicThresholdFilter dynamic = (DynamicThresholdFilter) filter;
+        final String key = dynamic.getKey();
+        assertNotNull(key, "Key is null");
+        assertEquals("loginId", key, "Incorrect key value");
+        final Map<String, Level> map = dynamic.getLevelMap();
+        assertNotNull(map, "Map is null");
+        assertEquals(1, map.size(), "Incorrect number of map elements");
     }
 }
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/filter/LevelRangeFilterTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/filter/LevelRangeFilterTest.java
index 336d3ce..97d8140 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/filter/LevelRangeFilterTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/filter/LevelRangeFilterTest.java
@@ -21,13 +21,10 @@ import org.apache.logging.log4j.core.Filter;
 import org.apache.logging.log4j.core.LogEvent;
 import org.apache.logging.log4j.core.impl.Log4jLogEvent;
 import org.apache.logging.log4j.message.SimpleMessage;
-import org.junit.Test;
+import org.junit.jupiter.api.Test;
 
-import static org.junit.Assert.*;
+import static org.junit.jupiter.api.Assertions.*;
 
-/**
- *
- */
 public class LevelRangeFilterTest {
 
     @Test
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/filter/MapFilterTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/filter/MapFilterTest.java
index 7310d38..f44ac47 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/filter/MapFilterTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/filter/MapFilterTest.java
@@ -16,6 +16,7 @@
  */
 package org.apache.logging.log4j.core.filter;
 
+import java.util.Collection;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -26,27 +27,23 @@ import org.apache.logging.log4j.Logger;
 import org.apache.logging.log4j.core.Filter;
 import org.apache.logging.log4j.core.config.Configuration;
 import org.apache.logging.log4j.core.util.KeyValuePair;
-import org.apache.logging.log4j.junit.LoggerContextRule;
+import org.apache.logging.log4j.junit.LoggerContextSource;
+import org.apache.logging.log4j.junit.Named;
 import org.apache.logging.log4j.message.StringMapMessage;
 import org.apache.logging.log4j.test.appender.ListAppender;
-import org.junit.ClassRule;
-import org.junit.Test;
+import org.apache.logging.log4j.util.IndexedReadOnlyStringMap;
+import org.junit.jupiter.api.Test;
 
-import static org.junit.Assert.*;
+import static org.junit.jupiter.api.Assertions.*;
 
-/**
- *
- */
 public class MapFilterTest {
 
-    @ClassRule
-    public static LoggerContextRule context = new LoggerContextRule("log4j2-mapfilter.xml");
-
     @Test
     public void testFilter() {
         final KeyValuePair[] pairs = new KeyValuePair[] { new KeyValuePair("FromAccount", "211000"),
                                                     new KeyValuePair("ToAccount", "123456")};
         MapFilter filter = MapFilter.createFilter(pairs, "and", null, null);
+        assertNotNull(filter);
         filter.start();
         StringMapMessage msg = new StringMapMessage();
         msg.put("ToAccount", "123456");
@@ -57,6 +54,7 @@ public class MapFilterTest {
         msg.put("ToAccount", "111111");
         assertSame(Filter.Result.DENY, filter.filter(null, Level.ERROR, null, msg, null));
         filter = MapFilter.createFilter(pairs, "or", null, null);
+        assertNotNull(filter);
         filter.start();
         msg = new StringMapMessage();
         msg.put("ToAccount", "123456");
@@ -69,28 +67,25 @@ public class MapFilterTest {
     }
 
     @Test
-    public void testConfig() {
-        final Configuration config = context.getConfiguration();
+    @LoggerContextSource("log4j2-mapfilter.xml")
+    public void testConfig(final Configuration config, @Named("LIST") final ListAppender app) {
         final Filter filter = config.getFilter();
-        assertNotNull("No MapFilter", filter);
-        assertTrue("Not a MapFilter", filter instanceof  MapFilter);
+        assertNotNull(filter, "No MapFilter");
+        assertTrue(filter instanceof  MapFilter, "Not a MapFilter");
         final MapFilter mapFilter = (MapFilter) filter;
-        assertFalse("Should not be And filter", mapFilter.isAnd());
-        final Map<String, List<String>> map = mapFilter.getMap();
-        assertNotNull("No Map", map);
-        assertFalse("No elements in Map", map.isEmpty());
-        assertEquals("Incorrect number of elements in Map", 1, map.size());
-        assertTrue("Map does not contain key eventId", map.containsKey("eventId"));
-        assertEquals("List does not contain 2 elements", 2, map.get("eventId").size());
+        assertFalse(mapFilter.isAnd(), "Should not be And filter");
+        final IndexedReadOnlyStringMap map = mapFilter.getStringMap();
+        assertNotNull(map, "No Map");
+        assertFalse(map.isEmpty(), "No elements in Map");
+        assertEquals(1, map.size(), "Incorrect number of elements in Map");
+        assertTrue(map.containsKey("eventId"), "Map does not contain key eventId");
+        assertEquals(2, map.<Collection<?>>getValue("eventId").size(), "List does not contain 2 elements");
         final Logger logger = LogManager.getLogger(MapFilterTest.class);
         final Map<String, String> eventMap = new HashMap<>();
         eventMap.put("eventId", "Login");
         logger.debug(new StringMapMessage(eventMap));
-        final ListAppender app = context.getListAppender("LIST");
         final List<String> msgs = app.getMessages();
-        assertNotNull("No messages", msgs);
-        assertFalse("No messages", msgs.isEmpty());
-
-
+        assertNotNull(msgs, "No messages");
+        assertFalse(msgs.isEmpty(), "No messages");
     }
 }
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/filter/MarkerFilterTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/filter/MarkerFilterTest.java
index 1850e77..8ef4a46 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/filter/MarkerFilterTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/filter/MarkerFilterTest.java
@@ -23,13 +23,10 @@ import org.apache.logging.log4j.core.Filter;
 import org.apache.logging.log4j.core.LogEvent;
 import org.apache.logging.log4j.core.impl.Log4jLogEvent;
 import org.apache.logging.log4j.message.SimpleMessage;
-import org.junit.Test;
+import org.junit.jupiter.api.Test;
 
-import static org.junit.Assert.*;
+import static org.junit.jupiter.api.Assertions.*;
 
-/**
- *
- */
 public class MarkerFilterTest {
 
     @Test
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/filter/NoMarkerFilterTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/filter/NoMarkerFilterTest.java
index f833858..d98a5d4 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/filter/NoMarkerFilterTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/filter/NoMarkerFilterTest.java
@@ -23,10 +23,9 @@ import org.apache.logging.log4j.core.Filter;
 import org.apache.logging.log4j.core.LogEvent;
 import org.apache.logging.log4j.core.impl.Log4jLogEvent;
 import org.apache.logging.log4j.message.SimpleMessage;
-import org.junit.Test;
+import org.junit.jupiter.api.Test;
 
-import static org.junit.Assert.assertSame;
-import static org.junit.Assert.assertTrue;
+import static org.junit.jupiter.api.Assertions.*;
 
 public class NoMarkerFilterTest {
 
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/filter/RegexFilterTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/filter/RegexFilterTest.java
index c48edbe..19dbed9 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/filter/RegexFilterTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/filter/RegexFilterTest.java
@@ -16,12 +16,6 @@
  */
 package org.apache.logging.log4j.core.filter;
 
-import static org.hamcrest.CoreMatchers.equalTo;
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertSame;
-import static org.junit.Assert.assertTrue;
-
 import org.apache.logging.log4j.Level;
 import org.apache.logging.log4j.core.Filter;
 import org.apache.logging.log4j.core.Filter.Result;
@@ -30,14 +24,15 @@ import org.apache.logging.log4j.core.impl.Log4jLogEvent;
 import org.apache.logging.log4j.message.Message;
 import org.apache.logging.log4j.message.SimpleMessage;
 import org.apache.logging.log4j.status.StatusLogger;
-import org.junit.BeforeClass;
-import org.junit.Test;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.Test;
+
+import static org.hamcrest.CoreMatchers.equalTo;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.junit.jupiter.api.Assertions.*;
 
-/**
- *
- */
 public class RegexFilterTest {
-    @BeforeClass
+    @BeforeAll
     public static void before() {
         StatusLogger.getLogger().setLevel(Level.OFF);
     }
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/filter/ScriptFileFilterPropertiesTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/filter/ScriptFileFilterPropertiesTest.java
index 7e0e582..4d7acc4 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/filter/ScriptFileFilterPropertiesTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/filter/ScriptFileFilterPropertiesTest.java
@@ -16,25 +16,8 @@
  */
 package org.apache.logging.log4j.core.filter;
 
-import org.apache.logging.log4j.categories.Scripts;
-import org.apache.logging.log4j.junit.LoggerContextRule;
-import org.junit.ClassRule;
-import org.junit.experimental.categories.Category;
+import org.apache.logging.log4j.junit.LoggerContextSource;
 
-/**
- *
- */
-@Category(Scripts.Groovy.class)
+@LoggerContextSource("log4j-scriptFile-filters.properties")
 public class ScriptFileFilterPropertiesTest extends AbstractScriptFilterTest {
-
-    private static final String CONFIG = "log4j-scriptFile-filters.properties";
-
-    @ClassRule
-    public static LoggerContextRule context = new LoggerContextRule(CONFIG);
-
-    @Override
-    public LoggerContextRule getContext() {
-        return context;
-    }
-
 }
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/filter/ScriptFileFilterTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/filter/ScriptFileFilterTest.java
index c0818dc..0cb652d 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/filter/ScriptFileFilterTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/filter/ScriptFileFilterTest.java
@@ -16,25 +16,8 @@
  */
 package org.apache.logging.log4j.core.filter;
 
-import org.apache.logging.log4j.categories.Scripts;
-import org.apache.logging.log4j.junit.LoggerContextRule;
-import org.junit.ClassRule;
-import org.junit.experimental.categories.Category;
+import org.apache.logging.log4j.junit.LoggerContextSource;
 
-/**
- *
- */
-@Category(Scripts.Groovy.class)
+@LoggerContextSource("log4j-scriptFile-filters.xml")
 public class ScriptFileFilterTest extends AbstractScriptFilterTest {
-
-    private static final String CONFIG = "log4j-scriptFile-filters.xml";
-
-    @ClassRule
-    public static LoggerContextRule context = new LoggerContextRule(CONFIG);
-
-    @Override
-    public LoggerContextRule getContext() {
-        return context;
-    }
-
 }
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/filter/ScriptFilterTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/filter/ScriptFilterTest.java
index 47f7594..ff0a51b 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/filter/ScriptFilterTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/filter/ScriptFilterTest.java
@@ -16,25 +16,8 @@
  */
 package org.apache.logging.log4j.core.filter;
 
-import org.apache.logging.log4j.categories.Scripts;
-import org.apache.logging.log4j.junit.LoggerContextRule;
-import org.junit.ClassRule;
-import org.junit.experimental.categories.Category;
+import org.apache.logging.log4j.junit.LoggerContextSource;
 
-/**
- *
- */
-@Category(Scripts.Groovy.class)
+@LoggerContextSource("log4j-script-filters.xml")
 public class ScriptFilterTest extends AbstractScriptFilterTest {
-
-    private static final String CONFIG = "log4j-script-filters.xml";
-
-    @ClassRule
-    public static LoggerContextRule context = new LoggerContextRule(CONFIG);
-
-    @Override
-    public LoggerContextRule getContext() {
-        return context;
-    }
-
 }
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/filter/ScriptRefFilterTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/filter/ScriptRefFilterTest.java
index d2e4960..9d6b863 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/filter/ScriptRefFilterTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/filter/ScriptRefFilterTest.java
@@ -16,25 +16,8 @@
  */
 package org.apache.logging.log4j.core.filter;
 
-import org.apache.logging.log4j.categories.Scripts;
-import org.apache.logging.log4j.junit.LoggerContextRule;
-import org.junit.ClassRule;
-import org.junit.experimental.categories.Category;
+import org.apache.logging.log4j.junit.LoggerContextSource;
 
-/**
- *
- */
-@Category(Scripts.Groovy.class)
+@LoggerContextSource("log4j-scriptRef-filters.xml")
 public class ScriptRefFilterTest extends AbstractScriptFilterTest {
-
-    private static final String CONFIG = "log4j-scriptRef-filters.xml";
-
-    @ClassRule
-    public static LoggerContextRule context = new LoggerContextRule(CONFIG);
-
-    @Override
-    public LoggerContextRule getContext() {
-        return context;
-    }
-
 }
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/filter/StructuredDataFilterTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/filter/StructuredDataFilterTest.java
index d313e7c..b1689dd 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/filter/StructuredDataFilterTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/filter/StructuredDataFilterTest.java
@@ -16,33 +16,27 @@
  */
 package org.apache.logging.log4j.core.filter;
 
+import java.util.Collection;
+
 import org.apache.logging.log4j.Level;
 import org.apache.logging.log4j.core.Filter;
 import org.apache.logging.log4j.core.config.Configuration;
 import org.apache.logging.log4j.core.util.KeyValuePair;
-import org.apache.logging.log4j.junit.LoggerContextRule;
+import org.apache.logging.log4j.junit.LoggerContextSource;
 import org.apache.logging.log4j.message.StructuredDataMessage;
-import org.junit.ClassRule;
-import org.junit.Test;
-
-import java.util.List;
-import java.util.Map;
+import org.apache.logging.log4j.util.IndexedReadOnlyStringMap;
+import org.junit.jupiter.api.Test;
 
-import static org.junit.Assert.*;
+import static org.junit.jupiter.api.Assertions.*;
 
-/**
- *
- */
 public class StructuredDataFilterTest {
 
-    @ClassRule
-    public static LoggerContextRule context = new LoggerContextRule("log4j2-sdfilter.xml");
-
     @Test
     public void testFilter() {
         final KeyValuePair[] pairs = new KeyValuePair[] { new KeyValuePair("id.name", "AccountTransfer"),
                                                     new KeyValuePair("ToAccount", "123456")};
         StructuredDataFilter filter = StructuredDataFilter.createFilter(pairs, "and", null, null);
+        assertNotNull(filter);
         filter.start();
         StructuredDataMessage msg = new StructuredDataMessage("AccountTransfer@18060", "Transfer Successful", "Audit");
         msg.put("ToAccount", "123456");
@@ -53,6 +47,7 @@ public class StructuredDataFilterTest {
         msg.put("ToAccount", "111111");
         assertSame(Filter.Result.DENY, filter.filter(null, Level.ERROR, null, msg, null));
         filter = StructuredDataFilter.createFilter(pairs, "or", null, null);
+        assertNotNull(filter);
         filter.start();
         msg = new StructuredDataMessage("AccountTransfer@18060", "Transfer Successful", "Audit");
         msg.put("ToAccount", "123456");
@@ -65,18 +60,18 @@ public class StructuredDataFilterTest {
     }
 
     @Test
-    public void testConfig() {
-        final Configuration config = context.getConfiguration();
+    @LoggerContextSource("log4j2-sdfilter.xml")
+    public void testConfig(final Configuration config) {
         final Filter filter = config.getFilter();
-        assertNotNull("No StructuredDataFilter", filter);
-        assertTrue("Not a StructuredDataFilter", filter instanceof  StructuredDataFilter);
+        assertNotNull(filter, "No StructuredDataFilter");
+        assertTrue(filter instanceof  StructuredDataFilter, "Not a StructuredDataFilter");
         final StructuredDataFilter sdFilter = (StructuredDataFilter) filter;
-        assertFalse("Should not be And filter", sdFilter.isAnd());
-        final Map<String, List<String>> map = sdFilter.getMap();
-        assertNotNull("No Map", map);
-        assertFalse("No elements in Map", map.isEmpty());
-        assertEquals("Incorrect number of elements in Map", 1, map.size());
-        assertTrue("Map does not contain key eventId", map.containsKey("eventId"));
-        assertEquals("List does not contain 2 elements", 2, map.get("eventId").size());
+        assertFalse(sdFilter.isAnd(), "Should not be And filter");
+        final IndexedReadOnlyStringMap map = sdFilter.getStringMap();
+        assertNotNull(map, "No Map");
+        assertFalse(map.isEmpty(), "No elements in Map");
+        assertEquals(1, map.size(), "Incorrect number of elements in Map");
+        assertTrue(map.containsKey("eventId"), "Map does not contain key eventId");
+        assertEquals(2, map.<Collection<?>>getValue("eventId").size(), "List does not contain 2 elements");
     }
 }
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/filter/ThreadContextMapFilterTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/filter/ThreadContextMapFilterTest.java
index 546ef30..2ef851c 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/filter/ThreadContextMapFilterTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/filter/ThreadContextMapFilterTest.java
@@ -20,14 +20,10 @@ import org.apache.logging.log4j.Level;
 import org.apache.logging.log4j.ThreadContext;
 import org.apache.logging.log4j.core.Filter;
 import org.apache.logging.log4j.core.util.KeyValuePair;
-import org.junit.Test;
+import org.junit.jupiter.api.Test;
 
-import static org.junit.Assert.*;
+import static org.junit.jupiter.api.Assertions.*;
 
-
-/**
- *
- */
 public class ThreadContextMapFilterTest {
 
     @Test
@@ -37,6 +33,7 @@ public class ThreadContextMapFilterTest {
         final KeyValuePair[] pairs = new KeyValuePair[] { new KeyValuePair("userid", "JohnDoe"),
                                                     new KeyValuePair("organization", "Apache")};
         ThreadContextMapFilter filter = ThreadContextMapFilter.createFilter(pairs, "and", null, null);
+        assertNotNull(filter);
         filter.start();
         assertTrue(filter.isStarted());
         assertSame(Filter.Result.DENY, filter.filter(null, Level.DEBUG, null, (Object) null, (Throwable) null));
@@ -48,6 +45,7 @@ public class ThreadContextMapFilterTest {
         assertSame(Filter.Result.DENY, filter.filter(null, Level.DEBUG, null, (Object) null, (Throwable) null));
         ThreadContext.clearMap();
         filter = ThreadContextMapFilter.createFilter(pairs, "or", null, null);
+        assertNotNull(filter);
         filter.start();
         assertTrue(filter.isStarted());
         ThreadContext.put("userid", "testuser");
@@ -59,6 +57,7 @@ public class ThreadContextMapFilterTest {
         assertSame(Filter.Result.DENY, filter.filter(null, Level.DEBUG, null, (Object) null, (Throwable) null));
         final KeyValuePair[] single = new KeyValuePair[] {new KeyValuePair("userid", "testuser")};
         filter = ThreadContextMapFilter.createFilter(single, null, null, null);
+        assertNotNull(filter);
         filter.start();
         assertTrue(filter.isStarted());
         assertSame(Filter.Result.NEUTRAL, filter.filter(null, Level.DEBUG, null, (Object) null, (Throwable) null));
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/filter/ThresholdFilterTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/filter/ThresholdFilterTest.java
index 5ae7d52..4fed511 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/filter/ThresholdFilterTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/filter/ThresholdFilterTest.java
@@ -21,13 +21,10 @@ import org.apache.logging.log4j.core.Filter;
 import org.apache.logging.log4j.core.LogEvent;
 import org.apache.logging.log4j.core.impl.Log4jLogEvent;
 import org.apache.logging.log4j.message.SimpleMessage;
-import org.junit.Test;
+import org.junit.jupiter.api.Test;
 
-import static org.junit.Assert.*;
+import static org.junit.jupiter.api.Assertions.*;
 
-/**
- *
- */
 public class ThresholdFilterTest {
 
     @Test
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/filter/TimeFilterTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/filter/TimeFilterTest.java
index f067092..7637daa 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/filter/TimeFilterTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/filter/TimeFilterTest.java
@@ -30,15 +30,12 @@ import org.apache.logging.log4j.core.impl.Log4jLogEvent;
 import org.apache.logging.log4j.core.util.Clock;
 import org.apache.logging.log4j.core.util.ClockFactory;
 import org.apache.logging.log4j.core.util.ClockFactoryTest;
-import org.junit.AfterClass;
-import org.junit.BeforeClass;
-import org.junit.Test;
+import org.junit.jupiter.api.AfterAll;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.Test;
 
-import static org.junit.Assert.*;
+import static org.junit.jupiter.api.Assertions.*;
 
-/**
- *
- */
 public class TimeFilterTest {
     private static long CLOCKTIME = System.currentTimeMillis();
 
@@ -50,12 +47,12 @@ public class TimeFilterTest {
         }
     }
 
-    @BeforeClass
+    @BeforeAll
     public static void beforeClass() {
         System.setProperty(ClockFactory.PROPERTY_NAME, FixedTimeClock.class.getName());
     }
 
-    @AfterClass
+    @AfterAll
     public static void afterClass() throws IllegalAccessException {
         ClockFactoryTest.resetClocks();
     }
@@ -69,15 +66,18 @@ public class TimeFilterTest {
         ZonedDateTime date = ZonedDateTime.of(2020, 3, 8, 2, 6, 30, 0, ZoneId.of("America/Los_Angeles"));
         CLOCKTIME = date.toInstant().toEpochMilli();
         LogEvent event = Log4jLogEvent.newBuilder().setTimeMillis(CLOCKTIME).build();
-        assertSame("Time " + CLOCKTIME + " is not within range: " + filter.toString(), Filter.Result.NEUTRAL, filter.filter(event));
+        assertSame(Filter.Result.NEUTRAL, filter.filter(event),
+                "Time " + CLOCKTIME + " is not within range: " + filter.toString());
         date = date.plusDays(1).withHour(2);
         CLOCKTIME = date.toInstant().toEpochMilli();
         event = Log4jLogEvent.newBuilder().setTimeMillis(CLOCKTIME).build();
-        assertSame("Time " + CLOCKTIME + " is not within range: " + filter.toString(), Filter.Result.NEUTRAL, filter.filter(event));
+        assertSame(Filter.Result.NEUTRAL, filter.filter(event),
+                "Time " + CLOCKTIME + " is not within range: " + filter.toString());
         date = date.withHour(4);
         CLOCKTIME = date.toInstant().toEpochMilli();
         event = Log4jLogEvent.newBuilder().setTimeMillis(CLOCKTIME).build();
-        assertSame("Time " + CLOCKTIME + " is within range: " + filter.toString(), Filter.Result.DENY, filter.filter(event));
+        assertSame(Filter.Result.DENY, filter.filter(event),
+                "Time " + CLOCKTIME + " is within range: " + filter.toString());
     }
 
 
@@ -90,19 +90,23 @@ public class TimeFilterTest {
         ZonedDateTime date = ZonedDateTime.of(2020, 11, 1, 1, 6, 30, 0, ZoneId.of("America/Los_Angeles")).withEarlierOffsetAtOverlap();
         CLOCKTIME = date.toInstant().toEpochMilli();
         LogEvent event = Log4jLogEvent.newBuilder().setTimeMillis(CLOCKTIME).build();
-        assertSame("Time " + CLOCKTIME + " is not within range: " + filter.toString(), Filter.Result.NEUTRAL, filter.filter(event));
+        assertSame(Filter.Result.NEUTRAL, filter.filter(event),
+                "Time " + CLOCKTIME + " is not within range: " + filter.toString());
         date = ZonedDateTime.of(2020, 11, 1, 1, 6, 30, 0, ZoneId.of("America/Los_Angeles")).withLaterOffsetAtOverlap();
         CLOCKTIME = date.toInstant().toEpochMilli();
         event = Log4jLogEvent.newBuilder().setTimeMillis(CLOCKTIME).build();
-        assertSame("Time " + CLOCKTIME + " is within range: " + filter.toString(), Filter.Result.DENY, filter.filter(event));
+        assertSame(Filter.Result.DENY, filter.filter(event),
+                "Time " + CLOCKTIME + " is within range: " + filter.toString());
         date = date.plusDays(1).withHour(1).withMinute(30);
         CLOCKTIME = date.toInstant().toEpochMilli();
         event = Log4jLogEvent.newBuilder().setTimeMillis(CLOCKTIME).build();
-        assertSame("Time " + CLOCKTIME + " is not within range: " + filter.toString(), Filter.Result.NEUTRAL, filter.filter(event));
+        assertSame(Filter.Result.NEUTRAL, filter.filter(event),
+                "Time " + CLOCKTIME + " is not within range: " + filter.toString());
         date = date.withHour(4);
         CLOCKTIME = date.toInstant().toEpochMilli();
         event = Log4jLogEvent.newBuilder().setTimeMillis(CLOCKTIME).build();
-        assertSame("Time " + CLOCKTIME + " is within range: " + filter.toString(), Filter.Result.DENY, filter.filter(event));
+        assertSame(Filter.Result.DENY, filter.filter(event),
+                "Time " + CLOCKTIME + " is within range: " + filter.toString());
     }
 
 
@@ -115,19 +119,23 @@ public class TimeFilterTest {
         ZonedDateTime date = ZonedDateTime.of(2020, 3, 10, 23, 30, 30, 0, ZoneId.of("America/Los_Angeles")).withEarlierOffsetAtOverlap();
         CLOCKTIME = date.toInstant().toEpochMilli();
         LogEvent event = Log4jLogEvent.newBuilder().setTimeMillis(CLOCKTIME).build();
-        assertSame("Time " + CLOCKTIME + " is not within range: " + filter.toString(), Filter.Result.NEUTRAL, filter.filter(event));
+        assertSame(Filter.Result.NEUTRAL, filter.filter(event),
+                "Time " + CLOCKTIME + " is not within range: " + filter.toString());
         date = date.plusHours(1);
         CLOCKTIME = date.toInstant().toEpochMilli();
         event = Log4jLogEvent.newBuilder().setTimeMillis(CLOCKTIME).build();
-        assertSame("Time " + CLOCKTIME + " is not within range: " + filter.toString(), Filter.Result.NEUTRAL, filter.filter(event));
+        assertSame(Filter.Result.NEUTRAL, filter.filter(event),
+                "Time " + CLOCKTIME + " is not within range: " + filter.toString());
         date = date.plusHours(1);
         CLOCKTIME = date.toInstant().toEpochMilli();
         event = Log4jLogEvent.newBuilder().setTimeMillis(CLOCKTIME).build();
-        assertSame("Time " + CLOCKTIME + " is within range: " + filter.toString(), Filter.Result.DENY, filter.filter(event));
+        assertSame(Filter.Result.DENY, filter.filter(event),
+                "Time " + CLOCKTIME + " is within range: " + filter.toString());
         date = date.plusDays(1).withHour(0);
         CLOCKTIME = date.toInstant().toEpochMilli();
         event = Log4jLogEvent.newBuilder().setTimeMillis(CLOCKTIME).build();
-        assertSame("Time " + CLOCKTIME + " is not within range: " + filter.toString(), Filter.Result.NEUTRAL, filter.filter(event));
+        assertSame(Filter.Result.NEUTRAL, filter.filter(event),
+                "Time " + CLOCKTIME + " is not within range: " + filter.toString());
     }
 
     @Test
@@ -139,19 +147,23 @@ public class TimeFilterTest {
         ZonedDateTime date = ZonedDateTime.of(2020, 3, 7, 23, 30, 30, 0, ZoneId.of("America/Los_Angeles")).withEarlierOffsetAtOverlap();
         CLOCKTIME = date.toInstant().toEpochMilli();
         LogEvent event = Log4jLogEvent.newBuilder().setTimeMillis(CLOCKTIME).build();
-        assertSame("Time " + CLOCKTIME + " is not within range: " + filter.toString(), Filter.Result.NEUTRAL, filter.filter(event));
+        assertSame(Filter.Result.NEUTRAL, filter.filter(event),
+                "Time " + CLOCKTIME + " is not within range: " + filter.toString());
         date = date.plusHours(1);
         CLOCKTIME = date.toInstant().toEpochMilli();
         event = Log4jLogEvent.newBuilder().setTimeMillis(CLOCKTIME).build();
-        assertSame("Time " + CLOCKTIME + " is not within range: " + filter.toString(), Filter.Result.NEUTRAL, filter.filter(event));
+        assertSame(Filter.Result.NEUTRAL, filter.filter(event),
+                "Time " + CLOCKTIME + " is not within range: " + filter.toString());
         date = date.plusHours(2);
         CLOCKTIME = date.toInstant().toEpochMilli();
         event = Log4jLogEvent.newBuilder().setTimeMillis(CLOCKTIME).build();
-        assertSame("Time " + CLOCKTIME + " is within range: " + filter.toString(), Filter.Result.DENY, filter.filter(event));
+        assertSame(Filter.Result.DENY, filter.filter(event),
+                "Time " + CLOCKTIME + " is within range: " + filter.toString());
         date = date.plusDays(1).withHour(0);
         CLOCKTIME = date.toInstant().toEpochMilli();
         event = Log4jLogEvent.newBuilder().setTimeMillis(CLOCKTIME).build();
-        assertSame("Time " + CLOCKTIME + " is not within range: " + filter.toString(), Filter.Result.NEUTRAL, filter.filter(event));
+        assertSame(Filter.Result.NEUTRAL, filter.filter(event),
+                "Time " + CLOCKTIME + " is not within range: " + filter.toString());
     }
 
 
@@ -164,19 +176,23 @@ public class TimeFilterTest {
         ZonedDateTime date = ZonedDateTime.of(2020, 10, 31, 23, 30, 30, 0, ZoneId.of("America/Los_Angeles")).withEarlierOffsetAtOverlap();
         CLOCKTIME = date.toInstant().toEpochMilli();
         LogEvent event = Log4jLogEvent.newBuilder().setTimeMillis(CLOCKTIME).build();
-        assertSame("Time " + CLOCKTIME + " is not within range: " + filter.toString(), Filter.Result.NEUTRAL, filter.filter(event));
+        assertSame(Filter.Result.NEUTRAL, filter.filter(event),
+                "Time " + CLOCKTIME + " is not within range: " + filter.toString());
         date = date.plusHours(1);
         CLOCKTIME = date.toInstant().toEpochMilli();
         event = Log4jLogEvent.newBuilder().setTimeMillis(CLOCKTIME).build();
-        assertSame("Time " + CLOCKTIME + " is not within range: " + filter.toString(), Filter.Result.NEUTRAL, filter.filter(event));
+        assertSame(Filter.Result.NEUTRAL, filter.filter(event),
+                "Time " + CLOCKTIME + " is not within range: " + filter.toString());
         date = date.plusHours(2);
         CLOCKTIME = date.toInstant().toEpochMilli();
         event = Log4jLogEvent.newBuilder().setTimeMillis(CLOCKTIME).build();
-        assertSame("Time " + CLOCKTIME + " is within range: " + filter.toString(), Filter.Result.DENY, filter.filter(event));
+        assertSame(Filter.Result.DENY, filter.filter(event),
+                "Time " + CLOCKTIME + " is within range: " + filter.toString());
         date = date.plusDays(1).withHour(0);
         CLOCKTIME = date.toInstant().toEpochMilli();
         event = Log4jLogEvent.newBuilder().setTimeMillis(CLOCKTIME).build();
-        assertSame("Time " + CLOCKTIME + " is not within range: " + filter.toString(), Filter.Result.NEUTRAL, filter.filter(event));
+        assertSame(Filter.Result.NEUTRAL, filter.filter(event),
+                "Time " + CLOCKTIME + " is not within range: " + filter.toString());
     }
 
     @Test
@@ -190,19 +206,22 @@ public class TimeFilterTest {
         CLOCKTIME = cal.getTimeInMillis();
         LogEvent event = Log4jLogEvent.newBuilder().setTimeMillis(CLOCKTIME).build();
         //assertSame(Filter.Result.NEUTRAL, filter.filter(null, Level.ERROR, null, (Object) null, (Throwable) null));
-        assertSame("Time " + CLOCKTIME + " is not within range: " + filter.toString(), Filter.Result.NEUTRAL, filter.filter(event));
+        assertSame(Filter.Result.NEUTRAL, filter.filter(event),
+                "Time " + CLOCKTIME + " is not within range: " + filter.toString());
 
         cal.add(Calendar.DATE, 1);
         cal.set(Calendar.HOUR_OF_DAY, 2);
         CLOCKTIME = cal.getTimeInMillis();
         event = Log4jLogEvent.newBuilder().setTimeMillis(CLOCKTIME).build();
-        assertSame("Time " + CLOCKTIME + " is not within range: " + filter.toString(), Filter.Result.NEUTRAL, filter.filter(event));
+        assertSame(Filter.Result.NEUTRAL, filter.filter(event),
+                "Time " + CLOCKTIME + " is not within range: " + filter.toString());
         //assertSame(Filter.Result.NEUTRAL, filter.filter(null, Level.ERROR, null, (Object) null, (Throwable) null));
 
         cal.set(Calendar.HOUR_OF_DAY, 4);
         CLOCKTIME = cal.getTimeInMillis();
         event = Log4jLogEvent.newBuilder().setTimeMillis(CLOCKTIME).build();
         //assertSame(Filter.Result.DENY, filter.filter(null, Level.ERROR, null, (Object) null, (Throwable) null));
-        assertSame("Time " + CLOCKTIME + " is within range: " + filter.toString(), Filter.Result.DENY, filter.filter(event));
+        assertSame(Filter.Result.DENY, filter.filter(event),
+                "Time " + CLOCKTIME + " is within range: " + filter.toString());
     }
 }
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/impl/ContextDataFactoryPropertySetMissingConstructorTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/impl/ContextDataFactoryPropertySetMissingConstructorTest.java
index 47c9c14..03ee85a 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/impl/ContextDataFactoryPropertySetMissingConstructorTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/impl/ContextDataFactoryPropertySetMissingConstructorTest.java
@@ -19,9 +19,9 @@ package org.apache.logging.log4j.core.impl;
 import java.lang.reflect.Field;
 
 import org.apache.logging.log4j.util.SortedArrayStringMap;
-import org.junit.Test;
+import org.junit.jupiter.api.Test;
 
-import static org.junit.Assert.*;
+import static org.junit.jupiter.api.Assertions.*;
 
 /**
  * Tests the ContextDataFactory class.
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/impl/ContextDataFactoryPropertySetTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/impl/ContextDataFactoryPropertySetTest.java
index dc308dc..8c03d5a 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/impl/ContextDataFactoryPropertySetTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/impl/ContextDataFactoryPropertySetTest.java
@@ -16,9 +16,9 @@
  */
 package org.apache.logging.log4j.core.impl;
 
-import org.junit.Test;
+import org.junit.jupiter.api.Test;
 
-import static org.junit.Assert.*;
+import static org.junit.jupiter.api.Assertions.*;
 
 /**
  * Tests the ContextDataFactory class.
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/impl/ContextDataFactoryTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/impl/ContextDataFactoryTest.java
index 5da1267..f0f569c 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/impl/ContextDataFactoryTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/impl/ContextDataFactoryTest.java
@@ -19,9 +19,9 @@ package org.apache.logging.log4j.core.impl;
 import java.lang.reflect.Field;
 
 import org.apache.logging.log4j.util.SortedArrayStringMap;
-import org.junit.Test;
+import org.junit.jupiter.api.Test;
 
-import static org.junit.Assert.*;
+import static org.junit.jupiter.api.Assertions.*;
 
 /**
  * Tests the ContextDataFactory class.
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/impl/JdkMapAdapterStringMapTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/impl/JdkMapAdapterStringMapTest.java
index c8c8db1..604a92d 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/impl/JdkMapAdapterStringMapTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/impl/JdkMapAdapterStringMapTest.java
@@ -26,18 +26,18 @@ import java.util.Map;
 
 import org.apache.logging.log4j.util.BiConsumer;
 import org.apache.logging.log4j.util.TriConsumer;
-import org.junit.Test;
+import org.junit.jupiter.api.Test;
 
-import static org.junit.Assert.*;
+import static org.junit.jupiter.api.Assertions.*;
 
 /**
  * Tests the JdkMapAdapterStringMap class.
  */
 public class JdkMapAdapterStringMapTest {
 
-    @Test(expected = NullPointerException.class)
-    public void testConstructorDisallowsNull() throws Exception {
-        new JdkMapAdapterStringMap(null);
+    @Test
+    public void testConstructorDisallowsNull() {
+        assertThrows(NullPointerException.class, () -> new JdkMapAdapterStringMap(null));
     }
 
     @Test
@@ -114,7 +114,7 @@ public class JdkMapAdapterStringMapTest {
         other.putValue("c", "cc");
         original.putAll(other);
 
-        assertEquals("size after put other", 7, original.size());
+        assertEquals(7, original.size(), "size after put other");
         assertEquals("aa", original.getValue("a"));
         assertEquals("bORIG", original.getValue("b"));
         assertEquals("cc", original.getValue("c"));
@@ -139,7 +139,7 @@ public class JdkMapAdapterStringMapTest {
         other.putValue("a", "aa");
         original.putAll(other);
 
-        assertEquals("size after put other", 7, original.size());
+        assertEquals(7, original.size(), "size after put other");
         assertEquals("aa", original.getValue("a"));
         assertEquals("bORIG", original.getValue("b"));
         assertEquals("cORIG", original.getValue("c"));
@@ -163,7 +163,7 @@ public class JdkMapAdapterStringMapTest {
         other.putValue("a", "aa");
         original.putAll(other);
 
-        assertEquals("size after put other", 6, original.size());
+        assertEquals(6, original.size(), "size after put other");
         assertEquals("aa", original.getValue("a"));
         assertEquals("bORIG", original.getValue("b"));
         assertEquals("11", original.getValue("1"));
@@ -187,7 +187,7 @@ public class JdkMapAdapterStringMapTest {
         other.putValue("a", "aa");
         original.putAll(other);
 
-        assertEquals("size after put other", 7, original.size());
+        assertEquals(7, original.size(), "size after put other");
         assertEquals("aa", original.getValue("a"));
         assertEquals("bORIG", original.getValue("b"));
         assertEquals("cORIG", original.getValue("c"));
@@ -211,7 +211,7 @@ public class JdkMapAdapterStringMapTest {
         other.putValue("a", "aa");
         original.putAll(other);
 
-        assertEquals("size after put other", 6, original.size());
+        assertEquals(6, original.size(), "size after put other");
         assertEquals("aa", original.getValue("a"));
         assertEquals("bORIG", original.getValue("b"));
         assertEquals("11", original.getValue("1"));
@@ -236,7 +236,7 @@ public class JdkMapAdapterStringMapTest {
         other.putValue("a", "aa");
         original.putAll(other);
 
-        assertEquals("size after put other", 7, original.size());
+        assertEquals(7, original.size(), "size after put other");
         assertEquals("aa", original.getValue("a"));
         assertEquals("bORIG", original.getValue("b"));
         assertEquals("cORIG", original.getValue("c"));
@@ -261,7 +261,7 @@ public class JdkMapAdapterStringMapTest {
         other.putValue("a", "aa");
         original.putAll(other);
 
-        assertEquals("size after put other", 6, original.size());
+        assertEquals(6, original.size(), "size after put other");
         assertEquals("aa", original.getValue("a"));
         assertEquals("bORIG", original.getValue("b"));
         assertEquals("11", original.getValue("1"));
@@ -284,7 +284,7 @@ public class JdkMapAdapterStringMapTest {
         other.putValue("c", "cc");
         original.putAll(other);
 
-        assertEquals("size after put other", 5, original.size());
+        assertEquals(5, original.size(), "size after put other");
         assertEquals("aa", original.getValue("a"));
         assertEquals("bORIG", original.getValue("b"));
         assertEquals("cc", original.getValue("c"));
@@ -347,11 +347,11 @@ public class JdkMapAdapterStringMapTest {
         original.putValue("a", "aaa");
         original.putValue("b", "bbb");
         original.putValue("c", "ccc");
-        assertEquals("size", 3, original.size());
+        assertEquals(3, original.size(), "size");
 
         // add empty context data
         original.putAll(new JdkMapAdapterStringMap());
-        assertEquals("size after put empty", 3, original.size());
+        assertEquals(3, original.size(), "size after put empty");
         assertEquals("aaa", original.getValue("a"));
         assertEquals("bbb", original.getValue("b"));
         assertEquals("ccc", original.getValue("c"));
@@ -362,7 +362,7 @@ public class JdkMapAdapterStringMapTest {
         other.putValue("3", "333");
         original.putAll(other);
 
-        assertEquals("size after put other", 6, original.size());
+        assertEquals(6, original.size(), "size after put other");
         assertEquals("aaa", original.getValue("a"));
         assertEquals("bbb", original.getValue("b"));
         assertEquals("ccc", original.getValue("c"));
@@ -378,11 +378,11 @@ public class JdkMapAdapterStringMapTest {
         original.putValue("b", "bbb");
         original.putValue("c", "ccc");
         original.putValue("d", "ddd");
-        assertEquals("size", 4, original.size());
+        assertEquals(4, original.size(), "size");
 
         // add empty context data
         original.putAll(new JdkMapAdapterStringMap());
-        assertEquals("size after put empty", 4, original.size());
+        assertEquals(4, original.size(), "size after put empty");
         assertEquals("aaa", original.getValue("a"));
         assertEquals("bbb", original.getValue("b"));
         assertEquals("ccc", original.getValue("c"));
@@ -395,7 +395,7 @@ public class JdkMapAdapterStringMapTest {
         other.putValue("4", "444");
         original.putAll(other);
 
-        assertEquals("size after put other", 8, original.size());
+        assertEquals(8, original.size(), "size after put other");
         assertEquals("aaa", original.getValue("a"));
         assertEquals("bbb", original.getValue("b"));
         assertEquals("ccc", original.getValue("c"));
@@ -414,7 +414,7 @@ public class JdkMapAdapterStringMapTest {
         original.putValue("b", "bbb");
         original.putValue("c", "ccc");
         original.putValue("d", "ddd");
-        assertEquals("size", 5, original.size());
+        assertEquals(5, original.size(), "size");
 
         final JdkMapAdapterStringMap other = new JdkMapAdapterStringMap();
         for (int i = 0 ; i < 500; i++) {
@@ -423,7 +423,7 @@ public class JdkMapAdapterStringMapTest {
         other.putValue(null, "otherVal");
         original.putAll(other);
 
-        assertEquals("size after put other", 505, original.size());
+        assertEquals(505, original.size(), "size after put other");
         assertEquals("otherVal", original.getValue(null));
         assertEquals("aaa", original.getValue("a"));
         assertEquals("bbb", original.getValue("b"));
@@ -440,11 +440,11 @@ public class JdkMapAdapterStringMapTest {
         original.putValue("a", "aaa");
         original.putValue("b", "bbb");
         original.putValue("c", "ccc");
-        assertEquals("size", 3, original.size());
+        assertEquals(3, original.size(), "size");
 
         // putAll with self
         original.putAll(original);
-        assertEquals("size after put empty", 3, original.size());
+        assertEquals(3, original.size(), "size after put empty");
         assertEquals("aaa", original.getValue("a"));
         assertEquals("bbb", original.getValue("b"));
         assertEquals("ccc", original.getValue("c"));
@@ -458,12 +458,7 @@ public class JdkMapAdapterStringMapTest {
         original.putValue("c", "aaa");
         original.putValue("d", "aaa");
         original.putValue("e", "aaa");
-        original.forEach(new BiConsumer<String, Object>() {
-            @Override
-            public void accept(final String s, final Object o) {
-                original.putValue("c" + s, "other");
-            }
-        });
+        original.forEach((s, o) -> original.putValue("c" + s, "other"));
     }
 
     @Test
@@ -474,12 +469,7 @@ public class JdkMapAdapterStringMapTest {
         original.putValue("c", "aaa");
         original.putValue("d", "aaa");
         original.putValue("e", "aaa");
-        original.forEach(new BiConsumer<String, Object>() {
-            @Override
-            public void accept(final String s, final Object o) {
-                original.putValue("c" + s, "other");
-            }
-        });
+        original.forEach((s, o) -> original.putValue("c" + s, "other"));
     }
 
     @Test
@@ -488,12 +478,7 @@ public class JdkMapAdapterStringMapTest {
         original.putValue("a", "aaa");
         original.putValue("b", "aaa");
         original.putValue("c", "aaa");
-        original.forEach(new BiConsumer<String, Object>() {
-            @Override
-            public void accept(final String s, final Object o) {
-                original.remove("a");
-            }
-        });
+        original.forEach((s, o) -> original.remove("a"));
     }
 
     @Test
@@ -504,12 +489,7 @@ public class JdkMapAdapterStringMapTest {
         original.putValue("c", "aaa");
         original.putValue("d", "aaa");
         original.putValue("e", "aaa");
-        original.forEach(new BiConsumer<String, Object>() {
-            @Override
-            public void accept(final String s, final Object o) {
-                original.clear();
-            }
-        });
+        original.forEach((s, o) -> original.clear());
     }
 
     @Test
@@ -519,12 +499,7 @@ public class JdkMapAdapterStringMapTest {
         original.putValue("b", "aaa");
         original.putValue("d", "aaa");
         original.putValue("e", "aaa");
-        original.forEach(new TriConsumer<String, Object, Object>() {
-            @Override
-            public void accept(final String s, final Object o, final Object o2) {
-                original.putValue("c", "other");
-            }
-        }, null);
+        original.forEach((s, o, o2) -> original.putValue("c", "other"), null);
     }
 
     @Test
@@ -535,12 +510,7 @@ public class JdkMapAdapterStringMapTest {
         original.putValue("c", "aaa");
         original.putValue("d", "aaa");
         original.putValue("e", "aaa");
-        original.forEach(new TriConsumer<String, Object, Object>() {
-            @Override
-            public void accept(final String s, final Object o, final Object o2) {
-                original.putValue("c" + s, "other");
-            }
-        }, null);
+        original.forEach((s, o, o2) -> original.putValue("c" + s, "other"), null);
     }
 
     @Test
@@ -549,12 +519,7 @@ public class JdkMapAdapterStringMapTest {
         original.putValue("a", "aaa");
         original.putValue("b", "aaa");
         original.putValue("c", "aaa");
-        original.forEach(new TriConsumer<String, Object, Object>() {
-            @Override
-            public void accept(final String s, final Object o, final Object o2) {
-                original.remove("a");
-            }
-        }, null);
+        original.forEach((s, o, o2) -> original.remove("a"), null);
     }
 
     @Test
@@ -564,12 +529,7 @@ public class JdkMapAdapterStringMapTest {
         original.putValue("b", "aaa");
         original.putValue("c", "aaa");
         original.putValue("d", "aaa");
-        original.forEach(new TriConsumer<String, Object, Object>() {
-            @Override
-            public void accept(final String s, final Object o, final Object o2) {
-                original.clear();
-            }
-        }, null);
+        original.forEach((s, o, o2) -> original.clear(), null);
     }
 
     @Test
@@ -580,24 +540,24 @@ public class JdkMapAdapterStringMapTest {
     @Test
     public void testIsFrozenAfterCallingFreeze() {
         final JdkMapAdapterStringMap original = new JdkMapAdapterStringMap();
-        assertFalse("before freeze", original.isFrozen());
+        assertFalse(original.isFrozen(), "before freeze");
         original.freeze();
-        assertTrue("after freeze", original.isFrozen());
+        assertTrue(original.isFrozen(), "after freeze");
     }
 
-    @Test(expected = UnsupportedOperationException.class)
+    @Test
     public void testFreezeProhibitsPutValue() {
         final JdkMapAdapterStringMap original = new JdkMapAdapterStringMap();
         original.freeze();
-        original.putValue("a", "aaa");
+        assertThrows(UnsupportedOperationException.class, () -> original.putValue("a", "aaa"));
     }
 
-    @Test(expected = UnsupportedOperationException.class)
+    @Test
     public void testFreezeProhibitsRemove() {
         final JdkMapAdapterStringMap original = new JdkMapAdapterStringMap();
         original.putValue("b", "bbb");
         original.freeze();
-        original.remove("b"); // existing key: modifies the collection
+        assertThrows(UnsupportedOperationException.class, () -> original.remove("b")); // existing key: modifies the collection
     }
 
     @Test
@@ -615,12 +575,12 @@ public class JdkMapAdapterStringMapTest {
         original.remove("a"); // no exception
     }
 
-    @Test(expected = UnsupportedOperationException.class)
+    @Test
     public void testFreezeProhibitsClear() {
         final JdkMapAdapterStringMap original = new JdkMapAdapterStringMap();
         original.putValue("a", "aaa");
         original.freeze();
-        original.clear();
+        assertThrows(UnsupportedOperationException.class, original::clear);
     }
 
     @Test
@@ -674,27 +634,27 @@ public class JdkMapAdapterStringMapTest {
         expected.put("3", "3value");
         expected.put("c", "cvalue");
         expected.put("d", "dvalue");
-        assertEquals("initial", expected, original.toMap());
+        assertEquals(expected, original.toMap(), "initial");
 
         original.putValue(null, "nullvalue");
         expected.put(null, "nullvalue");
         assertEquals(6, original.size());
-        assertEquals("with null key", expected, original.toMap());
+        assertEquals(expected, original.toMap(), "with null key");
 
         original.putValue(null, "otherNullvalue");
         expected.put(null, "otherNullvalue");
         assertEquals(6, original.size());
-        assertEquals("with null key value2", expected, original.toMap());
+        assertEquals(expected, original.toMap(), "with null key value2");
 
         original.putValue(null, "nullvalue");
         expected.put(null, "nullvalue");
         assertEquals(6, original.size());
-        assertEquals("with null key value1 again", expected, original.toMap());
+        assertEquals(expected, original.toMap(), "with null key value1 again");
 
         original.putValue(null, "abc");
         expected.put(null, "abc");
         assertEquals(6, original.size());
-        assertEquals("with null key value3", expected, original.toMap());
+        assertEquals(expected, original.toMap(), "with null key value3");
     }
 
     @Test
@@ -706,11 +666,11 @@ public class JdkMapAdapterStringMapTest {
 
         original.remove("a");
         assertEquals(0, original.size());
-        assertNull("no a val", original.getValue("a"));
+        assertNull(original.getValue("a"), "no a val");
 
         original.remove("B");
         assertEquals(0, original.size());
-        assertNull("no B val", original.getValue("B"));
+        assertNull(original.getValue("B"), "no B val");
     }
 
     @Test
@@ -732,11 +692,11 @@ public class JdkMapAdapterStringMapTest {
 
         original.putValue("a", null);
         assertEquals(1, original.size());
-        assertNull("no a val", original.getValue("a"));
+        assertNull(original.getValue("a"), "no a val");
 
         original.putValue("B", null);
         assertEquals(2, original.size());
-        assertNull("no B val", original.getValue("B"));
+        assertNull(original.getValue("B"), "no B val");
     }
 
     @Test
@@ -772,65 +732,65 @@ public class JdkMapAdapterStringMapTest {
     @Test
     public void testContainsKey() throws Exception {
         final JdkMapAdapterStringMap original = new JdkMapAdapterStringMap();
-        assertFalse("a", original.containsKey("a"));
-        assertFalse("B", original.containsKey("B"));
-        assertFalse("3", original.containsKey("3"));
-        assertFalse("A", original.containsKey("A"));
+        assertFalse(original.containsKey("a"), "a");
+        assertFalse(original.containsKey("B"), "B");
+        assertFalse(original.containsKey("3"), "3");
+        assertFalse(original.containsKey("A"), "A");
 
         original.putValue("a", "avalue");
-        assertTrue("a", original.containsKey("a"));
-        assertFalse("B", original.containsKey("B"));
-        assertFalse("3", original.containsKey("3"));
-        assertFalse("A", original.containsKey("A"));
+        assertTrue(original.containsKey("a"), "a");
+        assertFalse(original.containsKey("B"), "B");
+        assertFalse(original.containsKey("3"), "3");
+        assertFalse(original.containsKey("A"), "A");
 
         original.putValue("B", "Bvalue");
-        assertTrue("a", original.containsKey("a"));
-        assertTrue("B", original.containsKey("B"));
-        assertFalse("3", original.containsKey("3"));
-        assertFalse("A", original.containsKey("A"));
+        assertTrue(original.containsKey("a"), "a");
+        assertTrue(original.containsKey("B"), "B");
+        assertFalse(original.containsKey("3"), "3");
+        assertFalse(original.containsKey("A"), "A");
 
         original.putValue("3", "3value");
-        assertTrue("a", original.containsKey("a"));
-        assertTrue("B", original.containsKey("B"));
-        assertTrue("3", original.containsKey("3"));
-        assertFalse("A", original.containsKey("A"));
+        assertTrue(original.containsKey("a"), "a");
+        assertTrue(original.containsKey("B"), "B");
+        assertTrue(original.containsKey("3"), "3");
+        assertFalse(original.containsKey("A"), "A");
 
         original.putValue("A", "AAA");
-        assertTrue("a", original.containsKey("a"));
-        assertTrue("B", original.containsKey("B"));
-        assertTrue("3", original.containsKey("3"));
-        assertTrue("A", original.containsKey("A"));
+        assertTrue(original.containsKey("a"), "a");
+        assertTrue(original.containsKey("B"), "B");
+        assertTrue(original.containsKey("3"), "3");
+        assertTrue(original.containsKey("A"), "A");
     }
 
     @Test
     public void testSizeAndIsEmpty() throws Exception {
         final JdkMapAdapterStringMap original = new JdkMapAdapterStringMap();
         assertEquals(0, original.size());
-        assertTrue("initial", original.isEmpty());
+        assertTrue(original.isEmpty(), "initial");
 
         original.putValue("a", "avalue");
         assertEquals(1, original.size());
-        assertFalse("size=" + original.size(), original.isEmpty());
+        assertFalse(original.isEmpty(), "size=" + original.size());
 
         original.putValue("B", "Bvalue");
         assertEquals(2, original.size());
-        assertFalse("size=" + original.size(), original.isEmpty());
+        assertFalse(original.isEmpty(), "size=" + original.size());
 
         original.putValue("3", "3value");
         assertEquals(3, original.size());
-        assertFalse("size=" + original.size(), original.isEmpty());
+        assertFalse(original.isEmpty(), "size=" + original.size());
 
         original.remove("B");
         assertEquals(2, original.size());
-        assertFalse("size=" + original.size(), original.isEmpty());
+        assertFalse(original.isEmpty(), "size=" + original.size());
 
         original.remove("3");
         assertEquals(1, original.size());
-        assertFalse("size=" + original.size(), original.isEmpty());
+        assertFalse(original.isEmpty(), "size=" + original.size());
 
         original.remove("a");
         assertEquals(0, original.size());
-        assertTrue("size=" + original.size(), original.isEmpty());
+        assertTrue(original.isEmpty(), "size=" + original.size());
     }
 
     @Test
@@ -847,7 +807,7 @@ public class JdkMapAdapterStringMapTest {
 //                assertEquals("key", key, original.getKeyAt(count));
 //                assertEquals("val", value, original.getValueAt(count));
                 count++;
-                assertTrue("count should not exceed size but was " + count, count <= original.size());
+                assertTrue(count <= original.size(), "count should not exceed size but was " + count);
             }
         });
     }
@@ -856,15 +816,12 @@ public class JdkMapAdapterStringMapTest {
         JdkMapAdapterStringMap data;
         int count;
     }
-    static TriConsumer<String, String, JdkMapAdapterStringMapTest.State> COUNTER = new TriConsumer<String, String, JdkMapAdapterStringMapTest.State>() {
-        @Override
-        public void accept(final String key, final String value, final JdkMapAdapterStringMapTest.State state) {
+    static TriConsumer<String, String, JdkMapAdapterStringMapTest.State> COUNTER = (key, value, state) -> {
 //            assertEquals("key", key, state.data.getKeyAt(state.count));
 //            assertEquals("val", value, state.data.getValueAt(state.count));
-            state.count++;
-            assertTrue("count should not exceed size but was " + state.count,
-                    state.count <= state.data.size());
-        }
+        state.count++;
+        assertTrue(
+                state.count <= state.data.size(), "count should not exceed size but was " + state.count);
     };
 
     @Test
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/impl/Log4jLogEventNanoTimeTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/impl/Log4jLogEventNanoTimeTest.java
index caae76b..9aec064 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/impl/Log4jLogEventNanoTimeTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/impl/Log4jLogEventNanoTimeTest.java
@@ -29,21 +29,23 @@ import org.apache.logging.log4j.core.util.Constants;
 import org.apache.logging.log4j.core.util.DummyNanoClock;
 import org.apache.logging.log4j.core.util.SystemNanoClock;
 import org.apache.logging.log4j.util.Strings;
-import org.junit.AfterClass;
-import org.junit.BeforeClass;
-import org.junit.Test;
+import org.junit.jupiter.api.AfterAll;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.Tag;
+import org.junit.jupiter.api.Test;
 
-import static org.junit.Assert.*;
+import static org.junit.jupiter.api.Assertions.*;
 
+@Tag("functional")
 public class Log4jLogEventNanoTimeTest {
 
-    @BeforeClass
+    @BeforeAll
     public static void beforeClass() {
         System.setProperty(ConfigurationFactory.CONFIGURATION_FILE_PROPERTY,
                 "NanoTimeToFileTest.xml");
     }
 
-    @AfterClass
+    @AfterAll
     public static void afterClass() {
         System.setProperty(Constants.LOG4J_CONTEXT_SELECTOR, Strings.EMPTY);
     }
@@ -56,13 +58,13 @@ public class Log4jLogEventNanoTimeTest {
         final Logger log = LogManager.getLogger("com.foo.Bar");
         final long before = System.nanoTime();
         log.info("Use actual System.nanoTime()");
-        assertTrue("using SystemNanoClock", Log4jLogEvent.getNanoClock() instanceof SystemNanoClock);
+        assertTrue(Log4jLogEvent.getNanoClock() instanceof SystemNanoClock, "using SystemNanoClock");
 
         final long DUMMYNANOTIME = 123;
         Log4jLogEvent.setNanoClock(new DummyNanoClock(DUMMYNANOTIME));
         log.info("Use dummy nano clock");
-        assertTrue("using SystemNanoClock", Log4jLogEvent.getNanoClock() instanceof DummyNanoClock);
-
+        assertTrue(Log4jLogEvent.getNanoClock() instanceof DummyNanoClock, "using SystemNanoClock");
+        
         CoreLoggerContexts.stopLoggerContext(file); // stop async thread
 
         String line1;
@@ -75,14 +77,14 @@ public class Log4jLogEventNanoTimeTest {
         }
         file.delete();
 
-        assertNotNull("line1", line1);
-        assertNotNull("line2", line2);
+        assertNotNull(line1, "line1");
+        assertNotNull(line2, "line2");
         final String[] line1Parts = line1.split(" AND ");
         assertEquals("Use actual System.nanoTime()", line1Parts[2]);
         assertEquals(line1Parts[0], line1Parts[1]);
         final long loggedNanoTime = Long.parseLong(line1Parts[0]);
-        assertTrue("used system nano time", loggedNanoTime - before < TimeUnit.SECONDS.toNanos(1));
-
+        assertTrue(loggedNanoTime - before < TimeUnit.SECONDS.toNanos(1), "used system nano time");
+        
         final String[] line2Parts = line2.split(" AND ");
         assertEquals("Use dummy nano clock", line2Parts[2]);
         assertEquals(String.valueOf(DUMMYNANOTIME), line2Parts[0]);
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/impl/Log4jLogEventTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/impl/Log4jLogEventTest.java
index 9a8fa7c..3e2f9e0 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/impl/Log4jLogEventTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/impl/Log4jLogEventTest.java
@@ -16,21 +16,6 @@
  */
 package org.apache.logging.log4j.core.impl;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertSame;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutputStream;
-import java.lang.reflect.Field;
-
 import org.apache.logging.log4j.Level;
 import org.apache.logging.log4j.Marker;
 import org.apache.logging.log4j.MarkerManager;
@@ -51,10 +36,18 @@ import org.apache.logging.log4j.util.FilteredObjectInputStream;
 import org.apache.logging.log4j.util.SortedArrayStringMap;
 import org.apache.logging.log4j.util.StringMap;
 import org.apache.logging.log4j.util.Strings;
-import org.junit.AfterClass;
-import org.junit.Assert;
-import org.junit.BeforeClass;
-import org.junit.Test;
+import org.junit.jupiter.api.AfterAll;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.Test;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.lang.reflect.Field;
+
+import static org.junit.jupiter.api.Assertions.*;
 
 public class Log4jLogEventTest {
 
@@ -73,12 +66,12 @@ public class Log4jLogEventTest {
         }
     }
 
-    @BeforeClass
+    @BeforeAll
     public static void beforeClass() {
         System.setProperty(ClockFactory.PROPERTY_NAME, FixedTimeClock.class.getName());
     }
 
-    @AfterClass
+    @AfterAll
     public static void afterClass() throws IllegalAccessException {
         ClockFactoryTest.resetClocks();
     }
@@ -86,15 +79,15 @@ public class Log4jLogEventTest {
     @Test
     public void testToImmutableSame() {
         final LogEvent logEvent = new Log4jLogEvent();
-        Assert.assertSame(logEvent, logEvent.toImmutable());
+        assertSame(logEvent, logEvent.toImmutable());
     }
 
     @Test
     public void testToImmutableNotSame() {
         final LogEvent logEvent = new Log4jLogEvent.Builder().setMessage(new ReusableObjectMessage()).build();
         final LogEvent immutable = logEvent.toImmutable();
-        Assert.assertSame(logEvent, immutable);
-        Assert.assertFalse(immutable.getMessage() instanceof ReusableMessage);
+        assertSame(logEvent, immutable);
+        assertFalse(immutable.getMessage() instanceof ReusableMessage);
     }
 
     @Test
@@ -210,7 +203,7 @@ public class Log4jLogEventTest {
         assertEquals(marker, evt2.getMarker());
         assertEquals(msg, evt2.getMessage());
         assertEquals(threadName, evt2.getThreadName());
-        assertEquals(null, evt2.getThrown());
+        assertNull(evt2.getThrown());
         assertEquals(this.getClass().getName() + "$DeletedException", evt2.getThrownProxy().getName());
         assertEquals(errorMessage, evt2.getThrownProxy().getMessage());
     }
@@ -231,7 +224,7 @@ public class Log4jLogEventTest {
     @Test
     public void testInitiallyDummyNanoClock() {
         assertTrue(Log4jLogEvent.getNanoClock() instanceof DummyNanoClock);
-        assertEquals("initial dummy nanotime", 0, Log4jLogEvent.getNanoClock().nanoTime());
+        assertEquals(0, Log4jLogEvent.getNanoClock().nanoTime(), "initial dummy nanotime");
     }
 
     @Test
@@ -246,15 +239,15 @@ public class Log4jLogEventTest {
     private void verifyNanoTimeWithAllConstructors(final long expected) {
         assertEquals(expected, Log4jLogEvent.getNanoClock().nanoTime());
 
-        assertEquals("No-arg constructor", expected, new Log4jLogEvent().getNanoTime());
-        assertEquals("1-arg constructor", expected, new Log4jLogEvent(98).getNanoTime());
-        assertEquals("6-arg constructor", expected, new Log4jLogEvent("l", null, "a", null, null, null).getNanoTime());
-        assertEquals("7-arg constructor", expected, new Log4jLogEvent("l", null, "a", null, null, null, null)
-                .getNanoTime());
-        assertEquals("11-arg constructor", expected, new Log4jLogEvent("l", null, "a", null, null, null, null, null,
-                null, null, 0).getNanoTime());
-        assertEquals("12-arg factory method", expected, Log4jLogEvent.createEvent("l", null, "a", null, null, null,
-                null, null, null, null, null, 0).getNanoTime());
+        assertEquals(expected, new Log4jLogEvent().getNanoTime(), "No-arg constructor");
+        assertEquals(expected, new Log4jLogEvent(98).getNanoTime(), "1-arg constructor");
+        assertEquals(expected, new Log4jLogEvent("l", null, "a", null, null, null).getNanoTime(), "6-arg constructor");
+        assertEquals(expected, new Log4jLogEvent("l", null, "a", null, null, null, null).getNanoTime(), "7-arg constructor");
+        assertEquals(expected, new Log4jLogEvent("l", null, "a", null, null, null, null, null, null, null, 0).getNanoTime(),
+                "11-arg constructor");
+        assertEquals(expected,
+                Log4jLogEvent.createEvent("l", null, "a", null, null, null, null, null, null, null, null, 0).getNanoTime(),
+                "12-arg factory method");
     }
 
     @SuppressWarnings("deprecation")
@@ -289,8 +282,8 @@ public class Log4jLogEventTest {
 
         assertEquals(contextData, event.getContextData());
         assertSame(contextStack, event.getContextStack());
-        assertEquals(true, event.isEndOfBatch());
-        assertEquals(true, event.isIncludeLocation());
+        assertTrue(event.isEndOfBatch());
+        assertTrue(event.isIncludeLocation());
         assertSame(Level.FATAL, event.getLevel());
         assertSame(fqcn, event.getLoggerFqcn());
         assertSame(name, event.getLoggerName());
@@ -303,8 +296,8 @@ public class Log4jLogEventTest {
         assertEquals(987654321L, event.getTimeMillis());
 
         final LogEvent event2 = new Log4jLogEvent.Builder(event).build();
-        assertEquals("copy constructor builder", event2, event);
-        assertEquals("same hashCode", event2.hashCode(), event.hashCode());
+        assertEquals(event2, event, "copy constructor builder");
+        assertEquals(event2.hashCode(), event.hashCode(), "same hashCode");
     }
 
     @Test
@@ -338,8 +331,8 @@ public class Log4jLogEventTest {
 
         assertSame(contextData, event.getContextData());
         assertSame(contextStack, event.getContextStack());
-        assertEquals(true, event.isEndOfBatch());
-        assertEquals(true, event.isIncludeLocation());
+        assertTrue(event.isEndOfBatch());
+        assertTrue(event.isIncludeLocation());
         assertSame(Level.FATAL, event.getLevel());
         assertSame(fqcn, event.getLoggerFqcn());
         assertSame(name, event.getLoggerName());
@@ -352,8 +345,8 @@ public class Log4jLogEventTest {
         assertEquals(987654321L, event.getTimeMillis());
 
         final LogEvent event2 = new Log4jLogEvent.Builder(event).build();
-        assertEquals("copy constructor builder", event2, event);
-        assertEquals("same hashCode", event2.hashCode(), event.hashCode());
+        assertEquals(event2, event, "copy constructor builder");
+        assertEquals(event2.hashCode(), event.hashCode(), "same hashCode");
     }
 
     @Test
@@ -386,8 +379,8 @@ public class Log4jLogEventTest {
 
         assertSame(contextData, event.getContextData());
         assertSame(contextStack, event.getContextStack());
-        assertEquals(true, event.isEndOfBatch());
-        assertEquals(true, event.isIncludeLocation());
+        assertTrue(event.isEndOfBatch());
+        assertTrue(event.isIncludeLocation());
         assertSame(Level.FATAL, event.getLevel());
         assertSame(fqcn, event.getLoggerFqcn());
         assertSame(name, event.getLoggerName());
@@ -402,8 +395,8 @@ public class Log4jLogEventTest {
         final LogEvent e2 = new Log4jLogEvent.Builder(event).build();
         assertEquals(contextData, e2.getContextData());
         assertSame(contextStack, e2.getContextStack());
-        assertEquals(true, e2.isEndOfBatch());
-        assertEquals(true, e2.isIncludeLocation());
+        assertTrue(e2.isEndOfBatch());
+        assertTrue(e2.isIncludeLocation());
         assertSame(Level.FATAL, e2.getLevel());
         assertSame(fqcn, e2.getLoggerFqcn());
         assertSame(name, e2.getLoggerName());
@@ -420,7 +413,7 @@ public class Log4jLogEventTest {
         final Field fieldSource = Log4jLogEvent.class.getDeclaredField("source");
         fieldSource.setAccessible(true);
         final Object value = fieldSource.get(e2);
-        assertNull("source in copy", value);
+        assertNull(value, "source in copy");
     }
 
     @SuppressWarnings("deprecation")
@@ -456,8 +449,8 @@ public class Log4jLogEventTest {
 
         assertEquals(contextData, event.getContextData());
         assertSame(contextStack, event.getContextStack());
-        assertEquals(true, event.isEndOfBatch());
-        assertEquals(true, event.isIncludeLocation());
+        assertTrue(event.isEndOfBatch());
+        assertTrue(event.isIncludeLocation());
         assertSame(Level.FATAL, event.getLevel());
         assertSame(fqcn, event.getLoggerFqcn());
         assertSame(name, event.getLoggerName());
@@ -470,13 +463,13 @@ public class Log4jLogEventTest {
         assertEquals(987654321L, event.getTimeMillis());
 
         final LogEvent event2 = builder(event).build();
-        assertEquals("copy constructor builder", event2, event);
-        assertEquals("same hashCode", event2.hashCode(), event.hashCode());
+        assertEquals(event2, event, "copy constructor builder");
+        assertEquals(event2.hashCode(), event.hashCode(), "same hashCode");
 
         assertEquals(contextData, event2.getContextData());
         assertSame(contextStack, event2.getContextStack());
-        assertEquals(true, event2.isEndOfBatch());
-        assertEquals(true, event2.isIncludeLocation());
+        assertTrue(event2.isEndOfBatch());
+        assertTrue(event2.isIncludeLocation());
         assertSame(Level.FATAL, event2.getLevel());
         assertSame(fqcn, event2.getLoggerFqcn());
         assertSame(name, event2.getLoggerName());
@@ -507,21 +500,13 @@ public class Log4jLogEventTest {
         different("null fqcn", builder(event).setLoggerFqcn(null), event);
 
         different("different name", builder(event).setLoggerName("different"), event);
-        try { // TODO null logger name throws NPE in equals. Use Objects.requireNonNull in constructor?
-            different("null name", builder(event).setLoggerName(null), event);
-            fail("Expected NullPointerException");
-        } catch (final NullPointerException ok) {
-        }
+        assertThrows(NullPointerException.class, () -> different("null name", builder(event).setLoggerName(null), event));
 
         different("different marker", builder(event).setMarker(MarkerManager.getMarker("different")), event);
         different("null marker", builder(event).setMarker(null), event);
 
         different("different message", builder(event).setMessage(new ObjectMessage("different")), event);
-        try { // TODO null message throws NPE in equals(). Use Objects.requireNonNull in constructor?
-            different("null message", builder(event).setMessage(null), event);
-            fail("Expected NullPointerException");
-        } catch (final NullPointerException ok) {
-        }
+        assertThrows(NullPointerException.class, () -> different("null message", builder(event).setMessage(null), event));
 
         different("different nanoTime", builder(event).setNanoTime(135), event);
         different("different milliTime", builder(event).setTimeMillis(137), event);
@@ -543,8 +528,8 @@ public class Log4jLogEventTest {
 
     private void different(final String reason, final Log4jLogEvent.Builder builder, final LogEvent event) {
         final LogEvent other = builder.build();
-        assertNotEquals(reason, other, event);
-        assertNotEquals(reason + " hashCode", other.hashCode(), event.hashCode());
+        assertNotEquals(other, event, reason);
+        assertNotEquals(other.hashCode(), event.hashCode(), reason + " hashCode");
     }
 
     @Test
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/impl/MutableLogEventTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/impl/MutableLogEventTest.java
index 288a57a..5cfc29c 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/impl/MutableLogEventTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/impl/MutableLogEventTest.java
@@ -37,11 +37,10 @@ import org.apache.logging.log4j.util.FilteredObjectInputStream;
 import org.apache.logging.log4j.util.SortedArrayStringMap;
 import org.apache.logging.log4j.util.StringMap;
 import org.apache.logging.log4j.spi.MutableThreadContextStack;
-import org.junit.Assert;
-import org.junit.BeforeClass;
-import org.junit.Test;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.Test;
 
-import static org.junit.Assert.*;
+import static org.junit.jupiter.api.Assertions.*;
 
 /**
  * Tests the MutableLogEvent class.
@@ -59,7 +58,7 @@ public class MutableLogEventTest {
         return result;
     }
 
-    @BeforeClass
+    @BeforeAll
     public static void setupClass() {
         try {
             Class.forName("java.io.ObjectInputFilter");
@@ -72,7 +71,7 @@ public class MutableLogEventTest {
     @Test
     public void testToImmutable() {
         final LogEvent logEvent = new MutableLogEvent();
-        Assert.assertNotSame(logEvent, logEvent.toImmutable());
+        assertNotSame(logEvent, logEvent.toImmutable());
     }
 
     @Test
@@ -96,23 +95,23 @@ public class MutableLogEventTest {
                 .build();
         final MutableLogEvent mutable = new MutableLogEvent();
         mutable.initFrom(source);
-        assertEquals("contextMap", CONTEXT_DATA, mutable.getContextData());
-        assertEquals("stack", STACK, mutable.getContextStack());
-        assertEquals("endOfBatch", true, mutable.isEndOfBatch());
-        assertEquals("IncludeLocation()", true, mutable.isIncludeLocation());
-        assertEquals("level", Level.FATAL, mutable.getLevel());
-        assertEquals("LoggerFqcn()", source.getLoggerFqcn(), mutable.getLoggerFqcn());
-        assertEquals("LoggerName", source.getLoggerName(), mutable.getLoggerName());
-        assertEquals("marker", source.getMarker(), mutable.getMarker());
-        assertEquals("msg", source.getMessage(), mutable.getMessage());
-        assertEquals("nano", source.getNanoTime(), mutable.getNanoTime());
-        assertEquals("src", source.getSource(), mutable.getSource());
-        assertEquals("tid", source.getThreadId(), mutable.getThreadId());
-        assertEquals("tname", source.getThreadName(), mutable.getThreadName());
-        assertEquals("tpriority", source.getThreadPriority(), mutable.getThreadPriority());
-        assertEquals("throwns", source.getThrown(), mutable.getThrown());
-        assertEquals("proxy", source.getThrownProxy(), mutable.getThrownProxy());
-        assertEquals("millis", source.getTimeMillis(), mutable.getTimeMillis());
+        assertEquals(CONTEXT_DATA, mutable.getContextData(), "contextMap");
+        assertEquals(STACK, mutable.getContextStack(), "stack");
+        assertTrue(mutable.isEndOfBatch(), "endOfBatch");
+        assertTrue(mutable.isIncludeLocation(), "IncludeLocation()");
+        assertEquals(Level.FATAL, mutable.getLevel(), "level");
+        assertEquals(source.getLoggerFqcn(), mutable.getLoggerFqcn(), "LoggerFqcn()");
+        assertEquals(source.getLoggerName(), mutable.getLoggerName(), "LoggerName");
+        assertEquals(source.getMarker(), mutable.getMarker(), "marker");
+        assertEquals(source.getMessage(), mutable.getMessage(), "msg");
+        assertEquals(source.getNanoTime(), mutable.getNanoTime(), "nano");
+        assertEquals(source.getSource(), mutable.getSource(), "src");
+        assertEquals(source.getThreadId(), mutable.getThreadId(), "tid");
+        assertEquals(source.getThreadName(), mutable.getThreadName(), "tname");
+        assertEquals(source.getThreadPriority(), mutable.getThreadPriority(), "tpriority");
+        assertEquals(source.getThrown(), mutable.getThrown(), "throwns");
+        assertEquals(source.getThrownProxy(), mutable.getThrownProxy(), "proxy");
+        assertEquals(source.getTimeMillis(), mutable.getTimeMillis(), "millis");
     }
 
     @Test
@@ -136,23 +135,23 @@ public class MutableLogEventTest {
                 .build();
         final MutableLogEvent mutable = new MutableLogEvent();
         mutable.initFrom(source);
-        assertEquals("format", "msg in a {}", mutable.getFormat());
-        assertEquals("formatted", "msg in a bottle", mutable.getFormattedMessage());
-        assertEquals("parameters", new String[] {"bottle"}, mutable.getParameters());
-        final Message memento = mutable.memento();
-        assertEquals("format", "msg in a {}", memento.getFormat());
-        assertEquals("formatted", "msg in a bottle", memento.getFormattedMessage());
-        assertEquals("parameters", new String[] {"bottle"}, memento.getParameters());
-
-        final Message eventMementoMessage = mutable.createMemento().getMessage();
-        assertEquals("format", "msg in a {}", eventMementoMessage.getFormat());
-        assertEquals("formatted", "msg in a bottle", eventMementoMessage.getFormattedMessage());
-        assertEquals("parameters", new String[] {"bottle"}, eventMementoMessage.getParameters());
-
-        final Message log4JLogEventMessage = new Log4jLogEvent.Builder(mutable).build().getMessage();
-        assertEquals("format", "msg in a {}", log4JLogEventMessage.getFormat());
-        assertEquals("formatted", "msg in a bottle", log4JLogEventMessage.getFormattedMessage());
-        assertEquals("parameters", new String[] {"bottle"}, log4JLogEventMessage.getParameters());
+        assertEquals("msg in a {}", mutable.getFormat(), "format");
+        assertEquals("msg in a bottle", mutable.getFormattedMessage(), "formatted");
+        assertArrayEquals(new String[] {"bottle"}, mutable.getParameters(), "parameters");
+        Message memento = mutable.memento();
+        assertEquals("msg in a {}", memento.getFormat(), "format");
+        assertEquals("msg in a bottle", memento.getFormattedMessage(), "formatted");
+        assertArrayEquals(new String[] {"bottle"}, memento.getParameters(), "parameters");
+
+        Message eventMementoMessage = mutable.createMemento().getMessage();
+        assertEquals("msg in a {}", eventMementoMessage.getFormat(), "format");
+        assertEquals("msg in a bottle", eventMementoMessage.getFormattedMessage(), "formatted");
+        assertArrayEquals(new String[] {"bottle"}, eventMementoMessage.getParameters(), "parameters");
+
+        Message log4JLogEventMessage = new Log4jLogEvent.Builder(mutable).build().getMessage();
+        assertEquals("msg in a {}", log4JLogEventMessage.getFormat(), "format");
+        assertEquals("msg in a bottle", log4JLogEventMessage.getFormattedMessage(), "formatted");
+        assertArrayEquals(new String[] {"bottle"}, log4JLogEventMessage.getParameters(), "parameters");
     }
 
     @Test
@@ -178,13 +177,13 @@ public class MutableLogEventTest {
                 .build();
         final MutableLogEvent mutable = new MutableLogEvent();
         mutable.initFrom(source);
-        assertNull("format", mutable.getFormat());
-        assertEquals("formatted", param.toString(), mutable.getFormattedMessage());
-        assertEquals("parameters", new Object[] {param}, mutable.getParameters());
-        final Message memento = mutable.memento();
-        assertNull("format", memento.getFormat());
-        assertEquals("formatted", param.toString(), memento.getFormattedMessage());
-        assertEquals("parameters", new Object[] {param}, memento.getParameters());
+        assertNull(mutable.getFormat(), "format");
+        assertEquals(param.toString(), mutable.getFormattedMessage(), "formatted");
+        assertArrayEquals(new Object[] {param}, mutable.getParameters(), "parameters");
+        Message memento = mutable.memento();
+        assertNull(memento.getFormat(), "format");
+        assertEquals(param.toString(), memento.getFormattedMessage(), "formatted");
+        assertArrayEquals(new Object[] {param}, memento.getParameters(), "parameters");
     }
 
     @Test
@@ -194,24 +193,24 @@ public class MutableLogEventTest {
         ReusableSimpleMessage simpleMessage = new ReusableSimpleMessage();
         simpleMessage.set("");
         mutable.setMessage(simpleMessage);
-        assertEquals("context data", 0, mutable.getContextData().size());
-        assertNull("context stack", mutable.getContextStack());
-        assertFalse("end of batch", mutable.isEndOfBatch());
-        assertFalse("incl loc", mutable.isIncludeLocation());
-        assertSame("level", Level.OFF, mutable.getLevel());
-        assertNull("fqcn", mutable.getLoggerFqcn());
-        assertNull("logger", mutable.getLoggerName());
-        assertNull("marker", mutable.getMarker());
-        assertEquals("msg", mutable, mutable.getMessage());
-        assertEquals("nanoTm", 0, mutable.getNanoTime());
-        assertEquals("tid", 0, mutable.getThreadId());
-        assertNull("tname", mutable.getThreadName());
-        assertEquals("tpriority", 0, mutable.getThreadPriority());
-        assertNull("thrwn", mutable.getThrown());
-        assertEquals("timeMs", 0, mutable.getTimeMillis());
-
-        assertNull("source", mutable.getSource());
-        assertNull("thrownProxy", mutable.getThrownProxy());
+        assertEquals(0, mutable.getContextData().size(), "context data");
+        assertNull(mutable.getContextStack(), "context stack");
+        assertFalse(mutable.isEndOfBatch(), "end of batch");
+        assertFalse(mutable.isIncludeLocation(), "incl loc");
+        assertSame(Level.OFF, mutable.getLevel(), "level");
+        assertNull(mutable.getLoggerFqcn(), "fqcn");
+        assertNull(mutable.getLoggerName(), "logger");
+        assertNull(mutable.getMarker(), "marker");
+        assertEquals(mutable, mutable.getMessage(), "msg");
+        assertEquals(0, mutable.getNanoTime(), "nanoTm");
+        assertEquals(0, mutable.getThreadId(), "tid");
+        assertNull(mutable.getThreadName(), "tname");
+        assertEquals(0, mutable.getThreadPriority(), "tpriority");
+        assertNull(mutable.getThrown(), "thrwn");
+        assertEquals(0, mutable.getTimeMillis(), "timeMs");
+
+        assertNull(mutable.getSource(), "source");
+        assertNull(mutable.getThrownProxy(), "thrownProxy");
 
         mutable.setContextData(CONTEXT_DATA);
         mutable.setContextStack(STACK);
@@ -229,48 +228,47 @@ public class MutableLogEventTest {
         mutable.setThrown(new Exception());
         mutable.setTimeMillis(56789);
 
-        assertNotNull("context map", mutable.getContextMap());
-        assertNotNull("context stack", mutable.getContextStack());
-        assertTrue("end of batch", mutable.isEndOfBatch());
-        assertTrue("incl loc", mutable.isIncludeLocation());
-        assertNotNull("level", mutable.getLevel());
-        assertNotNull("fqcn", mutable.getLoggerFqcn());
-        assertNotNull("logger", mutable.getLoggerName());
-        assertNotNull("marker", mutable.getMarker());
-        assertEquals("msg", new ParameterizedMessage("message in a {}", "bottle"), mutable.getMessage());
-        assertNotEquals("nanoTm", 0, mutable.getNanoTime());
-        assertNotEquals("tid", 0, mutable.getThreadId());
-        assertNotNull("tname", mutable.getThreadName());
-        assertNotEquals("tpriority", 0, mutable.getThreadPriority());
-        assertNotNull("thrwn", mutable.getThrown());
-        assertNotEquals("timeMs", 0, mutable.getTimeMillis());
-
-        assertNotNull("source", mutable.getSource());
-        assertNotNull("thrownProxy", mutable.getThrownProxy());
+        assertNotNull(mutable.getContextStack(), "context stack");
+        assertTrue(mutable.isEndOfBatch(), "end of batch");
+        assertTrue(mutable.isIncludeLocation(), "incl loc");
+        assertNotNull(mutable.getLevel(), "level");
+        assertNotNull(mutable.getLoggerFqcn(), "fqcn");
+        assertNotNull(mutable.getLoggerName(), "logger");
+        assertNotNull(mutable.getMarker(), "marker");
+        assertEquals(new ParameterizedMessage("message in a {}", "bottle"), mutable.getMessage(), "msg");
+        assertNotEquals(0, mutable.getNanoTime(), "nanoTm");
+        assertNotEquals(0, mutable.getThreadId(), "tid");
+        assertNotNull(mutable.getThreadName(), "tname");
+        assertNotEquals(0, mutable.getThreadPriority(), "tpriority");
+        assertNotNull(mutable.getThrown(), "thrwn");
+        assertNotEquals(0, mutable.getTimeMillis(), "timeMs");
+
+        assertNotNull(mutable.getSource(), "source");
+        assertNotNull(mutable.getThrownProxy(), "thrownProxy");
 
         mutable.clear();
-        assertEquals("context map", 0, mutable.getContextData().size());
-        assertNull("context stack", mutable.getContextStack());
-        assertSame("level", Level.OFF, mutable.getLevel());
-        assertNull("fqcn", mutable.getLoggerFqcn());
-        assertNull("logger", mutable.getLoggerName());
-        assertNull("marker", mutable.getMarker());
-        assertEquals("msg", mutable, mutable.getMessage());
-        assertNull("thrwn", mutable.getThrown());
-
-        assertNull("source", mutable.getSource());
-        assertNull("thrownProxy", mutable.getThrownProxy());
+        assertEquals(0, mutable.getContextData().size(), "context map");
+        assertNull(mutable.getContextStack(), "context stack");
+        assertSame(Level.OFF, mutable.getLevel(), "level");
+        assertNull(mutable.getLoggerFqcn(), "fqcn");
+        assertNull(mutable.getLoggerName(), "logger");
+        assertNull(mutable.getMarker(), "marker");
+        assertEquals(mutable, mutable.getMessage(), "msg");
+        assertNull(mutable.getThrown(), "thrwn");
+
+        assertNull(mutable.getSource(), "source");
+        assertNull(mutable.getThrownProxy(), "thrownProxy");
 
         // primitive fields are NOT reset:
-        assertTrue("end of batch", mutable.isEndOfBatch());
-        assertTrue("incl loc", mutable.isIncludeLocation());
-        assertNotEquals("nanoTm", 0, mutable.getNanoTime());
-        assertNotEquals("timeMs", 0, mutable.getTimeMillis());
+        assertTrue(mutable.isEndOfBatch(), "end of batch");
+        assertTrue(mutable.isIncludeLocation(), "incl loc");
+        assertNotEquals(0, mutable.getNanoTime(), "nanoTm");
+        assertNotEquals(0, mutable.getTimeMillis(), "timeMs");
 
         // thread-local fields are NOT reset:
-        assertNotEquals("tid", 0, mutable.getThreadId());
-        assertNotNull("tname", mutable.getThreadName());
-        assertNotEquals("tpriority", 0, mutable.getThreadPriority());
+        assertNotEquals(0, mutable.getThreadId(), "tid");
+        assertNotNull(mutable.getThreadName(), "tname");
+        assertNotEquals(0, mutable.getThreadPriority(), "tpriority");
     }
 
     @Test
@@ -318,7 +316,6 @@ public class MutableLogEventTest {
 
     @Test
     public void testJavaIoSerializableWithThrown() throws Exception {
-        new InternalError("test error");
         final MutableLogEvent evt = new MutableLogEvent();
         evt.setContextData(CONTEXT_DATA);
         evt.setContextStack(STACK);
@@ -378,4 +375,4 @@ public class MutableLogEventTest {
     }
 
 
-}
\ No newline at end of file
+}
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/impl/ReusableLogEventFactoryTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/impl/ReusableLogEventFactoryTest.java
index cb9eea3..91bbf02 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/impl/ReusableLogEventFactoryTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/impl/ReusableLogEventFactoryTest.java
@@ -20,9 +20,9 @@ import org.apache.logging.log4j.Level;
 import org.apache.logging.log4j.core.LogEvent;
 import org.apache.logging.log4j.message.Message;
 import org.apache.logging.log4j.message.SimpleMessage;
-import org.junit.Test;
+import org.junit.jupiter.api.Test;
 
-import static org.junit.Assert.*;
+import static org.junit.jupiter.api.Assertions.*;
 
 /**
  * Tests the ReusableLogEventFactory class.
@@ -57,20 +57,20 @@ public class ReusableLogEventFactoryTest {
     public void testCreateEventOverwritesFields() throws Exception {
         final ReusableLogEventFactory factory = new ReusableLogEventFactory();
         final LogEvent event1 = callCreateEvent(factory, "a", Level.DEBUG, new SimpleMessage("abc"), null);
-        assertEquals("logger", "a", event1.getLoggerName());
-        assertEquals("level", Level.DEBUG, event1.getLevel());
-        assertEquals("msg", new SimpleMessage("abc"), event1.getMessage());
+        assertEquals("a", event1.getLoggerName(), "logger");
+        assertEquals(Level.DEBUG, event1.getLevel(), "level");
+        assertEquals(new SimpleMessage("abc"), event1.getMessage(), "msg");
 
         ReusableLogEventFactory.release(event1);
         final LogEvent event2 = callCreateEvent(factory, "b", Level.INFO, new SimpleMessage("xyz"), null);
         assertSame(event1, event2);
 
-        assertEquals("logger", "b", event1.getLoggerName());
-        assertEquals("level", Level.INFO, event1.getLevel());
-        assertEquals("msg", new SimpleMessage("xyz"), event1.getMessage());
-        assertEquals("logger", "b", event2.getLoggerName());
-        assertEquals("level", Level.INFO, event2.getLevel());
-        assertEquals("msg", new SimpleMessage("xyz"), event2.getMessage());
+        assertEquals("b", event1.getLoggerName(), "logger");
+        assertEquals(Level.INFO, event1.getLevel(), "level");
+        assertEquals(new SimpleMessage("xyz"), event1.getMessage(), "msg");
+        assertEquals("b", event2.getLoggerName(), "logger");
+        assertEquals(Level.INFO, event2.getLevel(), "level");
+        assertEquals(new SimpleMessage("xyz"), event2.getMessage(), "msg");
     }
 
     private LogEvent callCreateEvent(final ReusableLogEventFactory factory, final String logger, final Level level,
@@ -102,17 +102,17 @@ public class ReusableLogEventFactoryTest {
         assertNotNull(event1[0]);
         assertNotNull(event2[0]);
         assertNotSame(event1[0], event2[0]);
-        assertEquals("logger", "a", event1[0].getLoggerName());
-        assertEquals("level", Level.DEBUG, event1[0].getLevel());
-        assertEquals("msg", new SimpleMessage("abc"), event1[0].getMessage());
-        assertEquals("thread name", "THREAD 1", event1[0].getThreadName());
-        assertEquals("tid", t1.getId(), event1[0].getThreadId());
+        assertEquals("a", event1[0].getLoggerName(), "logger");
+        assertEquals(Level.DEBUG, event1[0].getLevel(), "level");
+        assertEquals(new SimpleMessage("abc"), event1[0].getMessage(), "msg");
+        assertEquals("THREAD 1", event1[0].getThreadName(), "thread name");
+        assertEquals(t1.getId(), event1[0].getThreadId(), "tid");
 
-        assertEquals("logger", "b", event2[0].getLoggerName());
-        assertEquals("level", Level.INFO, event2[0].getLevel());
-        assertEquals("msg", new SimpleMessage("xyz"), event2[0].getMessage());
-        assertEquals("thread name", "Thread 2", event2[0].getThreadName());
-        assertEquals("tid", t2.getId(), event2[0].getThreadId());
+        assertEquals("b", event2[0].getLoggerName(), "logger");
+        assertEquals(Level.INFO, event2[0].getLevel(), "level");
+        assertEquals(new SimpleMessage("xyz"), event2[0].getMessage(), "msg");
+        assertEquals("Thread 2", event2[0].getThreadName(), "thread name");
+        assertEquals(t2.getId(), event2[0].getThreadId(), "tid");
         ReusableLogEventFactory.release(event1[0]);
         ReusableLogEventFactory.release(event2[0]);
     }
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/impl/ThrowableFormatOptionsTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/impl/ThrowableFormatOptionsTest.java
index be2fd7f..4b0a55a 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/impl/ThrowableFormatOptionsTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/impl/ThrowableFormatOptionsTest.java
@@ -16,10 +16,8 @@
  */
 package org.apache.logging.log4j.core.impl;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-
 import java.util.Arrays;
+import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 
@@ -27,8 +25,9 @@ import org.apache.logging.log4j.core.pattern.JAnsiTextRenderer;
 import org.apache.logging.log4j.core.pattern.TextRenderer;
 import org.apache.logging.log4j.util.Strings;
 import org.fusesource.jansi.AnsiRenderer.Code;
-import org.junit.Assert;
-import org.junit.Test;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.*;
 
 /**
  * Unit tests for {@code ThrowableFormatOptions}.
@@ -50,15 +49,15 @@ public final class ThrowableFormatOptionsTest {
     private static ThrowableFormatOptions test(final String[] options, final int expectedLines,
             final String expectedSeparator, final List<String> expectedPackages) {
         final ThrowableFormatOptions tfo = ThrowableFormatOptions.newInstance(options);
-        assertEquals("getLines", expectedLines, tfo.getLines());
-        assertEquals("getSeparator", expectedSeparator, tfo.getSeparator());
-        assertEquals("getPackages", expectedPackages, tfo.getIgnorePackages());
-        assertEquals("allLines", expectedLines == Integer.MAX_VALUE, tfo.allLines());
-        assertEquals("anyLines", expectedLines != 0, tfo.anyLines());
-        assertEquals("minLines", 0, tfo.minLines(0));
-        assertEquals("minLines", expectedLines, tfo.minLines(Integer.MAX_VALUE));
-        assertEquals("hasPackages", expectedPackages != null && !expectedPackages.isEmpty(), tfo.hasPackages());
-        assertNotNull("toString", tfo.toString());
+        assertEquals(expectedLines, tfo.getLines(), "getLines");
+        assertEquals(expectedSeparator, tfo.getSeparator(), "getSeparator");
+        assertEquals(expectedPackages, tfo.getIgnorePackages(), "getPackages");
+        assertEquals(expectedLines == Integer.MAX_VALUE, tfo.allLines(), "allLines");
+        assertEquals(expectedLines != 0, tfo.anyLines(), "anyLines");
+        assertEquals(0, tfo.minLines(0), "minLines");
+        assertEquals(expectedLines, tfo.minLines(Integer.MAX_VALUE), "minLines");
+        assertEquals(expectedPackages != null && !expectedPackages.isEmpty(), tfo.hasPackages(), "hasPackages");
+        assertNotNull(tfo.toString(), "toString");
         return tfo;
     }
 
@@ -124,13 +123,13 @@ public final class ThrowableFormatOptionsTest {
 
     private void testFullAnsiEmptyConfig(final ThrowableFormatOptions tfo) {
         final TextRenderer textRenderer = tfo.getTextRenderer();
-        Assert.assertNotNull(textRenderer);
-        Assert.assertTrue(textRenderer instanceof JAnsiTextRenderer);
+        assertNotNull(textRenderer);
+        assertTrue(textRenderer instanceof JAnsiTextRenderer);
         final JAnsiTextRenderer jansiRenderer = (JAnsiTextRenderer) textRenderer;
         final Map<String, Code[]> styleMap = jansiRenderer.getStyleMap();
         // We have defaults
-        Assert.assertFalse(styleMap.isEmpty());
-        Assert.assertNotNull(styleMap.get("Name"));
+        assertFalse(styleMap.isEmpty());
+        assertNotNull(styleMap.get("Name"));
     }
 
     /**
@@ -141,11 +140,11 @@ public final class ThrowableFormatOptionsTest {
         final ThrowableFormatOptions tfo = test(new String[] { "full", "ansi(Warning=red)" },
                 Integer.MAX_VALUE, Strings.LINE_SEPARATOR, null);
         final TextRenderer textRenderer = tfo.getTextRenderer();
-        Assert.assertNotNull(textRenderer);
-        Assert.assertTrue(textRenderer instanceof JAnsiTextRenderer);
+        assertNotNull(textRenderer);
+        assertTrue(textRenderer instanceof JAnsiTextRenderer);
         final JAnsiTextRenderer jansiRenderer = (JAnsiTextRenderer) textRenderer;
         final Map<String, Code[]> styleMap = jansiRenderer.getStyleMap();
-        Assert.assertArrayEquals(new Code[] { Code.RED }, styleMap.get("Warning"));
+        assertArrayEquals(new Code[] { Code.RED }, styleMap.get("Warning"));
     }
 
     /**
@@ -156,13 +155,13 @@ public final class ThrowableFormatOptionsTest {
         final ThrowableFormatOptions tfo = test(new String[] { "full", "ansi(Warning=red Key=blue Value=cyan)" },
                 Integer.MAX_VALUE, Strings.LINE_SEPARATOR, null);
         final TextRenderer textRenderer = tfo.getTextRenderer();
-        Assert.assertNotNull(textRenderer);
-        Assert.assertTrue(textRenderer instanceof JAnsiTextRenderer);
+        assertNotNull(textRenderer);
+        assertTrue(textRenderer instanceof JAnsiTextRenderer);
         final JAnsiTextRenderer jansiRenderer = (JAnsiTextRenderer) textRenderer;
         final Map<String, Code[]> styleMap = jansiRenderer.getStyleMap();
-        Assert.assertArrayEquals(new Code[] { Code.RED }, styleMap.get("Warning"));
-        Assert.assertArrayEquals(new Code[] { Code.BLUE }, styleMap.get("Key"));
-        Assert.assertArrayEquals(new Code[] { Code.CYAN }, styleMap.get("Value"));
+        assertArrayEquals(new Code[] { Code.RED }, styleMap.get("Warning"));
+        assertArrayEquals(new Code[] { Code.BLUE }, styleMap.get("Key"));
+        assertArrayEquals(new Code[] { Code.CYAN }, styleMap.get("Value"));
     }
 
     /**
@@ -174,13 +173,13 @@ public final class ThrowableFormatOptionsTest {
                 new String[] { "full", "ansi(Warning=red Key=blue,bg_red Value=cyan,bg_black,underline)" }, Integer.MAX_VALUE,
                 Strings.LINE_SEPARATOR, null);
         final TextRenderer textRenderer = tfo.getTextRenderer();
-        Assert.assertNotNull(textRenderer);
-        Assert.assertTrue(textRenderer instanceof JAnsiTextRenderer);
+        assertNotNull(textRenderer);
+        assertTrue(textRenderer instanceof JAnsiTextRenderer);
         final JAnsiTextRenderer jansiRenderer = (JAnsiTextRenderer) textRenderer;
         final Map<String, Code[]> styleMap = jansiRenderer.getStyleMap();
-        Assert.assertArrayEquals(new Code[] { Code.RED }, styleMap.get("Warning"));
-        Assert.assertArrayEquals(new Code[] { Code.BLUE, Code.BG_RED }, styleMap.get("Key"));
-        Assert.assertArrayEquals(new Code[] { Code.CYAN, Code.BG_BLACK, Code.UNDERLINE }, styleMap.get("Value"));
+        assertArrayEquals(new Code[] { Code.RED }, styleMap.get("Warning"));
+        assertArrayEquals(new Code[] { Code.BLUE, Code.BG_RED }, styleMap.get("Key"));
+        assertArrayEquals(new Code[] { Code.CYAN, Code.BG_BLACK, Code.UNDERLINE }, styleMap.get("Value"));
     }
 
     /**
@@ -253,7 +252,8 @@ public final class ThrowableFormatOptionsTest {
      */
     @Test
     public void testFullAndFiltersAndSeparator() {
-        test(new String[] { "full", "filters(org.junit)", "separator(|)" }, Integer.MAX_VALUE, "|", Arrays.asList("org.junit"));
+        test(new String[] { "full", "filters(org.junit)", "separator(|)" }, Integer.MAX_VALUE, "|",
+                Collections.singletonList("org.junit"));
     }
 
     /**
@@ -286,7 +286,7 @@ public final class ThrowableFormatOptionsTest {
     @Test
     public void testFilters() {
         test(new String[] { "filters(packages)" }, Integer.MAX_VALUE, Strings.LINE_SEPARATOR,
-                Arrays.asList("packages"));
+                Collections.singletonList("packages"));
     }
 
     /**
@@ -312,7 +312,7 @@ public final class ThrowableFormatOptionsTest {
     @Test
     public void testFullAndFilters() {
         test(new String[] { "full", "filters(packages)" }, Integer.MAX_VALUE, Strings.LINE_SEPARATOR,
-                Arrays.asList("packages"));
+                Collections.singletonList("packages"));
     }
 
     /**
@@ -320,7 +320,7 @@ public final class ThrowableFormatOptionsTest {
      */
     @Test
     public void testNoneAndFilters() {
-        test(new String[] { "none", "filters(packages)" }, 0, Strings.LINE_SEPARATOR, Arrays.asList("packages"));
+        test(new String[] { "none", "filters(packages)" }, 0, Strings.LINE_SEPARATOR, Collections.singletonList("packages"));
     }
 
     /**
@@ -328,7 +328,7 @@ public final class ThrowableFormatOptionsTest {
      */
     @Test
     public void testShortAndFilters() {
-        test(new String[] { "short", "filters(packages)" }, 2, Strings.LINE_SEPARATOR, Arrays.asList("packages"));
+        test(new String[] { "short", "filters(packages)" }, 2, Strings.LINE_SEPARATOR, Collections.singletonList("packages"));
     }
 
     /**
@@ -336,7 +336,7 @@ public final class ThrowableFormatOptionsTest {
      */
     @Test
     public void testDepthAndFilters() {
-        test(new String[] { "10", "filters(packages)" }, 10, Strings.LINE_SEPARATOR, Arrays.asList("packages"));
+        test(new String[] { "10", "filters(packages)" }, 10, Strings.LINE_SEPARATOR, Collections.singletonList("packages"));
     }
 
     /**
@@ -345,7 +345,7 @@ public final class ThrowableFormatOptionsTest {
     @Test
     public void testFullAndSeparatorAndFilter() {
         test(new String[] { "full", "separator(|)", "filters(packages)" }, Integer.MAX_VALUE, "|",
-                Arrays.asList("packages"));
+                Collections.singletonList("packages"));
     }
 
     /**
@@ -362,7 +362,7 @@ public final class ThrowableFormatOptionsTest {
      */
     @Test
     public void testNoneAndSeparatorAndFilters() {
-        test(new String[] { "none", "separator(|)", "filters(packages)" }, 0, "|", Arrays.asList("packages"));
+        test(new String[] { "none", "separator(|)", "filters(packages)" }, 0, "|", Collections.singletonList("packages"));
     }
 
     /**
@@ -370,7 +370,7 @@ public final class ThrowableFormatOptionsTest {
      */
     @Test
     public void testShortAndSeparatorAndFilters() {
-        test(new String[] { "short", "separator(|)", "filters(packages)" }, 2, "|", Arrays.asList("packages"));
+        test(new String[] { "short", "separator(|)", "filters(packages)" }, 2, "|", Collections.singletonList("packages"));
     }
 
     /**
@@ -378,7 +378,7 @@ public final class ThrowableFormatOptionsTest {
      */
     @Test
     public void testDepthAndSeparatorAndFilters() {
-        test(new String[] { "10", "separator(|)", "filters(packages)" }, 10, "|", Arrays.asList("packages"));
+        test(new String[] { "10", "separator(|)", "filters(packages)" }, 10, "|", Collections.singletonList("packages"));
     }
 
     /**
@@ -387,7 +387,7 @@ public final class ThrowableFormatOptionsTest {
     @Test
     public void testSingleOptionFullAndFilters() {
         test(new String[] { "full,filters(packages)" }, Integer.MAX_VALUE, Strings.LINE_SEPARATOR,
-                Arrays.asList("packages"));
+                Collections.singletonList("packages"));
     }
 
     /**
@@ -395,7 +395,7 @@ public final class ThrowableFormatOptionsTest {
      */
     @Test
     public void testSingleOptionNoneAndFilters() {
-        test(new String[] { "none,filters(packages)" }, 0, Strings.LINE_SEPARATOR, Arrays.asList("packages"));
+        test(new String[] { "none,filters(packages)" }, 0, Strings.LINE_SEPARATOR, Collections.singletonList("packages"));
     }
 
     /**
@@ -403,7 +403,7 @@ public final class ThrowableFormatOptionsTest {
      */
     @Test
     public void testSingleOptionShortAndFilters() {
-        test(new String[] { "short,filters(packages)" }, 2, Strings.LINE_SEPARATOR, Arrays.asList("packages"));
+        test(new String[] { "short,filters(packages)" }, 2, Strings.LINE_SEPARATOR, Collections.singletonList("packages"));
     }
 
     /**
@@ -411,7 +411,7 @@ public final class ThrowableFormatOptionsTest {
      */
     @Test
     public void testSingleOptionDepthAndFilters() {
-        test(new String[] { "10,filters(packages)" }, 10, Strings.LINE_SEPARATOR, Arrays.asList("packages"));
+        test(new String[] { "10,filters(packages)" }, 10, Strings.LINE_SEPARATOR, Collections.singletonList("packages"));
     }
 
     /**
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/impl/ThrowableProxyTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/impl/ThrowableProxyTest.java
index f6268d4..a7b8381 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/impl/ThrowableProxyTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/impl/ThrowableProxyTest.java
@@ -16,12 +16,6 @@
  */
 package org.apache.logging.log4j.core.impl;
 
-import static org.junit.Assert.assertArrayEquals;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
@@ -49,7 +43,12 @@ import org.apache.logging.log4j.core.jackson.Log4jJsonObjectMapper;
 import org.apache.logging.log4j.core.jackson.Log4jXmlObjectMapper;
 import org.apache.logging.log4j.core.pattern.PlainTextRenderer;
 import org.apache.logging.log4j.util.Strings;
-import org.junit.Test;
+import org.junit.jupiter.api.Test;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+import static org.junit.jupiter.api.Assertions.*;
 
 /**
  *
@@ -129,26 +128,21 @@ public class ThrowableProxyTest {
      */
     @Test
     public void testLogStackTraceWithClassThatCannotInitialize() {
-        try {
-            // Try to create the object, which will always fail during class initialization
-            final AlwaysThrowsError error = new AlwaysThrowsError();
+        final Error e = assertThrows(Error.class, AlwaysThrowsError::new);
+        // Print the stack trace to System.out for informational purposes
+        // System.err.println("### Here's the stack trace that we'll log with log4j ###");
+        // e.printStackTrace();
+        // System.err.println("### End stack trace ###");
 
-            // If the error was not triggered then fail
-            fail("Test did not throw expected error: " + error);
-        } catch (final Throwable e) {
-            // Print the stack trace to System.out for informational purposes
-            // System.err.println("### Here's the stack trace that we'll log with log4j ###");
-            // e.printStackTrace();
-            // System.err.println("### End stack trace ###");
-
-            final Logger logger = LogManager.getLogger(getClass());
+        final Logger logger = LogManager.getLogger(getClass());
 
+        assertDoesNotThrow(() -> {
             // This is the critical portion of the test. The log message must be printed without
             // throwing a java.lang.Error when introspecting the AlwaysThrowError class in the
             // stack trace.
             logger.error(e.getMessage(), e);
             logger.error(e);
-        }
+        });
     }
 
     @Test
@@ -167,11 +161,11 @@ public class ThrowableProxyTest {
                             }
                         }
                     });
-            ServerSocketChannel.open().socket().bind(new InetSocketAddress("localhost", 9300));
-            ServerSocketChannel.open().socket().bind(new InetSocketAddress("localhost", 9300));
-            fail("expected a java.net.BindException");
-        } catch (final BindException e) {
-            new ThrowableProxy(e);
+            final BindException e = assertThrows(BindException.class, () -> {
+                ServerSocketChannel.open().socket().bind(new InetSocketAddress("localhost", 9300));
+                ServerSocketChannel.open().socket().bind(new InetSocketAddress("localhost", 9300));
+            });
+            assertDoesNotThrow(() -> new ThrowableProxy(e));
         } finally {
             // restore the security manager
             System.setSecurityManager(sm);
@@ -207,10 +201,8 @@ public class ThrowableProxyTest {
             final byte[] encrypted = ec.doFinal(raw);
             final Cipher dc = Cipher.getInstance(algorithm);
             dc.init(Cipher.DECRYPT_MODE, generator.generateKey(), algorithmParameterSpec, secureRandom);
-            dc.doFinal(encrypted);
-            fail("expected a javax.crypto.BadPaddingException");
-        } catch (final BadPaddingException e) {
-            new ThrowableProxy(e);
+            final BadPaddingException e = assertThrows(BadPaddingException.class, () -> dc.doFinal(encrypted));
+            assertDoesNotThrow(() -> new ThrowableProxy(e));
         } finally {
             // restore the existing security manager
             System.setSecurityManager(sm);
@@ -308,7 +300,7 @@ public class ThrowableProxyTest {
         final String separator = " | ";
         final String extendedStackTraceAsString = proxy.getExtendedStackTraceAsString(null,
                 PlainTextRenderer.getInstance(), " | ", Strings.EMPTY);
-        assertTrue(extendedStackTraceAsString, allLinesContain(extendedStackTraceAsString, separator));
+        assertTrue(allLinesContain(extendedStackTraceAsString, separator), extendedStackTraceAsString);
     }
 
     @Test
@@ -318,7 +310,7 @@ public class ThrowableProxyTest {
 
         final String suffix = "some suffix";
         final String extendedStackTraceAsString = proxy.getExtendedStackTraceAsString(suffix);
-        assertTrue(extendedStackTraceAsString, lastLineContains(extendedStackTraceAsString, suffix));
+        assertTrue(lastLineContains(extendedStackTraceAsString, suffix), extendedStackTraceAsString);
     }
 
     @Test
@@ -378,7 +370,7 @@ public class ThrowableProxyTest {
         final ThrowableProxy proxy = new ThrowableProxy(throwable);
         final ExtendedStackTraceElement[] callerPackageData = ThrowableProxyHelper.toExtendedStackTrace(proxy, stack, map, null,
                 throwable.getStackTrace());
-        assertNotNull("No package data returned", callerPackageData);
+        assertNotNull(callerPackageData, "No package data returned");
     }
 
     /**