NIFI-9080 Converted nifi-commons to use JUnit 5

This closes #5332

Signed-off-by: David Handermann <exceptionfactory@apache.org>
diff --git a/nifi-commons/nifi-bootstrap-utils/src/test/java/org/apache/nifi/bootstrap/util/OSUtilsTest.java b/nifi-commons/nifi-bootstrap-utils/src/test/java/org/apache/nifi/bootstrap/util/OSUtilsTest.java
index 5a8abe9..bfe85c3 100644
--- a/nifi-commons/nifi-bootstrap-utils/src/test/java/org/apache/nifi/bootstrap/util/OSUtilsTest.java
+++ b/nifi-commons/nifi-bootstrap-utils/src/test/java/org/apache/nifi/bootstrap/util/OSUtilsTest.java
@@ -16,14 +16,14 @@
  */
 package org.apache.nifi.bootstrap.util;
 
-import org.junit.Test;
+import org.junit.jupiter.api.Test;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import java.io.IOException;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
 
 public class OSUtilsTest {
 
@@ -34,7 +34,7 @@
         final Logger logger = LoggerFactory.getLogger("testing");
         final Long pid = OSUtils.getProcessId(process, logger);
         process.destroy();
-        assertNotNull("Process ID not found", pid);
+        assertNotNull(pid, "Process ID not found");
     }
 
     @Test
diff --git a/nifi-commons/nifi-expression-language/src/test/groovy/org/apache/nifi/attribute/expression/language/QueryGroovyTest.groovy b/nifi-commons/nifi-expression-language/src/test/groovy/org/apache/nifi/attribute/expression/language/QueryGroovyTest.groovy
index 78de467..de80f78 100644
--- a/nifi-commons/nifi-expression-language/src/test/groovy/org/apache/nifi/attribute/expression/language/QueryGroovyTest.groovy
+++ b/nifi-commons/nifi-expression-language/src/test/groovy/org/apache/nifi/attribute/expression/language/QueryGroovyTest.groovy
@@ -18,39 +18,36 @@
 
 import org.apache.nifi.attribute.expression.language.evaluation.QueryResult
 import org.apache.nifi.expression.AttributeExpression
-import org.junit.After
-import org.junit.Before
-import org.junit.BeforeClass
-import org.junit.Test
-import org.junit.runner.RunWith
-import org.junit.runners.JUnit4
+import org.junit.jupiter.api.AfterEach
+import org.junit.jupiter.api.BeforeAll
+import org.junit.jupiter.api.BeforeEach
+import org.junit.jupiter.api.Test
 import org.slf4j.Logger
 import org.slf4j.LoggerFactory
 
-@RunWith(JUnit4.class)
-public class QueryGroovyTest extends GroovyTestCase {
+class QueryGroovyTest extends GroovyTestCase {
     private static final Logger logger = LoggerFactory.getLogger(QueryGroovyTest.class)
 
-    @BeforeClass
-    public static void setUpOnce() throws Exception {
+    @BeforeAll
+    static void setUpOnce() throws Exception {
         logger.metaClass.methodMissing = { String name, args ->
             logger.info("[${name?.toUpperCase()}] ${(args as List).join(" ")}")
         }
     }
 
-    @Before
-    public void setUp() {
+    @BeforeEach
+    void setUp() {
 
     }
 
-    @After
-    public void tearDown() {
+    @AfterEach
+    void tearDown() {
         Query.metaClass.static = null
 
     }
 
     @Test
-    public void testReplaceShouldReplaceAllLiteralMatches() {
+    void testReplaceShouldReplaceAllLiteralMatches() {
         // Arrange
         int n = 3
         final String ORIGINAL_VALUE = "Hello World"
@@ -90,7 +87,7 @@
     }
 
     @Test
-    public void testReplaceFirstShouldOnlyReplaceFirstRegexMatch() {
+    void testReplaceFirstShouldOnlyReplaceFirstRegexMatch() {
         // Arrange
         int n = 3
         final String ORIGINAL_VALUE = "Hello World"
@@ -130,7 +127,7 @@
     }
 
     @Test
-    public void testReplaceFirstShouldOnlyReplaceFirstLiteralMatch() {
+    void testReplaceFirstShouldOnlyReplaceFirstLiteralMatch() {
         // Arrange
         int n = 3
         final String ORIGINAL_VALUE = "Hello World"
@@ -170,7 +167,7 @@
     }
 
     @Test
-    public void testShouldDemonstrateDifferenceBetweenStringReplaceAndStringReplaceFirst() {
+    void testShouldDemonstrateDifferenceBetweenStringReplaceAndStringReplaceFirst() {
         // Arrange
         int n = 3
         final String ORIGINAL_VALUE = "Hello World"
diff --git a/nifi-commons/nifi-expression-language/src/test/java/org/apache/nifi/attribute/expression/language/TestQuery.java b/nifi-commons/nifi-expression-language/src/test/java/org/apache/nifi/attribute/expression/language/TestQuery.java
index 1c38a9b..5ff24b7 100644
--- a/nifi-commons/nifi-expression-language/src/test/java/org/apache/nifi/attribute/expression/language/TestQuery.java
+++ b/nifi-commons/nifi-expression-language/src/test/java/org/apache/nifi/attribute/expression/language/TestQuery.java
@@ -29,9 +29,8 @@
 import org.apache.nifi.parameter.ParameterDescriptor;
 import org.apache.nifi.parameter.ParameterLookup;
 import org.apache.nifi.registry.VariableRegistry;
-import org.junit.Assert;
-import org.junit.Ignore;
-import org.junit.Test;
+import org.junit.jupiter.api.Disabled;
+import org.junit.jupiter.api.Test;
 import org.mockito.Mockito;
 
 import java.io.BufferedInputStream;
@@ -55,10 +54,11 @@
 import static java.lang.Double.POSITIVE_INFINITY;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.greaterThan;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
+import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
 public class TestQuery {
 
@@ -138,20 +138,11 @@
     }
 
     private void assertValid(final String query) {
-        try {
-            Query.compile(query);
-        } catch (final Exception e) {
-            e.printStackTrace();
-            Assert.fail("Expected query to be valid, but it failed to compile due to " + e);
-        }
+        assertDoesNotThrow(() -> Query.compile(query));
     }
 
     private void assertInvalid(final String query) {
-        try {
-            Query.compile(query);
-            Assert.fail("Expected query to be invalid, but it did compile");
-        } catch (final Exception e) {
-        }
+        assertThrows(Exception.class, () -> Query.compile(query));
     }
 
     @Test
@@ -159,11 +150,7 @@
         Query.validateExpression("${abc:substring(${xyz:length()})}", false);
         Query.isValidExpression("${now():format('yyyy-MM-dd')}");
 
-        try {
-            Query.validateExpression("$${attr}", false);
-            Assert.fail("invalid query validated");
-        } catch (final AttributeExpressionLanguageParsingException e) {
-        }
+        assertThrows(AttributeExpressionLanguageParsingException.class, () -> Query.validateExpression("$${attr}", false));
 
         Query.validateExpression("$${attr}", true);
 
@@ -311,7 +298,7 @@
     }
 
     @Test
-    @Ignore("Requires specific locale")
+    @Disabled("Requires specific locale")
     public void implicitDateConversion() {
         final Date date = new Date();
         final Query query = Query.compile("${dateTime:format('yyyy/MM/dd HH:mm:ss.SSS')}");
@@ -376,22 +363,15 @@
             ADDRESS_BOOK_JSON_PATH_EMPTY,
             "", "${json:jsonPathDelete('$.missingpath')}", "");
         verifyEquals("${json:jsonPath('$.missingpath')}", attributes, "");
-        try {
-            verifyEquals("${json:jsonPath('$..')}", attributes, "");
-            Assert.fail("Did not detect bad JSON path expression");
-        } catch (final AttributeExpressionLanguageException e) {
-        }
-        try {
-            verifyEquals("${missing:jsonPath('$.firstName')}", attributes, "");
-            Assert.fail("Did not detect empty JSON document");
-        } catch (AttributeExpressionLanguageException e) {
-        }
+
+        assertThrows(AttributeExpressionLanguageException.class,
+                () -> verifyEquals("${json:jsonPath('$..')}", attributes, ""));
+        assertThrows(AttributeExpressionLanguageException.class,
+                () -> verifyEquals("${missing:jsonPath('$.firstName')}", attributes, ""));
+
         attributes.put("invalid", "[}");
-        try {
-            verifyEquals("${invlaid:jsonPath('$.firstName')}", attributes, "John");
-            Assert.fail("Did not detect invalid JSON document");
-        } catch (AttributeExpressionLanguageException e) {
-        }
+        assertThrows(AttributeExpressionLanguageException.class,
+                () -> verifyEquals("${invlaid:jsonPath('$.firstName')}", attributes, "John"));
     }
 
     private void verifyAddressBookAttributes(String originalAddressBook, Map<String,String> attributes, String updatedAttribute, Object updatedValue) {
@@ -526,13 +506,12 @@
        verifyEquals("${json:jsonPath('$.missing-path')}", attributes, "");
     }
 
-    @Test(expected=IllegalArgumentException.class)
     public void testJsonPathAddNicknameJimmyAtNonArray() throws IOException {
-        Map<String,String> attributes = verifyJsonPathExpressions(
+        assertThrows(IllegalArgumentException.class, () -> verifyJsonPathExpressions(
                 ADDRESS_BOOK_JSON_PATH_EMPTY,
                 "",
                 "${json:jsonPathAdd('$.firstName', 'Jimmy')}",
-                "");
+                ""));
     }
 
     @Test
@@ -601,9 +580,9 @@
         verifyEquals("${allAttributes( 'x', 'y' ):join(',')}", attributes, ",");
     }
 
-    @Test(expected = AttributeExpressionLanguageException.class)
+    @Test
     public void testCannotCombineWithNonReducingFunction() {
-        Query.compile("${allAttributes( 'a.1' ):plus(1)}");
+        assertThrows(AttributeExpressionLanguageException.class, () -> Query.compile("${allAttributes( 'a.1' ):plus(1)}"));
     }
 
     @Test
@@ -1128,32 +1107,25 @@
         attributes.put("negativeDecimal", "-64.1");
 
         // Test that errors relating to not finding methods are properly handled
-        try {
-            verifyEquals("${math('rand'):toNumber()}", attributes, 0L);
-            fail();
-        } catch (AttributeExpressionLanguageException expected) {
-            assertEquals("Cannot evaluate 'math' function because no subjectless method was found with the name:'rand'", expected.getMessage());
-        }
-        try {
-            verifyEquals("${negativeDecimal:math('absolute')}", attributes, 0L);
-            fail();
-        } catch (AttributeExpressionLanguageException expected) {
-            assertEquals("Cannot evaluate 'math' function because no method was found matching the passed parameters: name:'absolute', one argument of type: 'double'", expected.getMessage());
-        }
-        try {
-            verifyEquals("${oneDecimal:math('power', ${two:toDecimal()})}", attributes, 0L);
-            fail();
-        } catch (AttributeExpressionLanguageException expected) {
-            assertEquals("Cannot evaluate 'math' function because no method was found matching the passed parameters: name:'power', " +
-                    "first argument type: 'double', second argument type:  'double'", expected.getMessage());
-        }
-        try {
-            verifyEquals("${oneDecimal:math('power', ${two})}", attributes, 0L);
-            fail();
-        } catch (AttributeExpressionLanguageException expected) {
-            assertEquals("Cannot evaluate 'math' function because no method was found matching the passed parameters: name:'power', " +
-                    "first argument type: 'double', second argument type:  'long'", expected.getMessage());
-        }
+
+        AttributeExpressionLanguageException expected = assertThrows(AttributeExpressionLanguageException.class,
+                () -> verifyEquals("${math('rand'):toNumber()}", attributes, 0L));
+        assertEquals("Cannot evaluate 'math' function because no subjectless method was found with the name:'rand'", expected.getMessage());
+
+        expected = assertThrows(AttributeExpressionLanguageException.class,
+                () -> verifyEquals("${negativeDecimal:math('absolute')}", attributes, 0L));
+        assertEquals("Cannot evaluate 'math' function because no method was found matching the passed parameters: name:'absolute', one argument of type: 'double'", expected.getMessage());
+
+        expected = assertThrows(AttributeExpressionLanguageException.class,
+                () -> verifyEquals("${oneDecimal:math('power', ${two:toDecimal()})}", attributes, 0L));
+        assertEquals("Cannot evaluate 'math' function because no method was found matching the passed parameters: name:'power', " +
+                "first argument type: 'double', second argument type:  'double'", expected.getMessage());
+
+        expected = assertThrows(AttributeExpressionLanguageException.class,
+                () -> verifyEquals("${oneDecimal:math('power', ${two})}", attributes, 0L));
+        assertEquals("Cannot evaluate 'math' function because no method was found matching the passed parameters: name:'power', " +
+                "first argument type: 'double', second argument type:  'long'", expected.getMessage());
+
 
         // Can only verify that it runs. ToNumber() will verify that it produced a number greater than or equal to 0.0 and less than 1.0
         verifyEquals("${math('random'):toNumber()}", attributes, 0L);
@@ -1363,12 +1335,7 @@
         verifyEquals("${allAttributes('abc', 'xyz'):length():equals(4)}", attributes, true);
         verifyEquals("${allAttributes('abc', 'xyz', 'other'):isNull()}", attributes, false);
 
-        try {
-            Query.compile("${allAttributes('#ah'):equals('hello')");
-            Assert.fail("Was able to compile with allAttributes and an invalid attribute name");
-        } catch (final AttributeExpressionLanguageParsingException e) {
-            // expected behavior
-        }
+        assertThrows(AttributeExpressionLanguageParsingException.class, () -> Query.compile("${allAttributes('#ah'):equals('hello')"));
     }
 
     @Test
@@ -1925,7 +1892,7 @@
         for (int i = 0; i < results.size(); i++) {
             long result = (Long) getResult("${random()}", attrs).getValue();
             assertThat("random", result, greaterThan(negOne));
-            assertEquals("duplicate random", true, results.add(result));
+            assertEquals(true, results.add(result), "duplicate random");
         }
     }
 
@@ -2108,10 +2075,11 @@
         verifyEquals("${nbr_attr:hash('MD5')}", attributes, "d3d9446802a44259755d38e6d163e820");
     }
 
-    @Test(expected = AttributeExpressionLanguageException.class)
+    @Test
     public void testHashFailure() {
         final Map<String, String> attributes = new HashMap<>();
-        verifyEquals("${literal('john'):hash('NOT_A_ALGO')}", attributes, "527bd5b5d689e2c32ae974c6229ff785");
+        assertThrows(AttributeExpressionLanguageException.class,
+                () -> verifyEquals("${literal('john'):hash('NOT_A_ALGO')}", attributes, "527bd5b5d689e2c32ae974c6229ff785"));
     }
 
     @Test
@@ -2177,24 +2145,9 @@
         assertTrue(multipleResultExpectedResults.contains(actualResult));
 
         verifyEquals("${str:repeat(4)}", attributes, "abcabcabcabc");
-        try {
-            verifyEquals("${str:repeat(-1)}", attributes, "");
-            fail("Should have failed on numRepeats < 0");
-        } catch(AttributeExpressionLanguageException aele) {
-            // Do nothing, it is expected
-        }
-        try {
-            verifyEquals("${str:repeat(0)}", attributes, "");
-            fail("Should have failed on numRepeats = 0");
-        } catch(AttributeExpressionLanguageException aele) {
-            // Do nothing, it is expected
-        }
-        try {
-            verifyEquals("${str:repeat(2,1)}", attributes, "");
-            fail("Should have failed on minRepeats > maxRepeats");
-        } catch(AttributeExpressionLanguageException aele) {
-            // Do nothing, it is expected
-        }
+        assertThrows(AttributeExpressionLanguageException.class, () -> verifyEquals("${str:repeat(-1)}", attributes, ""));
+        assertThrows(AttributeExpressionLanguageException.class, () -> verifyEquals("${str:repeat(0)}", attributes, ""));
+        assertThrows(AttributeExpressionLanguageException.class, () -> verifyEquals("${str:repeat(2,1)}", attributes, ""));
     }
 
     @Test
diff --git a/nifi-commons/nifi-expression-language/src/test/java/org/apache/nifi/attribute/expression/language/TestStandardPreparedQuery.java b/nifi-commons/nifi-expression-language/src/test/java/org/apache/nifi/attribute/expression/language/TestStandardPreparedQuery.java
index 34eef46..937f6f6 100644
--- a/nifi-commons/nifi-expression-language/src/test/java/org/apache/nifi/attribute/expression/language/TestStandardPreparedQuery.java
+++ b/nifi-commons/nifi-expression-language/src/test/java/org/apache/nifi/attribute/expression/language/TestStandardPreparedQuery.java
@@ -19,8 +19,8 @@
 import org.apache.nifi.parameter.Parameter;
 import org.apache.nifi.parameter.ParameterDescriptor;
 import org.apache.nifi.parameter.ParameterLookup;
-import org.junit.Ignore;
-import org.junit.Test;
+import org.junit.jupiter.api.Disabled;
+import org.junit.jupiter.api.Test;
 
 import java.util.Collections;
 import java.util.HashMap;
@@ -55,7 +55,7 @@
     }
 
     @Test
-    @Ignore("Intended for manual performance testing; should not be run in an automated environment")
+    @Disabled("Intended for manual performance testing; should not be run in an automated environment")
     public void test10MIterations() {
         final Map<String, String> attrs = new HashMap<>();
         attrs.put("xx", "world");
@@ -70,7 +70,7 @@
     }
 
     @Test
-    @Ignore("Takes too long")
+    @Disabled("Takes too long")
     public void test10MIterationsWithQuery() {
         final Map<String, String> attrs = new HashMap<>();
         attrs.put("xx", "world");
diff --git a/nifi-commons/nifi-expression-language/src/test/java/org/apache/nifi/attribute/expression/language/TestValueLookup.java b/nifi-commons/nifi-expression-language/src/test/java/org/apache/nifi/attribute/expression/language/TestValueLookup.java
index 97935fd..fc4b0b7 100644
--- a/nifi-commons/nifi-expression-language/src/test/java/org/apache/nifi/attribute/expression/language/TestValueLookup.java
+++ b/nifi-commons/nifi-expression-language/src/test/java/org/apache/nifi/attribute/expression/language/TestValueLookup.java
@@ -18,7 +18,7 @@
 
 import org.apache.nifi.flowfile.FlowFile;
 import org.apache.nifi.registry.VariableRegistry;
-import org.junit.Test;
+import org.junit.jupiter.api.Test;
 
 import java.util.HashMap;
 import java.util.Map;
diff --git a/nifi-commons/nifi-flow-encryptor/src/test/java/org/apache/nifi/flow/encryptor/StandardFlowEncryptorTest.java b/nifi-commons/nifi-flow-encryptor/src/test/java/org/apache/nifi/flow/encryptor/StandardFlowEncryptorTest.java
index d9cfd6a..2494a95 100644
--- a/nifi-commons/nifi-flow-encryptor/src/test/java/org/apache/nifi/flow/encryptor/StandardFlowEncryptorTest.java
+++ b/nifi-commons/nifi-flow-encryptor/src/test/java/org/apache/nifi/flow/encryptor/StandardFlowEncryptorTest.java
@@ -19,8 +19,8 @@
 import org.apache.nifi.encrypt.PropertyEncryptor;
 import org.apache.nifi.encrypt.PropertyEncryptorBuilder;
 import org.apache.nifi.security.util.EncryptionMethod;
-import org.junit.Before;
-import org.junit.Test;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
 
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
@@ -49,7 +49,7 @@
 
     private StandardFlowEncryptor flowEncryptor;
 
-    @Before
+    @BeforeEach
     public void setEncryptors() {
         inputEncryptor = getPropertyEncryptor(INPUT_KEY, EncryptionMethod.MD5_256AES.getAlgorithm());
         outputEncryptor = getPropertyEncryptor(OUTPUT_KEY, EncryptionMethod.SHA256_256AES.getAlgorithm());
diff --git a/nifi-commons/nifi-flow-encryptor/src/test/java/org/apache/nifi/flow/encryptor/command/SetSensitivePropertiesKeyTest.java b/nifi-commons/nifi-flow-encryptor/src/test/java/org/apache/nifi/flow/encryptor/command/SetSensitivePropertiesKeyTest.java
index 13f2837..8a2a4d8 100644
--- a/nifi-commons/nifi-flow-encryptor/src/test/java/org/apache/nifi/flow/encryptor/command/SetSensitivePropertiesKeyTest.java
+++ b/nifi-commons/nifi-flow-encryptor/src/test/java/org/apache/nifi/flow/encryptor/command/SetSensitivePropertiesKeyTest.java
@@ -17,8 +17,8 @@
 package org.apache.nifi.flow.encryptor.command;
 
 import org.apache.nifi.stream.io.GZIPOutputStream;
-import org.junit.After;
-import org.junit.Test;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.Test;
 
 import java.io.File;
 import java.io.FileOutputStream;
@@ -39,7 +39,7 @@
 public class SetSensitivePropertiesKeyTest {
     private static final String FLOW_CONTENTS = "<property><value>PROPERTY</value></property>";
 
-    @After
+    @AfterEach
     public void clearProperties() {
         System.clearProperty(SetSensitivePropertiesKey.PROPERTIES_FILE_PATH);
     }
diff --git a/nifi-commons/nifi-flowfile-packager/src/test/java/org/apache/nifi/util/TestPackageUnpackageV3.java b/nifi-commons/nifi-flowfile-packager/src/test/java/org/apache/nifi/util/TestPackageUnpackageV3.java
index 24cd374..6a4d1e4 100644
--- a/nifi-commons/nifi-flowfile-packager/src/test/java/org/apache/nifi/util/TestPackageUnpackageV3.java
+++ b/nifi-commons/nifi-flowfile-packager/src/test/java/org/apache/nifi/util/TestPackageUnpackageV3.java
@@ -16,8 +16,7 @@
  */
 package org.apache.nifi.util;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
+import org.junit.jupiter.api.Test;
 
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
@@ -26,7 +25,8 @@
 import java.util.HashMap;
 import java.util.Map;
 
-import org.junit.Test;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
 
 public class TestPackageUnpackageV3 {
 
diff --git a/nifi-commons/nifi-hl7-query-language/src/test/java/org/apache/nifi/hl7/query/TestHL7Query.java b/nifi-commons/nifi-hl7-query-language/src/test/java/org/apache/nifi/hl7/query/TestHL7Query.java
index 0e875c0..cc71d7c 100644
--- a/nifi-commons/nifi-hl7-query-language/src/test/java/org/apache/nifi/hl7/query/TestHL7Query.java
+++ b/nifi-commons/nifi-hl7-query-language/src/test/java/org/apache/nifi/hl7/query/TestHL7Query.java
@@ -16,9 +16,17 @@
  */
 package org.apache.nifi.hl7.query;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
+import ca.uhn.hl7v2.DefaultHapiContext;
+import ca.uhn.hl7v2.HL7Exception;
+import ca.uhn.hl7v2.HapiContext;
+import ca.uhn.hl7v2.model.Message;
+import ca.uhn.hl7v2.parser.PipeParser;
+import ca.uhn.hl7v2.validation.impl.ValidationContextFactory;
+import org.apache.nifi.hl7.hapi.HapiMessage;
+import org.apache.nifi.hl7.model.HL7Field;
+import org.apache.nifi.hl7.model.HL7Message;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
 
 import java.io.IOException;
 import java.util.ArrayList;
@@ -26,18 +34,9 @@
 import java.util.List;
 import java.util.Map;
 
-import org.apache.nifi.hl7.hapi.HapiMessage;
-import org.apache.nifi.hl7.model.HL7Field;
-import org.apache.nifi.hl7.model.HL7Message;
-import org.junit.Before;
-import org.junit.Test;
-
-import ca.uhn.hl7v2.DefaultHapiContext;
-import ca.uhn.hl7v2.HL7Exception;
-import ca.uhn.hl7v2.HapiContext;
-import ca.uhn.hl7v2.model.Message;
-import ca.uhn.hl7v2.parser.PipeParser;
-import ca.uhn.hl7v2.validation.impl.ValidationContextFactory;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
 
 @SuppressWarnings("resource")
 public class TestHL7Query {
@@ -60,7 +59,7 @@
 
     private HL7Message hypoglycemia;
 
-    @Before
+    @BeforeEach
     public void init() throws IOException, HL7Exception {
         this.hyperglycemia = createMessage(HYPERGLYCEMIA);
         this.hypoglycemia = createMessage(HYPOGLYCEMIA);
diff --git a/nifi-commons/nifi-json-utils/src/test/groovy/org/apache/nifi/processor/TestStandardValidators.groovy b/nifi-commons/nifi-json-utils/src/test/groovy/org/apache/nifi/processor/TestStandardValidators.groovy
index c820c03..8a5494f 100644
--- a/nifi-commons/nifi-json-utils/src/test/groovy/org/apache/nifi/processor/TestStandardValidators.groovy
+++ b/nifi-commons/nifi-json-utils/src/test/groovy/org/apache/nifi/processor/TestStandardValidators.groovy
@@ -20,21 +20,21 @@
 import org.apache.nifi.components.ValidationResult
 import org.apache.nifi.components.Validator
 import org.apache.nifi.processor.util.JsonValidator
-import org.junit.Before
-import org.junit.Test
+import org.junit.jupiter.api.BeforeEach
+import org.junit.jupiter.api.Test
 
+import static groovy.json.JsonOutput.prettyPrint
+import static groovy.json.JsonOutput.toJson
 import static org.junit.Assert.assertFalse
 import static org.junit.Assert.assertTrue
 import static org.mockito.Mockito.mock
 
-import static groovy.json.JsonOutput.*
-
 class TestStandardValidators {
     final String DUMMY_JSON_PROPERTY = "JSONProperty"
     Validator validator
     ValidationContext context
 
-    @Before
+    @BeforeEach
     void setup() {
         validator = JsonValidator.INSTANCE
         context = mock(ValidationContext.class)
diff --git a/nifi-commons/nifi-parameter/src/test/java/org/apache/nifi/parameter/TestExpressionLanguageAgnosticParameterParser.java b/nifi-commons/nifi-parameter/src/test/java/org/apache/nifi/parameter/TestExpressionLanguageAgnosticParameterParser.java
index c0c7213..dd87de6 100644
--- a/nifi-commons/nifi-parameter/src/test/java/org/apache/nifi/parameter/TestExpressionLanguageAgnosticParameterParser.java
+++ b/nifi-commons/nifi-parameter/src/test/java/org/apache/nifi/parameter/TestExpressionLanguageAgnosticParameterParser.java
@@ -16,13 +16,13 @@
  */
 package org.apache.nifi.parameter;
 
-import org.junit.Test;
+import org.junit.jupiter.api.Test;
 
 import java.util.List;
 
-import static junit.framework.TestCase.assertTrue;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
 public class TestExpressionLanguageAgnosticParameterParser {
 
diff --git a/nifi-commons/nifi-parameter/src/test/java/org/apache/nifi/parameter/TestExpressionLanguageAwareParameterParser.java b/nifi-commons/nifi-parameter/src/test/java/org/apache/nifi/parameter/TestExpressionLanguageAwareParameterParser.java
index c91f38a..dbba4f1 100644
--- a/nifi-commons/nifi-parameter/src/test/java/org/apache/nifi/parameter/TestExpressionLanguageAwareParameterParser.java
+++ b/nifi-commons/nifi-parameter/src/test/java/org/apache/nifi/parameter/TestExpressionLanguageAwareParameterParser.java
@@ -16,13 +16,14 @@
  */
 package org.apache.nifi.parameter;
 
-import org.junit.Test;
+
+import org.junit.jupiter.api.Test;
 
 import java.util.List;
 
-import static junit.framework.TestCase.assertTrue;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
 public class TestExpressionLanguageAwareParameterParser {
 
diff --git a/nifi-commons/nifi-parameter/src/test/java/org/apache/nifi/parameter/TestStandardParameterTokenList.java b/nifi-commons/nifi-parameter/src/test/java/org/apache/nifi/parameter/TestStandardParameterTokenList.java
index 7f5afe7..342510c 100644
--- a/nifi-commons/nifi-parameter/src/test/java/org/apache/nifi/parameter/TestStandardParameterTokenList.java
+++ b/nifi-commons/nifi-parameter/src/test/java/org/apache/nifi/parameter/TestStandardParameterTokenList.java
@@ -16,15 +16,15 @@
  */
 package org.apache.nifi.parameter;
 
-import org.junit.Test;
+import org.junit.jupiter.api.Test;
 import org.mockito.Mockito;
 
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Optional;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNull;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNull;
 
 public class TestStandardParameterTokenList {
 
diff --git a/nifi-commons/nifi-properties/src/test/java/org/apache/nifi/util/NiFiPropertiesTest.java b/nifi-commons/nifi-properties/src/test/java/org/apache/nifi/util/NiFiPropertiesTest.java
index 08a87bf..353d877 100644
--- a/nifi-commons/nifi-properties/src/test/java/org/apache/nifi/util/NiFiPropertiesTest.java
+++ b/nifi-commons/nifi-properties/src/test/java/org/apache/nifi/util/NiFiPropertiesTest.java
@@ -16,8 +16,7 @@
  */
 package org.apache.nifi.util;
 
-import org.junit.Assert;
-import org.junit.Test;
+import org.junit.jupiter.api.Test;
 
 import java.io.File;
 import java.net.InetSocketAddress;
@@ -29,10 +28,12 @@
 import java.util.Map;
 import java.util.Set;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
+import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
@@ -54,9 +55,9 @@
             directories.add(narLibDir.toString());
         }
 
-        Assert.assertEquals("Did not have the anticipated number of directories", expectedDirectories.size(), directories.size());
+        assertEquals(expectedDirectories.size(), directories.size(), "Did not have the anticipated number of directories");
         for (File expectedDirectory : expectedDirectories) {
-            Assert.assertTrue("Listed directories did not contain expected directory", directories.contains(expectedDirectory.getPath()));
+            assertTrue(directories.contains(expectedDirectory.getPath()), "Listed directories did not contain expected directory");
         }
     }
 
@@ -95,43 +96,31 @@
         additionalProperties.put(NiFiProperties.REMOTE_INPUT_HOST, "localhost");
         NiFiProperties properties = loadNiFiProperties("/NiFiProperties/conf/nifi.blank.properties", additionalProperties);
 
-        try {
-            properties.validate();
-        } catch (Throwable t) {
-            Assert.fail("unexpected exception: " + t.getMessage());
-        }
+        assertGoodProperties(properties);
 
         // expect no error to be thrown
         additionalProperties.put(NiFiProperties.REMOTE_INPUT_HOST, "");
         properties = loadNiFiProperties("/NiFiProperties/conf/nifi.blank.properties", additionalProperties);
 
-        try {
-            properties.validate();
-        } catch (Throwable t) {
-            Assert.fail("unexpected exception: " + t.getMessage());
-        }
+        assertGoodProperties(properties);
 
         // expect no error to be thrown
         additionalProperties.remove(NiFiProperties.REMOTE_INPUT_HOST);
         properties = loadNiFiProperties("/NiFiProperties/conf/nifi.blank.properties", additionalProperties);
 
-        try {
-            properties.validate();
-        } catch (Throwable t) {
-            Assert.fail("unexpected exception: " + t.getMessage());
-        }
+        assertGoodProperties(properties);
 
         // expected error
         additionalProperties = new HashMap<>();
         additionalProperties.put(NiFiProperties.REMOTE_INPUT_HOST, "http://localhost");
         properties = loadNiFiProperties("/NiFiProperties/conf/nifi.blank.properties", additionalProperties);
 
-        try {
-            properties.validate();
-            Assert.fail("Validation should throw an exception");
-        } catch (Throwable t) {
-            // nothing to do
-        }
+        final NiFiProperties test = properties;
+        assertThrows(Throwable.class, () -> test.validate());
+    }
+
+    private void assertGoodProperties(final NiFiProperties properties) {
+        assertDoesNotThrow(() -> properties.validate());
     }
 
     @Test
@@ -187,7 +176,7 @@
         assertEquals(Integer.parseInt(portValue), clusterProtocolPort.intValue());
     }
 
-    @Test(expected = NumberFormatException.class)
+    @Test
     public void testShouldVerifyExceptionThrownWhenInValidFormatPortValue() {
         // Testing with CLUSTER_NODE_PROTOCOL_PORT
 
@@ -200,10 +189,7 @@
 
         // Act
         Integer clusterProtocolPort = properties.getClusterNodeProtocolPort();
-
-        // Assert
-        // Expect NumberFormatException thrown
-        assertEquals(Integer.parseInt(portValue), clusterProtocolPort.intValue());
+        assertThrows(NumberFormatException.class, () -> Integer.parseInt(portValue));
     }
 
     @Test
@@ -225,7 +211,7 @@
         assertEquals(Integer.parseInt(portValue), clusterProtocolAddress.getPort());
     }
 
-    @Test(expected = RuntimeException.class)
+    @Test
     public void testShouldVerifyExceptionThrownWhenInvalidPortValue() {
         // Testing with CLUSTER_NODE_ADDRESS
 
@@ -238,15 +224,10 @@
         additionalProperties.put(NiFiProperties.CLUSTER_NODE_ADDRESS, addressValue);
         NiFiProperties properties = loadNiFiProperties("/NiFiProperties/conf/nifi.blank.properties", additionalProperties);
 
-        // Act
-        InetSocketAddress clusterProtocolAddress = properties.getClusterNodeProtocolAddress();
-
-        // Assert
-        // Expect RuntimeException thrown
-        assertEquals(Integer.parseInt(portValue), clusterProtocolAddress.getPort());
+        assertThrows(RuntimeException.class, () -> properties.getClusterNodeProtocolAddress());
     }
 
-    @Test(expected = RuntimeException.class)
+    @Test
     public void testShouldVerifyExceptionThrownWhenPortValueIsZero() {
         // Arrange
         String portValue = "0";
@@ -256,12 +237,7 @@
         additionalProperties.put(NiFiProperties.CLUSTER_NODE_ADDRESS, addressValue);
         NiFiProperties properties = loadNiFiProperties("/NiFiProperties/conf/nifi.blank.properties", additionalProperties);
 
-        // Act
-        InetSocketAddress clusterProtocolAddress = properties.getClusterNodeProtocolAddress();
-
-        // Assert
-        // Expect RuntimeException thrown
-        assertEquals(Integer.parseInt(portValue), clusterProtocolAddress.getPort());
+        assertThrows(RuntimeException.class, () -> properties.getClusterNodeProtocolAddress());
     }
 
     @Test
@@ -384,9 +360,9 @@
         final Map<String, String> result = testSubject.getPropertiesWithPrefix("nifi.web.http");
 
         // then
-        Assert.assertEquals(4, result.size());
-        Assert.assertTrue(result.containsKey("nifi.web.http.host"));
-        Assert.assertTrue(result.containsKey("nifi.web.https.host"));
+        assertEquals(4, result.size());
+        assertTrue(result.containsKey("nifi.web.http.host"));
+        assertTrue(result.containsKey("nifi.web.https.host"));
     }
 
     @Test
@@ -398,9 +374,9 @@
         final Map<String, String> result = testSubject.getPropertiesWithPrefix("nifi.web.http.");
 
         // then
-        Assert.assertEquals(2, result.size());
-        Assert.assertTrue(result.containsKey("nifi.web.http.host"));
-        Assert.assertFalse(result.containsKey("nifi.web.https.host"));
+        assertEquals(2, result.size());
+        assertTrue(result.containsKey("nifi.web.http.host"));
+        assertFalse(result.containsKey("nifi.web.https.host"));
     }
 
     @Test
@@ -412,7 +388,7 @@
         final Map<String, String> result = testSubject.getPropertiesWithPrefix("invalid.property");
 
         // then
-        Assert.assertTrue(result.isEmpty());
+        assertTrue(result.isEmpty());
     }
 
     @Test
@@ -424,9 +400,9 @@
         final Set<String> result = testSubject.getDirectSubsequentTokens("nifi.web.http");
 
         // then
-        Assert.assertEquals(2, result.size());
-        Assert.assertTrue(result.contains("host"));
-        Assert.assertTrue(result.contains("port"));
+        assertEquals(2, result.size());
+        assertTrue(result.contains("host"));
+        assertTrue(result.contains("port"));
     }
 
     @Test
@@ -438,9 +414,9 @@
         final Set<String> result = testSubject.getDirectSubsequentTokens("nifi.web.http.");
 
         // then
-        Assert.assertEquals(2, result.size());
-        Assert.assertTrue(result.contains("host"));
-        Assert.assertTrue(result.contains("port"));
+        assertEquals(2, result.size());
+        assertTrue(result.contains("host"));
+        assertTrue(result.contains("port"));
     }
 
     @Test
@@ -452,7 +428,7 @@
         final Set<String> result = testSubject.getDirectSubsequentTokens("lorem.ipsum");
 
         // then
-        Assert.assertTrue(result.isEmpty());
+        assertTrue(result.isEmpty());
     }
 
     @Test
@@ -464,10 +440,10 @@
         final Set<String> result = testSubject.getDirectSubsequentTokens("nifi.web");
 
         // then
-        Assert.assertEquals(4, result.size());
-        Assert.assertTrue(result.contains("http"));
-        Assert.assertTrue(result.contains("https"));
-        Assert.assertTrue(result.contains("war"));
-        Assert.assertTrue(result.contains("jetty"));
+        assertEquals(4, result.size());
+        assertTrue(result.contains("http"));
+        assertTrue(result.contains("https"));
+        assertTrue(result.contains("war"));
+        assertTrue(result.contains("jetty"));
     }
 }
diff --git a/nifi-commons/nifi-properties/src/test/java/org/apache/nifi/util/StringUtilsTest.java b/nifi-commons/nifi-properties/src/test/java/org/apache/nifi/util/StringUtilsTest.java
index 059857c..0de041a 100644
--- a/nifi-commons/nifi-properties/src/test/java/org/apache/nifi/util/StringUtilsTest.java
+++ b/nifi-commons/nifi-properties/src/test/java/org/apache/nifi/util/StringUtilsTest.java
@@ -16,16 +16,17 @@
  */
 package org.apache.nifi.util;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
+import org.junit.jupiter.api.Test;
 
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
 import java.util.stream.Collectors;
-import org.junit.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
 public class StringUtilsTest {
 
diff --git a/nifi-commons/nifi-property-encryptor/src/test/java/org/apache/nifi/encrypt/KeyedCipherPropertyEncryptorTest.java b/nifi-commons/nifi-property-encryptor/src/test/java/org/apache/nifi/encrypt/KeyedCipherPropertyEncryptorTest.java
index 176fee8..9385daa 100644
--- a/nifi-commons/nifi-property-encryptor/src/test/java/org/apache/nifi/encrypt/KeyedCipherPropertyEncryptorTest.java
+++ b/nifi-commons/nifi-property-encryptor/src/test/java/org/apache/nifi/encrypt/KeyedCipherPropertyEncryptorTest.java
@@ -22,8 +22,8 @@
 import org.apache.nifi.security.util.crypto.AESKeyedCipherProvider;
 import org.apache.nifi.security.util.crypto.KeyedCipherProvider;
 import org.apache.nifi.util.StringUtils;
-import org.junit.Before;
-import org.junit.Test;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
 
 import javax.crypto.SecretKey;
 import javax.crypto.spec.SecretKeySpec;
@@ -55,7 +55,7 @@
 
     private KeyedCipherPropertyEncryptor encryptor;
 
-    @Before
+    @BeforeEach
     public void setUp() {
         encryptor = new KeyedCipherPropertyEncryptor(CIPHER_PROVIDER, ENCRYPTION_METHOD, SECRET_KEY);
     }
diff --git a/nifi-commons/nifi-property-encryptor/src/test/java/org/apache/nifi/encrypt/PasswordBasedCipherPropertyEncryptorTest.java b/nifi-commons/nifi-property-encryptor/src/test/java/org/apache/nifi/encrypt/PasswordBasedCipherPropertyEncryptorTest.java
index f9839c8..9f0bb14 100644
--- a/nifi-commons/nifi-property-encryptor/src/test/java/org/apache/nifi/encrypt/PasswordBasedCipherPropertyEncryptorTest.java
+++ b/nifi-commons/nifi-property-encryptor/src/test/java/org/apache/nifi/encrypt/PasswordBasedCipherPropertyEncryptorTest.java
@@ -20,8 +20,8 @@
 import org.apache.commons.codec.binary.Hex;
 import org.apache.nifi.security.util.EncryptionMethod;
 import org.apache.nifi.security.util.crypto.PBECipherProvider;
-import org.junit.Before;
-import org.junit.Test;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
 
 import java.nio.charset.Charset;
 import java.nio.charset.StandardCharsets;
@@ -46,7 +46,7 @@
 
     private PasswordBasedCipherPropertyEncryptor encryptor;
 
-    @Before
+    @BeforeEach
     public void setUp() {
         encryptor = new PasswordBasedCipherPropertyEncryptor(CIPHER_PROVIDER, ENCRYPTION_METHOD, PASSWORD);
     }
diff --git a/nifi-commons/nifi-property-encryptor/src/test/java/org/apache/nifi/encrypt/PropertyEncryptorFactoryTest.java b/nifi-commons/nifi-property-encryptor/src/test/java/org/apache/nifi/encrypt/PropertyEncryptorFactoryTest.java
index e044c81..cf5889c 100644
--- a/nifi-commons/nifi-property-encryptor/src/test/java/org/apache/nifi/encrypt/PropertyEncryptorFactoryTest.java
+++ b/nifi-commons/nifi-property-encryptor/src/test/java/org/apache/nifi/encrypt/PropertyEncryptorFactoryTest.java
@@ -19,7 +19,7 @@
 import org.apache.nifi.security.util.EncryptionMethod;
 import org.apache.nifi.util.NiFiProperties;
 import org.apache.nifi.util.StringUtils;
-import org.junit.Test;
+import org.junit.jupiter.api.Test;
 
 import java.util.Properties;
 
diff --git a/nifi-commons/nifi-property-encryptor/src/test/java/org/apache/nifi/encrypt/StandardPropertySecretKeyProviderTest.java b/nifi-commons/nifi-property-encryptor/src/test/java/org/apache/nifi/encrypt/StandardPropertySecretKeyProviderTest.java
index 9e2a924..c160ce4 100644
--- a/nifi-commons/nifi-property-encryptor/src/test/java/org/apache/nifi/encrypt/StandardPropertySecretKeyProviderTest.java
+++ b/nifi-commons/nifi-property-encryptor/src/test/java/org/apache/nifi/encrypt/StandardPropertySecretKeyProviderTest.java
@@ -16,8 +16,8 @@
  */
 package org.apache.nifi.encrypt;
 
-import org.junit.Before;
-import org.junit.Test;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
 
 import javax.crypto.SecretKey;
 
@@ -31,7 +31,7 @@
 
     private StandardPropertySecretKeyProvider provider;
 
-    @Before
+    @BeforeEach
     public void setUp() {
         provider = new StandardPropertySecretKeyProvider();
     }
diff --git a/nifi-commons/nifi-record-path/src/test/java/org/apache/nifi/record/path/TestRecordPath.java b/nifi-commons/nifi-record-path/src/test/java/org/apache/nifi/record/path/TestRecordPath.java
index 83c5853..100861f 100644
--- a/nifi-commons/nifi-record-path/src/test/java/org/apache/nifi/record/path/TestRecordPath.java
+++ b/nifi-commons/nifi-record-path/src/test/java/org/apache/nifi/record/path/TestRecordPath.java
@@ -28,9 +28,9 @@
 import org.apache.nifi.serialization.record.type.ArrayDataType;
 import org.apache.nifi.serialization.record.util.DataTypeUtils;
 import org.apache.nifi.uuid5.Uuid5Util;
-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 java.nio.charset.IllegalCharsetNameException;
 import java.nio.charset.StandardCharsets;
@@ -57,8 +57,8 @@
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertThrows;
 import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
 
 public class TestRecordPath {
 
@@ -72,12 +72,12 @@
 
     private static final String TEST_TIMEZONE_OFFSET = String.format("GMT+0%d:00", TEST_OFFSET_HOURS);
 
-    @BeforeClass
+    @BeforeAll
     public static void setTestTimezone() {
         System.setProperty(USER_TIMEZONE_PROPERTY, TEST_TIMEZONE);
     }
 
-    @AfterClass
+    @AfterAll
     public static void setSystemTimezone() {
         System.setProperty(USER_TIMEZONE_PROPERTY, SYSTEM_TIMEZONE);
     }
@@ -93,12 +93,7 @@
         RecordPath.compile("/name[contains(., 'hello')]");
 
         // substring is not a filter function so cannot be used as a predicate
-        try {
-            RecordPath.compile("/name[substring(., 1, 2)]");
-            fail("Expected RecordPathException");
-        } catch (final RecordPathException e) {
-            // expected
-        }
+        assertThrows(RecordPathException.class, () -> RecordPath.compile("/name[substring(., 1, 2)]"));
 
         // substring is not a filter function so can be used as *part* of a predicate but not as the entire predicate
         RecordPath.compile("/name[substring(., 1, 2) = 'e']");
@@ -1568,7 +1563,7 @@
         assertEquals("Hello World!", RecordPath.compile("toString(/bytes, \"UTF-16\")").evaluate(record).getSelectedFields().findFirst().get().getValue());
     }
 
-    @Test(expected = IllegalCharsetNameException.class)
+    @Test
     public void testToStringBadCharset() {
         final List<RecordField> fields = new ArrayList<>();
         fields.add(new RecordField("id", RecordFieldType.INT.getDataType()));
@@ -1581,7 +1576,9 @@
         values.put("bytes", "Hello World!".getBytes(StandardCharsets.UTF_16));
         final Record record = new MapRecord(schema, values);
 
-        RecordPath.compile("toString(/bytes, \"NOT A REAL CHARSET\")").evaluate(record).getSelectedFields().findFirst().get().getValue();
+        assertThrows(IllegalCharsetNameException.class, () ->
+                RecordPath.compile("toString(/bytes, \"NOT A REAL CHARSET\")").evaluate(record)
+                        .getSelectedFields().findFirst().get().getValue());
     }
 
     @Test
@@ -1601,7 +1598,7 @@
                 (byte[]) RecordPath.compile("toBytes(/s, \"UTF-16LE\")").evaluate(record).getSelectedFields().findFirst().get().getValue());
     }
 
-    @Test(expected = IllegalCharsetNameException.class)
+    @Test
     public void testToBytesBadCharset() {
         final List<RecordField> fields = new ArrayList<>();
         fields.add(new RecordField("id", RecordFieldType.INT.getDataType()));
@@ -1614,7 +1611,8 @@
         values.put("s", "Hello World!");
         final Record record = new MapRecord(schema, values);
 
-        RecordPath.compile("toBytes(/s, \"NOT A REAL CHARSET\")").evaluate(record).getSelectedFields().findFirst().get().getValue();
+        assertThrows(IllegalCharsetNameException.class, () -> RecordPath.compile("toBytes(/s, \"NOT A REAL CHARSET\")").evaluate(record)
+                .getSelectedFields().findFirst().get().getValue());
     }
 
     @Test
@@ -1796,21 +1794,20 @@
 
         // test invalid JSON
         final Record recordInvalidJson = new MapRecord(schema, Collections.singletonMap("json_str", "{\"invalid\": \"json"));
-        try {
-            RecordPath.compile("unescapeJson(/json_str)").evaluate(recordInvalidJson).getSelectedFields().findFirst().orElseThrow(IllegalStateException::new).getValue();
-            fail("Expected a RecordPathException for invalid JSON");
-        } catch (RecordPathException rpe) {
-            assertEquals("Unable to deserialise JSON String into Record Path value", rpe.getMessage());
-        }
+
+        RecordPathException rpe = assertThrows(RecordPathException.class,
+                () -> RecordPath.compile("unescapeJson(/json_str)")
+                        .evaluate(recordInvalidJson).getSelectedFields()
+                        .findFirst().orElseThrow(IllegalStateException::new).getValue());
+        assertEquals("Unable to deserialise JSON String into Record Path value", rpe.getMessage());
 
         // test not String
         final Record recordNotString = new MapRecord(schema, Collections.singletonMap("person", new MapRecord(person, Collections.singletonMap("age", 30))));
-        try {
-            RecordPath.compile("unescapeJson(/person/age)").evaluate(recordNotString).getSelectedFields().findFirst().orElseThrow(IllegalStateException::new).getValue();
-            fail("Expected IllegalArgumentException for non-String input");
-        } catch (IllegalArgumentException iae) {
-            assertEquals("Argument supplied to unescapeJson must be a String", iae.getMessage());
-        }
+        IllegalArgumentException iae = assertThrows(IllegalArgumentException.class,
+                () -> RecordPath.compile("unescapeJson(/person/age)")
+                        .evaluate(recordNotString).getSelectedFields()
+                        .findFirst().orElseThrow(IllegalStateException::new).getValue());
+        assertEquals("Argument supplied to unescapeJson must be a String", iae.getMessage());
     }
 
     @Test
@@ -1820,10 +1817,11 @@
         assertEquals("5753a498f025464d72e088a9d5d6e872592d5f91", RecordPath.compile("hash(/firstName, 'SHA-1')").evaluate(record).getSelectedFields().findFirst().get().getValue());
     }
 
-    @Test(expected = RecordPathException.class)
+    @Test
     public void testHashFailure() {
         final Record record = getCaseTestRecord();
-        assertEquals("61409aa1fd47d4a5332de23cbf59a36f", RecordPath.compile("hash(/firstName, 'NOT_A_ALGO')").evaluate(record).getSelectedFields().findFirst().get().getValue());
+        assertThrows(RecordPathException.class, () -> RecordPath.compile("hash(/firstName, 'NOT_A_ALGO')").evaluate(record)
+                .getSelectedFields().findFirst().get().getValue());
     }
 
     @Test
diff --git a/nifi-commons/nifi-record-path/src/test/java/org/apache/nifi/record/path/util/AbstractWalkerTest.java b/nifi-commons/nifi-record-path/src/test/java/org/apache/nifi/record/path/util/AbstractWalkerTest.java
index 6b1472e..d821525 100644
--- a/nifi-commons/nifi-record-path/src/test/java/org/apache/nifi/record/path/util/AbstractWalkerTest.java
+++ b/nifi-commons/nifi-record-path/src/test/java/org/apache/nifi/record/path/util/AbstractWalkerTest.java
@@ -16,13 +16,6 @@
  */
 package org.apache.nifi.record.path.util;
 
-import static org.junit.Assert.assertEquals;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
 import org.apache.nifi.record.path.FieldValue;
 import org.apache.nifi.serialization.SimpleRecordSchema;
 import org.apache.nifi.serialization.record.DataType;
@@ -32,6 +25,13 @@
 import org.apache.nifi.serialization.record.RecordFieldType;
 import org.apache.nifi.serialization.record.RecordSchema;
 
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import static org.junit.Assert.assertEquals;
+
 /**
  * Abstract base class for tests that walk FieldValue hierarchies.
  */
diff --git a/nifi-commons/nifi-record-path/src/test/java/org/apache/nifi/record/path/util/TestFieldValueLogicalPathBuilder.java b/nifi-commons/nifi-record-path/src/test/java/org/apache/nifi/record/path/util/TestFieldValueLogicalPathBuilder.java
index 6860419..5ad433a 100644
--- a/nifi-commons/nifi-record-path/src/test/java/org/apache/nifi/record/path/util/TestFieldValueLogicalPathBuilder.java
+++ b/nifi-commons/nifi-record-path/src/test/java/org/apache/nifi/record/path/util/TestFieldValueLogicalPathBuilder.java
@@ -16,15 +16,16 @@
  */
 package org.apache.nifi.record.path.util;
 
-import static org.junit.Assert.assertEquals;
+import org.apache.nifi.record.path.FieldValue;
+import org.apache.nifi.record.path.RecordPath;
+import org.apache.nifi.serialization.record.Record;
+import org.junit.jupiter.api.Test;
 
 import java.util.List;
 import java.util.stream.Collectors;
 
-import org.apache.nifi.record.path.FieldValue;
-import org.apache.nifi.record.path.RecordPath;
-import org.apache.nifi.serialization.record.Record;
-import org.junit.Test;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertThrows;
 
 public class TestFieldValueLogicalPathBuilder extends AbstractWalkerTest {
 
@@ -86,9 +87,9 @@
         }
     }
 
-    @Test(expected = NullPointerException.class)
+    @Test
     public void buildLogicalPathBuilderFailsNull() {
         final FieldValueLogicalPathBuilder builder = getDefaultLogicalPathBuilder();
-        builder.buildLogicalPath(null);
+        assertThrows(NullPointerException.class, () -> builder.buildLogicalPath(null));
     }
 }
\ No newline at end of file
diff --git a/nifi-commons/nifi-record-path/src/test/java/org/apache/nifi/record/path/util/TestFieldValueWalker.java b/nifi-commons/nifi-record-path/src/test/java/org/apache/nifi/record/path/util/TestFieldValueWalker.java
index 8fde846..948ab8d 100644
--- a/nifi-commons/nifi-record-path/src/test/java/org/apache/nifi/record/path/util/TestFieldValueWalker.java
+++ b/nifi-commons/nifi-record-path/src/test/java/org/apache/nifi/record/path/util/TestFieldValueWalker.java
@@ -16,15 +16,15 @@
  */
 package org.apache.nifi.record.path.util;
 
-import static org.junit.Assert.assertEquals;
+import org.apache.nifi.record.path.FieldValue;
+import org.apache.nifi.record.path.RecordPath;
+import org.apache.nifi.serialization.record.Record;
+import org.junit.jupiter.api.Test;
 
 import java.util.List;
 import java.util.stream.Collectors;
 
-import org.apache.nifi.record.path.FieldValue;
-import org.apache.nifi.record.path.RecordPath;
-import org.apache.nifi.serialization.record.Record;
-import org.junit.Test;
+import static org.junit.Assert.assertEquals;
 
 public class TestFieldValueWalker extends AbstractWalkerTest {
 
diff --git a/nifi-commons/nifi-record/pom.xml b/nifi-commons/nifi-record/pom.xml
index 866684d..b675b69 100644
--- a/nifi-commons/nifi-record/pom.xml
+++ b/nifi-commons/nifi-record/pom.xml
@@ -27,5 +27,4 @@
         several interfaces for interacting with Records. This module should not depend
         on any external libraries.
     </description>
-
 </project>
diff --git a/nifi-commons/nifi-record/src/test/java/org/apache/nifi/serialization/TestSimpleRecordSchema.java b/nifi-commons/nifi-record/src/test/java/org/apache/nifi/serialization/TestSimpleRecordSchema.java
index c2b2d43..18fd711 100644
--- a/nifi-commons/nifi-record/src/test/java/org/apache/nifi/serialization/TestSimpleRecordSchema.java
+++ b/nifi-commons/nifi-record/src/test/java/org/apache/nifi/serialization/TestSimpleRecordSchema.java
@@ -20,8 +20,7 @@
 import org.apache.nifi.serialization.record.RecordField;
 import org.apache.nifi.serialization.record.RecordFieldType;
 import org.apache.nifi.serialization.record.SchemaIdentifier;
-import org.junit.Assert;
-import org.junit.Test;
+import org.junit.jupiter.api.Test;
 import org.mockito.Mockito;
 
 import java.util.ArrayList;
@@ -31,6 +30,7 @@
 import java.util.Set;
 
 import static org.junit.Assert.assertTrue;
+import static org.junit.jupiter.api.Assertions.assertThrows;
 
 public class TestSimpleRecordSchema {
 
@@ -40,11 +40,7 @@
         fields.add(new RecordField("hello", RecordFieldType.STRING.getDataType(), null, set("foo", "bar")));
         fields.add(new RecordField("goodbye", RecordFieldType.STRING.getDataType(), null, set("baz", "bar")));
 
-        try {
-            new SimpleRecordSchema(fields);
-            Assert.fail("Was able to create two fields with same alias");
-        } catch (final IllegalArgumentException expected) {
-        }
+        assertThrows(IllegalArgumentException.class, () -> new SimpleRecordSchema(fields));
     }
 
     @Test
@@ -53,11 +49,7 @@
         fields.add(new RecordField("hello", RecordFieldType.STRING.getDataType(), null, set("foo", "bar")));
         fields.add(new RecordField("hello", RecordFieldType.STRING.getDataType()));
 
-        try {
-            new SimpleRecordSchema(fields);
-            Assert.fail("Was able to create two fields with same name");
-        } catch (final IllegalArgumentException expected) {
-        }
+        assertThrows(IllegalArgumentException.class, () -> new SimpleRecordSchema(fields));
     }
 
     @Test
@@ -66,11 +58,7 @@
         fields.add(new RecordField("hello", RecordFieldType.STRING.getDataType(), null, set("foo", "bar")));
         fields.add(new RecordField("bar", RecordFieldType.STRING.getDataType()));
 
-        try {
-            new SimpleRecordSchema(fields);
-            Assert.fail("Was able to create two fields with conflicting names/aliases");
-        } catch (final IllegalArgumentException expected) {
-        }
+        assertThrows(IllegalArgumentException.class, () -> new SimpleRecordSchema(fields));
     }
 
     @Test
diff --git a/nifi-commons/nifi-record/src/test/java/org/apache/nifi/serialization/record/ResultSetRecordSetTest.java b/nifi-commons/nifi-record/src/test/java/org/apache/nifi/serialization/record/ResultSetRecordSetTest.java
index 10fd23f..8617fd5 100644
--- a/nifi-commons/nifi-record/src/test/java/org/apache/nifi/serialization/record/ResultSetRecordSetTest.java
+++ b/nifi-commons/nifi-record/src/test/java/org/apache/nifi/serialization/record/ResultSetRecordSetTest.java
@@ -19,13 +19,15 @@
 import org.apache.nifi.serialization.SimpleRecordSchema;
 import org.apache.nifi.serialization.record.type.ArrayDataType;
 import org.apache.nifi.serialization.record.type.DecimalDataType;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
 import org.mockito.ArgumentMatchers;
 import org.mockito.Mock;
 import org.mockito.Mockito;
-import org.mockito.junit.MockitoJUnitRunner;
+import org.mockito.junit.jupiter.MockitoExtension;
+import org.mockito.junit.jupiter.MockitoSettings;
+import org.mockito.quality.Strictness;
 
 import java.math.BigDecimal;
 import java.sql.Array;
@@ -54,7 +56,8 @@
 import static org.junit.Assert.fail;
 import static org.mockito.Mockito.when;
 
-@RunWith(MockitoJUnitRunner.class)
+@ExtendWith(MockitoExtension.class)
+@MockitoSettings(strictness = Strictness.LENIENT)
 public class ResultSetRecordSetTest {
 
     private static final String COLUMN_NAME_VARCHAR = "varchar";
@@ -105,7 +108,7 @@
     @Mock
     private ResultSetMetaData resultSetMetaData;
 
-    @Before
+    @BeforeEach
     public void setUp() throws SQLException {
         setUpMocks(COLUMNS, resultSetMetaData, resultSet);
     }
diff --git a/nifi-commons/nifi-record/src/test/java/org/apache/nifi/serialization/record/TestDataTypeUtils.java b/nifi-commons/nifi-record/src/test/java/org/apache/nifi/serialization/record/TestDataTypeUtils.java
index 2115e67..21ec919 100644
--- a/nifi-commons/nifi-record/src/test/java/org/apache/nifi/serialization/record/TestDataTypeUtils.java
+++ b/nifi-commons/nifi-record/src/test/java/org/apache/nifi/serialization/record/TestDataTypeUtils.java
@@ -22,7 +22,7 @@
 import org.apache.nifi.serialization.record.type.RecordDataType;
 import org.apache.nifi.serialization.record.util.DataTypeUtils;
 import org.apache.nifi.serialization.record.util.IllegalTypeConversionException;
-import org.junit.Test;
+import org.junit.jupiter.api.Test;
 
 import java.math.BigDecimal;
 import java.math.BigInteger;
@@ -55,11 +55,12 @@
 import java.util.stream.IntStream;
 import java.util.stream.Stream;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
 public class TestDataTypeUtils {
     private static final ZoneId SYSTEM_DEFAULT_ZONE_ID = ZoneOffset.systemDefault();
@@ -82,12 +83,12 @@
         Timestamp ts = DataTypeUtils.toTimestamp(date, null, null);
 
         assertNotNull(ts);
-        assertEquals("Times didn't match", ts.getTime(), date.getTime());
+        assertEquals(ts.getTime(), date.getTime(), "Times didn't match");
 
         java.sql.Date sDate = new java.sql.Date(date.getTime());
         ts = DataTypeUtils.toTimestamp(date, null, null);
         assertNotNull(ts);
-        assertEquals("Times didn't match", ts.getTime(), sDate.getTime());
+        assertEquals(ts.getTime(), sDate.getTime(), "Times didn't match");
     }
 
     /*
@@ -102,7 +103,7 @@
 
         java.sql.Date output = DataTypeUtils.toDate(ts, null, null);
         assertNotNull(output);
-        assertEquals("Timestamps didn't match", output.getTime(), ts.getTime());
+        assertEquals(output.getTime(), ts.getTime(), "Timestamps didn't match");
     }
 
     @Test
@@ -266,11 +267,11 @@
         assertTrue(bytes instanceof Byte[]);
         assertNotNull(bytes);
         Byte[] b = (Byte[]) bytes;
-        assertEquals("Conversion from String to byte[] failed", (long) 72, (long) b[0] );  // H
-        assertEquals("Conversion from String to byte[] failed", (long) 101, (long) b[1] ); // e
-        assertEquals("Conversion from String to byte[] failed", (long) 108, (long) b[2] ); // l
-        assertEquals("Conversion from String to byte[] failed", (long) 108, (long) b[3] ); // l
-        assertEquals("Conversion from String to byte[] failed", (long) 111, (long) b[4] ); // o
+        assertEquals((long) 72, (long) b[0], "Conversion from String to byte[] failed");  // H
+        assertEquals((long) 101, (long) b[1], "Conversion from String to byte[] failed" ); // e
+        assertEquals((long) 108, (long) b[2], "Conversion from String to byte[] failed" ); // l
+        assertEquals((long) 108, (long) b[3], "Conversion from String to byte[] failed" ); // l
+        assertEquals((long) 111, (long) b[4], "Conversion from String to byte[] failed" ); // o
     }
 
     @Test
@@ -278,7 +279,7 @@
         Object s = DataTypeUtils.convertType("Hello".getBytes(StandardCharsets.UTF_16), RecordFieldType.STRING.getDataType(),null, StandardCharsets.UTF_16);
         assertNotNull(s);
         assertTrue(s instanceof String);
-        assertEquals("Conversion from byte[] to String failed", "Hello", s);
+        assertEquals("Hello", s, "Conversion from byte[] to String failed");
     }
 
     @Test
@@ -286,7 +287,7 @@
         Object b = DataTypeUtils.convertType("Hello".getBytes(StandardCharsets.UTF_16), RecordFieldType.ARRAY.getArrayDataType(RecordFieldType.BYTE.getDataType()),null, StandardCharsets.UTF_16);
         assertNotNull(b);
         assertTrue(b instanceof Byte[]);
-        assertEquals("Conversion from byte[] to String failed at char 0", (Object) "Hello".getBytes(StandardCharsets.UTF_16)[0], ((Byte[]) b)[0]);
+        assertEquals((Object) "Hello".getBytes(StandardCharsets.UTF_16)[0], ((Byte[]) b)[0], "Conversion from byte[] to String failed at char 0");
     }
 
     @Test
@@ -314,19 +315,22 @@
         assertNull(DataTypeUtils.convertType(null, RecordFieldType.DECIMAL.getDecimalDataType(30, 10), null, StandardCharsets.UTF_8));
     }
 
-    @Test(expected = IllegalTypeConversionException.class)
+    @Test
     public void testConvertToBigDecimalWhenInputStringIsInvalid() {
-        DataTypeUtils.convertType("test", RecordFieldType.DECIMAL.getDecimalDataType(30, 10), null, StandardCharsets.UTF_8);
+        assertThrows(IllegalTypeConversionException.class, () -> DataTypeUtils.convertType("test", RecordFieldType.DECIMAL.getDecimalDataType(30, 10),
+                null, StandardCharsets.UTF_8));
     }
 
-    @Test(expected = IllegalTypeConversionException.class)
+    @Test
     public void testConvertToBigDecimalWhenUnsupportedType() {
-        DataTypeUtils.convertType(new ArrayList<Double>(), RecordFieldType.DECIMAL.getDecimalDataType(30, 10), null, StandardCharsets.UTF_8);
+        assertThrows(IllegalTypeConversionException.class, () -> DataTypeUtils.convertType(new ArrayList<Double>(), RecordFieldType.DECIMAL.getDecimalDataType(30, 10),
+                null, StandardCharsets.UTF_8));
     }
 
-    @Test(expected = IllegalTypeConversionException.class)
+    @Test
     public void testConvertToBigDecimalWhenUnsupportedNumberType() {
-        DataTypeUtils.convertType(new DoubleAdder(), RecordFieldType.DECIMAL.getDecimalDataType(30, 10), null, StandardCharsets.UTF_8);
+        assertThrows(IllegalTypeConversionException.class, () -> DataTypeUtils.convertType(new DoubleAdder(), RecordFieldType.DECIMAL.getDecimalDataType(30, 10),
+                null, StandardCharsets.UTF_8));
     }
 
     @Test
@@ -413,16 +417,16 @@
             for (final String decimal : decimals) {
                 for (final String exp : exponents) {
                     String toTest = prefix + "100" + decimal + exp;
-                    assertTrue(toTest + " not valid float", DataTypeUtils.isFloatTypeCompatible(toTest));
-                    assertTrue(toTest + " not valid double", DataTypeUtils.isDoubleTypeCompatible(toTest));
+                    assertTrue(DataTypeUtils.isFloatTypeCompatible(toTest), toTest + " not valid float");
+                    assertTrue(DataTypeUtils.isDoubleTypeCompatible(toTest), toTest + " not valid double");
 
                     Double.parseDouble(toTest); // ensure we can actually parse it
                     Float.parseFloat(toTest);
 
                     if (decimal.length() > 1) {
                         toTest = prefix + decimal + exp;
-                        assertTrue(toTest + " not valid float", DataTypeUtils.isFloatTypeCompatible(toTest));
-                        assertTrue(toTest + " not valid double", DataTypeUtils.isDoubleTypeCompatible(toTest));
+                        assertTrue(DataTypeUtils.isFloatTypeCompatible(toTest), toTest + " not valid float");
+                        assertTrue(DataTypeUtils.isDoubleTypeCompatible(toTest), toTest + " not valid double");
                         Double.parseDouble(toTest); // ensure we can actually parse it
                         Float.parseFloat(toTest);
                     }
@@ -532,7 +536,7 @@
         };
 
         Optional<String> actual = DataTypeUtils.findMostSuitableTypeByStringValue(valueAsString, types, dataTypeMapper);
-        assertTrue("Exception not thrown during test as intended.", exceptionThrown.get());
+        assertTrue(exceptionThrown.get(), "Exception not thrown during test as intended.");
         assertEquals(expected, actual);
     }
 
@@ -753,11 +757,11 @@
         final BigDecimal indirectResult = whenExpectingValidConversion(expectedValue, incomingValue, RecordFieldType.DECIMAL.getDecimalDataType(30, 10));
         // In some cases, direct equality check comes with false negative as the changing representation brings in
         // insignificant changes what might break the comparison. For example 12F will be represented as "12.0"
-        assertEquals(failureMessage + "indirect", 0, expectedValue.compareTo(indirectResult));
+        assertEquals(0, expectedValue.compareTo(indirectResult), failureMessage + "indirect");
 
         // Checking direct conversion
         final BigDecimal directResult = DataTypeUtils.toBigDecimal(incomingValue, "field");
-        assertEquals(failureMessage + "direct", 0, expectedValue.compareTo(directResult));
+        assertEquals(0, expectedValue.compareTo(directResult), failureMessage + "direct");
 
     }
 
@@ -947,7 +951,7 @@
     @Test
     public void testConvertTypeStringToDateDefaultTimeZoneFormat() {
         final Object converted = DataTypeUtils.convertType(ISO_8601_YEAR_MONTH_DAY, RecordFieldType.DATE.getDataType(), DATE_FIELD);
-        assertTrue("Converted value is not java.sql.Date", converted instanceof java.sql.Date);
+        assertTrue(converted instanceof java.sql.Date, "Converted value is not java.sql.Date");
         assertEquals(ISO_8601_YEAR_MONTH_DAY, converted.toString());
     }
 
@@ -958,7 +962,7 @@
     public void testConvertTypeStringToDateConfiguredTimeZoneFormat() {
         final DateFormat dateFormat = DataTypeUtils.getDateFormat(CUSTOM_MONTH_DAY_YEAR_PATTERN, "GMT");
         final Object converted = DataTypeUtils.convertType(CUSTOM_MONTH_DAY_YEAR, RecordFieldType.DATE.getDataType(), () -> dateFormat, null, null,"date");
-        assertTrue("Converted value is not java.sql.Date", converted instanceof java.sql.Date);
+        assertTrue(converted instanceof java.sql.Date, "Converted value is not java.sql.Date");
         assertEquals(ISO_8601_YEAR_MONTH_DAY, converted.toString());
     }
 
@@ -969,7 +973,7 @@
     public void testConvertTypeStringToDateConfiguredSystemDefaultTimeZoneFormat() {
         final DateFormat dateFormat = DataTypeUtils.getDateFormat(CUSTOM_MONTH_DAY_YEAR_PATTERN, TimeZone.getDefault().getID());
         final Object converted = DataTypeUtils.convertType(CUSTOM_MONTH_DAY_YEAR, RecordFieldType.DATE.getDataType(), () -> dateFormat, null, null,"date");
-        assertTrue("Converted value is not java.sql.Date", converted instanceof java.sql.Date);
+        assertTrue(converted instanceof java.sql.Date, "Converted value is not java.sql.Date");
         assertEquals(ISO_8601_YEAR_MONTH_DAY, converted.toString());
     }
 
@@ -1006,6 +1010,6 @@
     private void assertToLocalDateEquals(final String expected, final Object value) {
         final DateTimeFormatter systemDefaultZoneFormatter = DataTypeUtils.getDateTimeFormatter(RecordFieldType.DATE.getDefaultFormat(), SYSTEM_DEFAULT_ZONE_ID);
         final LocalDate localDate = DataTypeUtils.toLocalDate(value, () -> systemDefaultZoneFormatter, DATE_FIELD);
-        assertEquals(String.format("Value Class [%s] to LocalDate not matched", value.getClass()), expected, localDate.toString());
+        assertEquals(expected, localDate.toString(), String.format("Value Class [%s] to LocalDate not matched", value.getClass()));
     }
 }
diff --git a/nifi-commons/nifi-record/src/test/java/org/apache/nifi/serialization/record/TestMapRecord.java b/nifi-commons/nifi-record/src/test/java/org/apache/nifi/serialization/record/TestMapRecord.java
index 82e20a6..a4a6ab8 100644
--- a/nifi-commons/nifi-record/src/test/java/org/apache/nifi/serialization/record/TestMapRecord.java
+++ b/nifi-commons/nifi-record/src/test/java/org/apache/nifi/serialization/record/TestMapRecord.java
@@ -17,8 +17,8 @@
 
 package org.apache.nifi.serialization.record;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNull;
+import org.apache.nifi.serialization.SimpleRecordSchema;
+import org.junit.jupiter.api.Test;
 
 import java.util.ArrayList;
 import java.util.HashMap;
@@ -27,9 +27,9 @@
 import java.util.Map;
 import java.util.Set;
 
-import org.apache.nifi.serialization.SimpleRecordSchema;
-import org.junit.Assert;
-import org.junit.Test;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertThrows;
 
 public class TestMapRecord {
 
@@ -71,12 +71,7 @@
         new RecordField("hello", RecordFieldType.INT.getDataType(), 84);
         new RecordField("hello", RecordFieldType.INT.getDataType(), (Object) null);
 
-        try {
-            new RecordField("hello", RecordFieldType.INT.getDataType(), "foo");
-            Assert.fail("Was able to set a default value of \"foo\" for INT type");
-        } catch (final IllegalArgumentException expected) {
-            // expected
-        }
+        assertThrows(IllegalArgumentException.class, () -> new RecordField("hello", RecordFieldType.INT.getDataType(), "foo"));
     }
 
     private Set<String> set(final String... values) {
diff --git a/nifi-commons/nifi-rocksdb-utils/src/test/java/org/apache/nifi/rocksdb/TestRocksDBMetronome.java b/nifi-commons/nifi-rocksdb-utils/src/test/java/org/apache/nifi/rocksdb/TestRocksDBMetronome.java
index 402f099..b9405ce 100644
--- a/nifi-commons/nifi-rocksdb-utils/src/test/java/org/apache/nifi/rocksdb/TestRocksDBMetronome.java
+++ b/nifi-commons/nifi-rocksdb-utils/src/test/java/org/apache/nifi/rocksdb/TestRocksDBMetronome.java
@@ -16,18 +16,19 @@
  */
 package org.apache.nifi.rocksdb;
 
-import org.apache.commons.lang3.SystemUtils;
-import org.junit.After;
-import org.junit.Assume;
-import org.junit.Before;
-import org.junit.BeforeClass;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.rules.TemporaryFolder;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.Timeout;
+import org.junit.jupiter.api.condition.DisabledOnOs;
+import org.junit.jupiter.api.condition.OS;
+import org.junit.jupiter.api.io.TempDir;
 import org.rocksdb.ColumnFamilyHandle;
 import org.rocksdb.RocksIterator;
 
+import java.io.File;
 import java.nio.charset.StandardCharsets;
+import java.nio.file.Path;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Random;
@@ -42,13 +43,11 @@
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
+import static org.junit.jupiter.api.Assertions.assertThrows;
 
+@DisabledOnOs(OS.WINDOWS)
 public class TestRocksDBMetronome {
 
-    @Rule
-    public TemporaryFolder temporaryFolder = new TemporaryFolder();
-
     private static final byte[] KEY = "key".getBytes(StandardCharsets.UTF_8);
     private static final byte[] VALUE = "value".getBytes(StandardCharsets.UTF_8);
     private static final byte[] KEY_2 = "key 2".getBytes(StandardCharsets.UTF_8);
@@ -56,17 +55,12 @@
 
     private ExecutorService executor;
 
-    @BeforeClass
-    public static void setupClass() {
-        Assume.assumeTrue("Test only runs on *nix", !SystemUtils.IS_OS_WINDOWS);
-    }
-
-    @Before
+    @BeforeEach
     public void before() {
         executor = Executors.newSingleThreadExecutor();
     }
 
-    @After
+    @AfterEach
     public void after() {
         executor.shutdownNow();
     }
@@ -98,10 +92,16 @@
         }
     }
 
+    private Path newFolder(Path parent) {
+        File newFolder = parent.resolve("temp-" + System.currentTimeMillis()).toFile();
+        newFolder.mkdirs();
+        return newFolder.toPath();
+    }
+
     @Test
-    public void testPutGetDelete() throws Exception {
+    public void testPutGetDelete(@TempDir Path temporaryFolder) throws Exception {
         try (RocksDBMetronome db = new RocksDBMetronome.Builder()
-                .setStoragePath(temporaryFolder.newFolder().toPath())
+                .setStoragePath(newFolder(temporaryFolder))
                 .build()) {
             db.initialize();
 
@@ -122,9 +122,9 @@
     }
 
     @Test
-    public void testPutGetConfiguration() throws Exception {
+    public void testPutGetConfiguration(@TempDir Path temporaryFolder) throws Exception {
         try (RocksDBMetronome db = new RocksDBMetronome.Builder()
-                .setStoragePath(temporaryFolder.newFolder().toPath())
+                .setStoragePath(newFolder(temporaryFolder))
                 .build()) {
             db.initialize();
 
@@ -136,32 +136,36 @@
         }
     }
 
-    @Test(expected = IllegalStateException.class)
-    public void testPutBeforeInit() throws Exception {
-        try (RocksDBMetronome db = new RocksDBMetronome.Builder()
-                .setStoragePath(temporaryFolder.newFolder().toPath())
+    @Test
+    public void testPutBeforeInit(@TempDir Path temporaryFolder) throws Exception {
+        assertThrows(IllegalStateException.class, () -> {
+            try (RocksDBMetronome db = new RocksDBMetronome.Builder()
+                .setStoragePath(newFolder(temporaryFolder))
                 .build()) {
-            db.put(KEY, VALUE);
-        }
-    }
-
-    @Test(expected = IllegalStateException.class)
-    public void testPutClosed() throws Exception {
-        try (RocksDBMetronome db = new RocksDBMetronome.Builder()
-                .setStoragePath(temporaryFolder.newFolder().toPath())
-                .build()) {
-            db.initialize();
-
-            db.close();
-            db.put(KEY_2, VALUE_2);
-        }
+                db.put(KEY, VALUE);
+            }
+        });
     }
 
     @Test
-    public void testColumnFamilies() throws Exception {
+    public void testPutClosed(@TempDir Path temporaryFolder) {
+        assertThrows(IllegalStateException.class, () -> {
+            try (RocksDBMetronome db = new RocksDBMetronome.Builder()
+                    .setStoragePath(newFolder(temporaryFolder))
+                    .build()) {
+                db.initialize();
+
+                db.close();
+                db.put(KEY_2, VALUE_2);
+            }
+        });
+    }
+
+    @Test
+    public void testColumnFamilies(@TempDir Path temporaryFolder) throws Exception {
         String secondFamilyName = "second family";
         try (RocksDBMetronome db = new RocksDBMetronome.Builder()
-                .setStoragePath(temporaryFolder.newFolder().toPath())
+                .setStoragePath(newFolder(temporaryFolder))
                 .addColumnFamily(secondFamilyName)
                 .build()) {
             db.initialize();
@@ -210,9 +214,9 @@
     }
 
     @Test
-    public void testIterator() throws Exception {
+    public void testIterator(@TempDir Path temporaryFolder) throws Exception {
         try (RocksDBMetronome db = new RocksDBMetronome.Builder()
-                .setStoragePath(temporaryFolder.newFolder().toPath())
+                .setStoragePath(newFolder(temporaryFolder))
                 .build()) {
             db.initialize();
 
@@ -236,9 +240,9 @@
     }
 
     @Test
-    public void testCounterIncrement() throws Exception {
+    public void testCounterIncrement(@TempDir Path temporaryFolder) throws Exception {
         try (RocksDBMetronome db = new RocksDBMetronome.Builder()
-                .setStoragePath(temporaryFolder.newFolder().toPath())
+                .setStoragePath(newFolder(temporaryFolder))
                 .setSyncMillis(Long.MAX_VALUE) // effectively disable the auto-sync
                 .build()) {
             db.initialize();
@@ -254,10 +258,11 @@
         }
     }
 
-    @Test(timeout = 10_000)
-    public void testWaitForSync() throws Exception {
+    @Test
+    @Timeout(unit = TimeUnit.MILLISECONDS, value = 10_000)
+    public void testWaitForSync(@TempDir Path temporaryFolder) throws Exception {
         try (RocksDBMetronome db = new RocksDBMetronome.Builder()
-                .setStoragePath(temporaryFolder.newFolder().toPath())
+                .setStoragePath(newFolder(temporaryFolder))
                 .setSyncMillis(Long.MAX_VALUE) // effectively disable the auto-sync
                 .build()) {
             db.initialize();
@@ -285,10 +290,11 @@
         }
     }
 
-    @Test(timeout = 10_000)
-    public void testWaitForSyncWithValue() throws Exception {
+    @Test
+    @Timeout(unit = TimeUnit.MILLISECONDS, value = 10_000)
+    public void testWaitForSyncWithValue(@TempDir Path temporaryFolder) throws Exception {
         try (RocksDBMetronome db = new RocksDBMetronome.Builder()
-                .setStoragePath(temporaryFolder.newFolder().toPath())
+                .setStoragePath(newFolder(temporaryFolder))
                 .setSyncMillis(Long.MAX_VALUE) // effectively disable the auto-sync
                 .build()) {
             db.initialize();
@@ -312,15 +318,11 @@
         }
     }
 
-    private void assertBlocks(RocksDBMetronome db, int counterValue) throws InterruptedException, java.util.concurrent.ExecutionException {
+    private void assertBlocks(RocksDBMetronome db, int counterValue) {
         Future<Boolean> future = getWaitForSyncFuture(db, counterValue);
 
-        try {
-            future.get(1, TimeUnit.SECONDS);
-            fail();
-        } catch (TimeoutException expected) {
-            assertFalse(future.isDone());
-        }
+        assertThrows(TimeoutException.class, () -> future.get(1, TimeUnit.SECONDS));
+        assertFalse(future.isDone());
         future.cancel(true);
     }
 
diff --git a/nifi-commons/nifi-schema-utils/src/test/java/org/apache/nifi/repository/schema/TestSchemaRecordReader.java b/nifi-commons/nifi-schema-utils/src/test/java/org/apache/nifi/repository/schema/TestSchemaRecordReader.java
index d5a4cfd..65b2736 100644
--- a/nifi-commons/nifi-schema-utils/src/test/java/org/apache/nifi/repository/schema/TestSchemaRecordReader.java
+++ b/nifi-commons/nifi-schema-utils/src/test/java/org/apache/nifi/repository/schema/TestSchemaRecordReader.java
@@ -17,11 +17,7 @@
 
 package org.apache.nifi.repository.schema;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
+import org.junit.jupiter.api.Test;
 
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
@@ -34,7 +30,11 @@
 import java.util.List;
 import java.util.Map;
 
-import org.junit.Test;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
 public class TestSchemaRecordReader {
 
diff --git a/nifi-commons/nifi-schema-utils/src/test/java/org/apache/nifi/repository/schema/TestSchemaRecordReaderWriter.java b/nifi-commons/nifi-schema-utils/src/test/java/org/apache/nifi/repository/schema/TestSchemaRecordReaderWriter.java
index 5dc5cd8..c177b61 100644
--- a/nifi-commons/nifi-schema-utils/src/test/java/org/apache/nifi/repository/schema/TestSchemaRecordReaderWriter.java
+++ b/nifi-commons/nifi-schema-utils/src/test/java/org/apache/nifi/repository/schema/TestSchemaRecordReaderWriter.java
@@ -17,11 +17,8 @@
 
 package org.apache.nifi.repository.schema;
 
-import static org.apache.nifi.repository.schema.SchemaRecordWriter.MAX_ALLOWED_UTF_LENGTH;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
+import org.apache.commons.lang3.StringUtils;
+import org.junit.jupiter.api.Test;
 
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
@@ -35,8 +32,11 @@
 import java.util.List;
 import java.util.Map;
 
-import org.apache.commons.lang3.StringUtils;
-import org.junit.Test;
+import static org.apache.nifi.repository.schema.SchemaRecordWriter.MAX_ALLOWED_UTF_LENGTH;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
 public class TestSchemaRecordReaderWriter {
 
@@ -237,69 +237,69 @@
     @Test
     public void testSingleCharUTF8Lengths() {
         // verify handling of single characters mapping to utf8 byte strings
-        assertEquals("test 1 char string truncated to 0 utf bytes should be 0", 0, SchemaRecordWriter.getCharsInUTF8Limit(utfStringOneByte, 0));
-        assertEquals("test 2 char string truncated to 0 utf bytes should be 0", 0, SchemaRecordWriter.getCharsInUTF8Limit(utfStringTwoByte, 0));
-        assertEquals("test 3 char string truncated to 0 utf bytes should be 0", 0, SchemaRecordWriter.getCharsInUTF8Limit(utfStringThreeByte, 0));
-        assertEquals("test 1 char string truncated to 1 utf bytes should be 1", 1, SchemaRecordWriter.getCharsInUTF8Limit(utfStringOneByte, 1));
-        assertEquals("test 2 char string truncated to 1 utf bytes should be 0", 0, SchemaRecordWriter.getCharsInUTF8Limit(utfStringTwoByte, 1));
-        assertEquals("test 3 char string truncated to 1 utf bytes should be 0", 0, SchemaRecordWriter.getCharsInUTF8Limit(utfStringThreeByte, 1));
-        assertEquals("test 1 char string truncated to 2 utf bytes should be 1", 1, SchemaRecordWriter.getCharsInUTF8Limit(utfStringOneByte, 2));
-        assertEquals("test 2 char string truncated to 2 utf bytes should be 2", 1, SchemaRecordWriter.getCharsInUTF8Limit(utfStringTwoByte, 2));
-        assertEquals("test 3 char string truncated to 2 utf bytes should be 0", 0, SchemaRecordWriter.getCharsInUTF8Limit(utfStringThreeByte, 2));
-        assertEquals("test 1 char string truncated to 3 utf bytes should be 1", 1, SchemaRecordWriter.getCharsInUTF8Limit(utfStringOneByte, 3));
-        assertEquals("test 2 char string truncated to 3 utf bytes should be 2", 1, SchemaRecordWriter.getCharsInUTF8Limit(utfStringTwoByte, 3));
-        assertEquals("test 3 char string truncated to 3 utf bytes should be 3", 1, SchemaRecordWriter.getCharsInUTF8Limit(utfStringThreeByte, 3));
+        assertEquals(0, SchemaRecordWriter.getCharsInUTF8Limit(utfStringOneByte, 0), "test 1 char string truncated to 0 utf bytes should be 0");
+        assertEquals(0, SchemaRecordWriter.getCharsInUTF8Limit(utfStringTwoByte, 0), "test 2 char string truncated to 0 utf bytes should be 0");
+        assertEquals(0, SchemaRecordWriter.getCharsInUTF8Limit(utfStringThreeByte, 0), "test 3 char string truncated to 0 utf bytes should be 0");
+        assertEquals(1, SchemaRecordWriter.getCharsInUTF8Limit(utfStringOneByte, 1), "test 1 char string truncated to 1 utf bytes should be 1");
+        assertEquals(0, SchemaRecordWriter.getCharsInUTF8Limit(utfStringTwoByte, 1), "test 2 char string truncated to 1 utf bytes should be 0");
+        assertEquals(0, SchemaRecordWriter.getCharsInUTF8Limit(utfStringThreeByte, 1), "test 3 char string truncated to 1 utf bytes should be 0");
+        assertEquals(1, SchemaRecordWriter.getCharsInUTF8Limit(utfStringOneByte, 2), "test 1 char string truncated to 2 utf bytes should be 1");
+        assertEquals(1, SchemaRecordWriter.getCharsInUTF8Limit(utfStringTwoByte, 2), "test 2 char string truncated to 2 utf bytes should be 2");
+        assertEquals(0, SchemaRecordWriter.getCharsInUTF8Limit(utfStringThreeByte, 2), "test 3 char string truncated to 2 utf bytes should be 0");
+        assertEquals(1, SchemaRecordWriter.getCharsInUTF8Limit(utfStringOneByte, 3), "test 1 char string truncated to 3 utf bytes should be 1");
+        assertEquals(1, SchemaRecordWriter.getCharsInUTF8Limit(utfStringTwoByte, 3), "test 2 char string truncated to 3 utf bytes should be 2");
+        assertEquals(1, SchemaRecordWriter.getCharsInUTF8Limit(utfStringThreeByte, 3), "test 3 char string truncated to 3 utf bytes should be 3");
     }
 
     @Test
     public void testMultiCharUTFLengths() {
         // test boundary conditions as 1, 2, and 3 UTF byte chars are included into utf limit                                                  positions used by strings
         final String testString1 = utfStringOneByte + utfStringTwoByte + utfStringThreeByte;                                                // char 'abc' utf 'abbccc'
-        assertEquals("test 6 char string truncated to 0 utf bytes should be 0", 0, SchemaRecordWriter.getCharsInUTF8Limit(testString1, 0)); //            utf ''
-        assertEquals("test 6 char string truncated to 1 utf bytes should be 1", 1, SchemaRecordWriter.getCharsInUTF8Limit(testString1, 1)); //            utf 'a'
-        assertEquals("test 6 char string truncated to 2 utf bytes should be 1", 1, SchemaRecordWriter.getCharsInUTF8Limit(testString1, 2)); //            utf 'a'
-        assertEquals("test 6 char string truncated to 3 utf bytes should be 2", 2, SchemaRecordWriter.getCharsInUTF8Limit(testString1, 3)); //            utf 'abb'
-        assertEquals("test 6 char string truncated to 4 utf bytes should be 2", 2, SchemaRecordWriter.getCharsInUTF8Limit(testString1, 4)); //            utf 'abb'
-        assertEquals("test 6 char string truncated to 5 utf bytes should be 2", 2, SchemaRecordWriter.getCharsInUTF8Limit(testString1, 5)); //            utf 'abb'
-        assertEquals("test 6 char string truncated to 6 utf bytes should be 3", 3, SchemaRecordWriter.getCharsInUTF8Limit(testString1, 6)); //            utf 'abbccc'
+        assertEquals(0, SchemaRecordWriter.getCharsInUTF8Limit(testString1, 0), "test 6 char string truncated to 0 utf bytes should be 0"); //            utf ''
+        assertEquals(1, SchemaRecordWriter.getCharsInUTF8Limit(testString1, 1), "test 6 char string truncated to 1 utf bytes should be 1"); //            utf 'a'
+        assertEquals(1, SchemaRecordWriter.getCharsInUTF8Limit(testString1, 2), "test 6 char string truncated to 2 utf bytes should be 1"); //            utf 'a'
+        assertEquals(2, SchemaRecordWriter.getCharsInUTF8Limit(testString1, 3), "test 6 char string truncated to 3 utf bytes should be 2"); //            utf 'abb'
+        assertEquals(2, SchemaRecordWriter.getCharsInUTF8Limit(testString1, 4), "test 6 char string truncated to 4 utf bytes should be 2"); //            utf 'abb'
+        assertEquals(2, SchemaRecordWriter.getCharsInUTF8Limit(testString1, 5), "test 6 char string truncated to 5 utf bytes should be 2"); //            utf 'abb'
+        assertEquals(3, SchemaRecordWriter.getCharsInUTF8Limit(testString1, 6), "test 6 char string truncated to 6 utf bytes should be 3"); //            utf 'abbccc'
     }
 
     @Test
     public void testSmallCharUTFLengths() throws UnsupportedEncodingException {
         final String string12b = StringUtils.repeat(utfStringOneByte + utfStringTwoByte + utfStringThreeByte, 2);
 
-        assertEquals("test multi-char string truncated to  0 utf bytes should be 0", 0, SchemaRecordWriter.getCharsInUTF8Limit(string12b,  0));
-        assertEquals("test multi-char string truncated to  1 utf bytes should be 0", 1, SchemaRecordWriter.getCharsInUTF8Limit(string12b,  1));
-        assertEquals("test multi-char string truncated to  2 utf bytes should be 0", 1, SchemaRecordWriter.getCharsInUTF8Limit(string12b,  2));
-        assertEquals("test multi-char string truncated to  3 utf bytes should be 0", 2, SchemaRecordWriter.getCharsInUTF8Limit(string12b,  3));
-        assertEquals("test multi-char string truncated to  4 utf bytes should be 0", 2, SchemaRecordWriter.getCharsInUTF8Limit(string12b,  4));
-        assertEquals("test multi-char string truncated to  5 utf bytes should be 0", 2, SchemaRecordWriter.getCharsInUTF8Limit(string12b,  5));
-        assertEquals("test multi-char string truncated to  6 utf bytes should be 0", 3, SchemaRecordWriter.getCharsInUTF8Limit(string12b,  6));
-        assertEquals("test multi-char string truncated to  7 utf bytes should be 0", 4, SchemaRecordWriter.getCharsInUTF8Limit(string12b,  7));
-        assertEquals("test multi-char string truncated to  8 utf bytes should be 0", 4, SchemaRecordWriter.getCharsInUTF8Limit(string12b,  8));
-        assertEquals("test multi-char string truncated to  9 utf bytes should be 0", 5, SchemaRecordWriter.getCharsInUTF8Limit(string12b,  9));
-        assertEquals("test multi-char string truncated to 10 utf bytes should be 0", 5, SchemaRecordWriter.getCharsInUTF8Limit(string12b, 10));
-        assertEquals("test multi-char string truncated to 11 utf bytes should be 0", 5, SchemaRecordWriter.getCharsInUTF8Limit(string12b, 11));
-        assertEquals("test multi-char string truncated to 12 utf bytes should be 0", 6, SchemaRecordWriter.getCharsInUTF8Limit(string12b, 12));
+        assertEquals(0, SchemaRecordWriter.getCharsInUTF8Limit(string12b,  0), "test multi-char string truncated to  0 utf bytes should be 0");
+        assertEquals(1, SchemaRecordWriter.getCharsInUTF8Limit(string12b,  1), "test multi-char string truncated to  1 utf bytes should be 0");
+        assertEquals(1, SchemaRecordWriter.getCharsInUTF8Limit(string12b,  2), "test multi-char string truncated to  2 utf bytes should be 0");
+        assertEquals(2, SchemaRecordWriter.getCharsInUTF8Limit(string12b,  3), "test multi-char string truncated to  3 utf bytes should be 0");
+        assertEquals(2, SchemaRecordWriter.getCharsInUTF8Limit(string12b,  4), "test multi-char string truncated to  4 utf bytes should be 0");
+        assertEquals(2, SchemaRecordWriter.getCharsInUTF8Limit(string12b,  5), "test multi-char string truncated to  5 utf bytes should be 0");
+        assertEquals(3, SchemaRecordWriter.getCharsInUTF8Limit(string12b,  6), "test multi-char string truncated to  6 utf bytes should be 0");
+        assertEquals(4, SchemaRecordWriter.getCharsInUTF8Limit(string12b,  7), "test multi-char string truncated to  7 utf bytes should be 0");
+        assertEquals(4, SchemaRecordWriter.getCharsInUTF8Limit(string12b,  8), "test multi-char string truncated to  8 utf bytes should be 0");
+        assertEquals(5, SchemaRecordWriter.getCharsInUTF8Limit(string12b,  9), "test multi-char string truncated to  9 utf bytes should be 0");
+        assertEquals(5, SchemaRecordWriter.getCharsInUTF8Limit(string12b, 10), "test multi-char string truncated to 10 utf bytes should be 0");
+        assertEquals(5, SchemaRecordWriter.getCharsInUTF8Limit(string12b, 11), "test multi-char string truncated to 11 utf bytes should be 0");
+        assertEquals(6, SchemaRecordWriter.getCharsInUTF8Limit(string12b, 12), "test multi-char string truncated to 12 utf bytes should be 0");
     }
 
     @Test
     public void testLargeCharUTFLengths() {
         final String string64k = StringUtils.repeat(utfStringOneByte + utfStringTwoByte + utfStringThreeByte, 21845);
 
-        assertEquals("test 64k char string should be 64k chars long", 65535, string64k.length());
+        assertEquals(65535, string64k.length(), "test 64k char string should be 64k chars long");
 
         // drop half the chars going to utf of 64k bytes -- (1+1+1) * 21845 = 65535 chars which converts to (1+2+3) * 21845 = 131070 utf bytes so 1/2 is truncated
-        assertEquals("test 64k char string truncated to 65,535 utf bytes should be 32768", 32768, SchemaRecordWriter.getCharsInUTF8Limit(string64k, 65535));
+        assertEquals(32768, SchemaRecordWriter.getCharsInUTF8Limit(string64k, 65535), "test 64k char string truncated to 65,535 utf bytes should be 32768");
 
         // dropping bytes off the end of utf length
-        assertEquals("test 64k char string truncated to 65,534 utf bytes should be 32767", 32767, SchemaRecordWriter.getCharsInUTF8Limit(string64k, 65534)); // lost 2 byte char
-        assertEquals("test 64k char string truncated to 65,533 utf bytes should be 32767", 32767, SchemaRecordWriter.getCharsInUTF8Limit(string64k, 65533));
-        assertEquals("test 64k char string truncated to 65,532 utf bytes should be 32766", 32766, SchemaRecordWriter.getCharsInUTF8Limit(string64k, 65532)); // lost 1 byte char
-        assertEquals("test 64k char string truncated to 65,531 utf bytes should be 32765", 32765, SchemaRecordWriter.getCharsInUTF8Limit(string64k, 65531)); // lost 3 byte char
-        assertEquals("test 64k char string truncated to 65,530 utf bytes should be 32765", 32765, SchemaRecordWriter.getCharsInUTF8Limit(string64k, 65530));
-        assertEquals("test 64k char string truncated to 65,529 utf bytes should be 32765", 32765, SchemaRecordWriter.getCharsInUTF8Limit(string64k, 65529));
-        assertEquals("test 64k char string truncated to 65,528 utf bytes should be 32764", 32764, SchemaRecordWriter.getCharsInUTF8Limit(string64k, 65528)); // lost 2 byte char (again)
+        assertEquals(32767, SchemaRecordWriter.getCharsInUTF8Limit(string64k, 65534), "test 64k char string truncated to 65,534 utf bytes should be 32767"); // lost 2 byte char
+        assertEquals(32767, SchemaRecordWriter.getCharsInUTF8Limit(string64k, 65533), "test 64k char string truncated to 65,533 utf bytes should be 32767");
+        assertEquals(32766, SchemaRecordWriter.getCharsInUTF8Limit(string64k, 65532), "test 64k char string truncated to 65,532 utf bytes should be 32766"); // lost 1 byte char
+        assertEquals(32765, SchemaRecordWriter.getCharsInUTF8Limit(string64k, 65531), "test 64k char string truncated to 65,531 utf bytes should be 32765"); // lost 3 byte char
+        assertEquals(32765, SchemaRecordWriter.getCharsInUTF8Limit(string64k, 65530), "test 64k char string truncated to 65,530 utf bytes should be 32765");
+        assertEquals(32765, SchemaRecordWriter.getCharsInUTF8Limit(string64k, 65529), "test 64k char string truncated to 65,529 utf bytes should be 32765");
+        assertEquals(32764, SchemaRecordWriter.getCharsInUTF8Limit(string64k, 65528), "test 64k char string truncated to 65,528 utf bytes should be 32764"); // lost 2 byte char (again)
     }
 
     private SimpleRecordField createField(final String fieldName, final FieldType type) {
diff --git a/nifi-commons/nifi-security-kerberos/src/test/java/org/apache/nifi/security/krb/KerberosUserIT.java b/nifi-commons/nifi-security-kerberos/src/test/java/org/apache/nifi/security/krb/KerberosUserIT.java
index 5f8c457..a7a3cb1 100644
--- a/nifi-commons/nifi-security-kerberos/src/test/java/org/apache/nifi/security/krb/KerberosUserIT.java
+++ b/nifi-commons/nifi-security-kerberos/src/test/java/org/apache/nifi/security/krb/KerberosUserIT.java
@@ -18,10 +18,9 @@
 
 import org.apache.nifi.logging.ComponentLog;
 import org.apache.nifi.processor.ProcessContext;
-import org.junit.BeforeClass;
-import org.junit.ClassRule;
-import org.junit.Test;
-import org.junit.rules.TemporaryFolder;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.io.TempDir;
 import org.mockito.Mockito;
 
 import javax.security.auth.Subject;
@@ -29,6 +28,7 @@
 import javax.security.auth.kerberos.KerberosTicket;
 import javax.security.auth.login.LoginException;
 import java.io.File;
+import java.nio.file.Path;
 import java.security.AccessControlContext;
 import java.security.AccessController;
 import java.security.Principal;
@@ -41,13 +41,9 @@
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
+import static org.junit.jupiter.api.Assertions.assertThrows;
 
 public class KerberosUserIT {
-
-    @ClassRule
-    public static TemporaryFolder tmpDir = new TemporaryFolder();
-
     private static KDCServer kdc;
 
     private static KerberosPrincipal principal1;
@@ -59,18 +55,21 @@
     private static KerberosPrincipal principal3;
     private static final String principal3Password = "changeme";
 
-    @BeforeClass
-    public static void setupClass() throws Exception {
-        kdc = new KDCServer(tmpDir.newFolder("mini-kdc_"));
+    @BeforeAll
+    public static void setupClass(@TempDir Path tmpDir) throws Exception {
+        File kdcFolder = tmpDir.resolve("mini-kdc_").toFile();
+        kdcFolder.mkdirs();
+
+        kdc = new KDCServer(kdcFolder);
         kdc.setMaxTicketLifetime("15"); // set ticket lifetime to 15 seconds so we can test relogin
         kdc.start();
 
         principal1 = new KerberosPrincipal("user1@" + kdc.getRealm());
-        principal1KeytabFile = tmpDir.newFile("user1.keytab");
+        principal1KeytabFile = tmpDir.resolve("user1.keytab").toFile();
         kdc.createKeytabPrincipal(principal1KeytabFile, "user1");
 
         principal2 = new KerberosPrincipal("user2@" + kdc.getRealm());
-        principal2KeytabFile = tmpDir.newFile("user2.keytab");
+        principal2KeytabFile = tmpDir.resolve("user2.keytab").toFile();
         kdc.createKeytabPrincipal(principal2KeytabFile, "user2");
 
         principal3 = new KerberosPrincipal("user3@" + kdc.getRealm());
@@ -113,16 +112,10 @@
     }
 
     @Test
-    public void testKeytabLoginWithUnknownPrincipal() throws LoginException {
+    public void testKeytabLoginWithUnknownPrincipal() {
         final String unknownPrincipal = "doesnotexist@" + kdc.getRealm();
         final KerberosUser user1 = new KerberosKeytabUser(unknownPrincipal, principal1KeytabFile.getAbsolutePath());
-        try {
-            user1.login();
-            fail("Login should have failed");
-        } catch (Exception e) {
-            // exception is expected here
-            //e.printStackTrace();
-        }
+        assertThrows(Exception.class, () -> user1.login());
     }
 
     @Test
@@ -147,11 +140,11 @@
         assertEquals(0, userSubject.getPrincipals().size());
     }
 
-    @Test(expected = LoginException.class)
-    public void testPasswordUserLoginWithInvalidPassword() throws LoginException {
+    @Test
+    public void testPasswordUserLoginWithInvalidPassword() {
         // perform login for user
         final KerberosUser user = new KerberosPasswordUser("user3", "NOT THE PASSWORD");
-        user.login();
+        assertThrows(LoginException.class, () -> user.login());
     }
 
     @Test
diff --git a/nifi-commons/nifi-security-kms/src/test/java/org/apache/nifi/security/kms/FileBasedKeyProviderTest.java b/nifi-commons/nifi-security-kms/src/test/java/org/apache/nifi/security/kms/FileBasedKeyProviderTest.java
index 09daf8a..56f920c 100644
--- a/nifi-commons/nifi-security-kms/src/test/java/org/apache/nifi/security/kms/FileBasedKeyProviderTest.java
+++ b/nifi-commons/nifi-security-kms/src/test/java/org/apache/nifi/security/kms/FileBasedKeyProviderTest.java
@@ -17,7 +17,7 @@
 package org.apache.nifi.security.kms;
 
 import org.apache.nifi.security.kms.util.SecretKeyUtils;
-import org.junit.Test;
+import org.junit.jupiter.api.Test;
 
 import javax.crypto.SecretKey;
 import java.io.FileOutputStream;
@@ -31,9 +31,9 @@
 import java.util.Properties;
 import java.util.UUID;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
 public class FileBasedKeyProviderTest {
     private static final String KEYS_EXTENSION = ".keys";
diff --git a/nifi-commons/nifi-security-kms/src/test/java/org/apache/nifi/security/kms/KeyProviderFactoryTest.java b/nifi-commons/nifi-security-kms/src/test/java/org/apache/nifi/security/kms/KeyProviderFactoryTest.java
index bf3ea04..72d7fab 100644
--- a/nifi-commons/nifi-security-kms/src/test/java/org/apache/nifi/security/kms/KeyProviderFactoryTest.java
+++ b/nifi-commons/nifi-security-kms/src/test/java/org/apache/nifi/security/kms/KeyProviderFactoryTest.java
@@ -22,7 +22,7 @@
 import org.apache.nifi.security.kms.configuration.KeyStoreKeyProviderConfiguration;
 import org.apache.nifi.security.kms.configuration.StaticKeyProviderConfiguration;
 import org.apache.nifi.security.kms.util.SecretKeyUtils;
-import org.junit.Test;
+import org.junit.jupiter.api.Test;
 
 import javax.crypto.SecretKey;
 import java.io.File;
@@ -32,8 +32,8 @@
 import java.util.Collections;
 import java.util.Map;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertThrows;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertThrows;
 
 public class KeyProviderFactoryTest {
 
diff --git a/nifi-commons/nifi-security-kms/src/test/java/org/apache/nifi/security/kms/KeyStoreKeyProviderTest.java b/nifi-commons/nifi-security-kms/src/test/java/org/apache/nifi/security/kms/KeyStoreKeyProviderTest.java
index 5210ad5..83516f1 100644
--- a/nifi-commons/nifi-security-kms/src/test/java/org/apache/nifi/security/kms/KeyStoreKeyProviderTest.java
+++ b/nifi-commons/nifi-security-kms/src/test/java/org/apache/nifi/security/kms/KeyStoreKeyProviderTest.java
@@ -17,8 +17,8 @@
 package org.apache.nifi.security.kms;
 
 import org.apache.nifi.security.kms.util.SecretKeyUtils;
-import org.junit.BeforeClass;
-import org.junit.Test;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.Test;
 
 import javax.crypto.SecretKey;
 import java.io.IOException;
@@ -28,9 +28,9 @@
 import java.util.List;
 import java.util.UUID;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertThrows;
-import static org.junit.Assert.assertTrue;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
 public class KeyStoreKeyProviderTest {
     private static final String KEY_ID = UUID.randomUUID().toString();
@@ -43,7 +43,7 @@
 
     private static KeyStore keyStore;
 
-    @BeforeClass
+    @BeforeAll
     public static void setKeyStore() throws GeneralSecurityException, IOException {
         keyStore = getKeyStore();
     }
diff --git a/nifi-commons/nifi-security-kms/src/test/java/org/apache/nifi/security/kms/StaticKeyProviderTest.java b/nifi-commons/nifi-security-kms/src/test/java/org/apache/nifi/security/kms/StaticKeyProviderTest.java
index 3f1aaad..278e6b3 100644
--- a/nifi-commons/nifi-security-kms/src/test/java/org/apache/nifi/security/kms/StaticKeyProviderTest.java
+++ b/nifi-commons/nifi-security-kms/src/test/java/org/apache/nifi/security/kms/StaticKeyProviderTest.java
@@ -17,7 +17,7 @@
 package org.apache.nifi.security.kms;
 
 import org.apache.nifi.security.kms.util.SecretKeyUtils;
-import org.junit.Test;
+import org.junit.jupiter.api.Test;
 
 import javax.crypto.SecretKey;
 import java.security.KeyManagementException;
@@ -25,9 +25,9 @@
 import java.util.List;
 import java.util.UUID;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertThrows;
-import static org.junit.Assert.assertTrue;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
 public class StaticKeyProviderTest {
     private static final String KEY_ID = UUID.randomUUID().toString();
diff --git a/nifi-commons/nifi-security-kms/src/test/java/org/apache/nifi/security/kms/reader/StandardFileBasedKeyReaderTest.java b/nifi-commons/nifi-security-kms/src/test/java/org/apache/nifi/security/kms/reader/StandardFileBasedKeyReaderTest.java
index cd0f9e72..4a6eecc 100644
--- a/nifi-commons/nifi-security-kms/src/test/java/org/apache/nifi/security/kms/reader/StandardFileBasedKeyReaderTest.java
+++ b/nifi-commons/nifi-security-kms/src/test/java/org/apache/nifi/security/kms/reader/StandardFileBasedKeyReaderTest.java
@@ -17,7 +17,7 @@
 package org.apache.nifi.security.kms.reader;
 
 import org.apache.nifi.security.kms.util.SecretKeyUtils;
-import org.junit.Test;
+import org.junit.jupiter.api.Test;
 
 import javax.crypto.SecretKey;
 import java.io.FileOutputStream;
@@ -28,7 +28,7 @@
 import java.util.Map;
 import java.util.Properties;
 
-import static org.junit.Assert.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertEquals;
 
 public class StandardFileBasedKeyReaderTest {
     private static final String KEYS_EXTENSION = ".keys";
@@ -45,7 +45,7 @@
         final Path path = getSecretKeysPath(ROOT_KEY, Collections.singletonMap(keyId, secretKey));
         final Map<String, SecretKey> secretKeys = reader.readSecretKeys(path, ROOT_KEY);
         final SecretKey readSecretKey = secretKeys.get(keyId);
-        assertEquals("Secret Key not matched", secretKey, readSecretKey);
+        assertEquals(secretKey, readSecretKey, "Secret Key not matched");
     }
 
     private Path getSecretKeysPath(final SecretKey rootKey, final Map<String, SecretKey> secretKeys) throws Exception {
diff --git a/nifi-commons/nifi-security-socket-ssl/src/test/java/org/apache/nifi/remote/io/socket/ssl/SSLSocketChannelTest.java b/nifi-commons/nifi-security-socket-ssl/src/test/java/org/apache/nifi/remote/io/socket/ssl/SSLSocketChannelTest.java
index cb15959..491e282 100644
--- a/nifi-commons/nifi-security-socket-ssl/src/test/java/org/apache/nifi/remote/io/socket/ssl/SSLSocketChannelTest.java
+++ b/nifi-commons/nifi-security-socket-ssl/src/test/java/org/apache/nifi/remote/io/socket/ssl/SSLSocketChannelTest.java
@@ -170,12 +170,14 @@
     }
 
     @Test
+    @Timeout(value = CHANNEL_TIMEOUT, unit = TimeUnit.MILLISECONDS)
     public void testServerReadWriteTls12() throws Exception {
         assertServerChannelConnectedReadClosed(TLS_1_2);
     }
 
     @EnabledIf(TLS_1_3_SUPPORTED)
     @Test
+    @Timeout(value = CHANNEL_TIMEOUT, unit = TimeUnit.MILLISECONDS)
     public void testServerReadWriteTls13() throws Exception {
         assertServerChannelConnectedReadClosed(TLS_1_3);
     }
diff --git a/nifi-commons/nifi-security-utils-api/src/test/groovy/org/apache/nifi/security/util/TlsConfigurationTest.groovy b/nifi-commons/nifi-security-utils-api/src/test/groovy/org/apache/nifi/security/util/TlsConfigurationTest.groovy
index 88e9524..0881251 100644
--- a/nifi-commons/nifi-security-utils-api/src/test/groovy/org/apache/nifi/security/util/TlsConfigurationTest.groovy
+++ b/nifi-commons/nifi-security-utils-api/src/test/groovy/org/apache/nifi/security/util/TlsConfigurationTest.groovy
@@ -16,34 +16,30 @@
  */
 package org.apache.nifi.security.util
 
-
-import org.junit.After
-import org.junit.Before
-import org.junit.BeforeClass
-import org.junit.Test
-import org.junit.runner.RunWith
-import org.junit.runners.JUnit4
+import org.junit.jupiter.api.AfterEach
+import org.junit.jupiter.api.BeforeAll
+import org.junit.jupiter.api.BeforeEach
+import org.junit.jupiter.api.Test
 import org.slf4j.Logger
 import org.slf4j.LoggerFactory
 
-@RunWith(JUnit4.class)
 class TlsConfigurationTest extends GroovyTestCase {
     private static final Logger logger = LoggerFactory.getLogger(TlsConfigurationTest.class)
 
-    @BeforeClass
+    @BeforeAll
     static void setUpOnce() {
         logger.metaClass.methodMissing = { String name, args ->
             logger.info("[${name?.toUpperCase()}] ${(args as List).join(" ")}")
         }
     }
 
-    @Before
+    @BeforeEach
     void setUp() {
         super.setUp()
 
     }
 
-    @After
+    @AfterEach
     void tearDown() {
 
     }
diff --git a/nifi-commons/nifi-security-utils-api/src/test/java/org/apache/nifi/security/util/TlsPlatformTest.java b/nifi-commons/nifi-security-utils-api/src/test/java/org/apache/nifi/security/util/TlsPlatformTest.java
index 576c199..ff413c0 100644
--- a/nifi-commons/nifi-security-utils-api/src/test/java/org/apache/nifi/security/util/TlsPlatformTest.java
+++ b/nifi-commons/nifi-security-utils-api/src/test/java/org/apache/nifi/security/util/TlsPlatformTest.java
@@ -16,16 +16,16 @@
  */
 package org.apache.nifi.security.util;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.fail;
-
-import org.junit.Test;
+import org.junit.jupiter.api.Test;
 
 import java.util.Set;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertNotEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.fail;
+
 public class TlsPlatformTest {
     private static final int ZERO_LENGTH = 0;
 
diff --git a/nifi-commons/nifi-security-utils/src/test/groovy/org/apache/nifi/security/util/CertificateUtilsTest.groovy b/nifi-commons/nifi-security-utils/src/test/groovy/org/apache/nifi/security/util/CertificateUtilsTest.groovy
index 6155a9a..786e140 100644
--- a/nifi-commons/nifi-security-utils/src/test/groovy/org/apache/nifi/security/util/CertificateUtilsTest.groovy
+++ b/nifi-commons/nifi-security-utils/src/test/groovy/org/apache/nifi/security/util/CertificateUtilsTest.groovy
@@ -20,22 +20,14 @@
 import org.bouncycastle.asn1.x500.X500Name
 import org.bouncycastle.asn1.x500.style.BCStyle
 import org.bouncycastle.asn1.x500.style.IETFUtils
-import org.bouncycastle.asn1.x509.Extension
-import org.bouncycastle.asn1.x509.Extensions
-import org.bouncycastle.asn1.x509.ExtensionsGenerator
-import org.bouncycastle.asn1.x509.GeneralName
-import org.bouncycastle.asn1.x509.GeneralNames
+import org.bouncycastle.asn1.x509.*
 import org.bouncycastle.operator.OperatorCreationException
 import org.bouncycastle.operator.jcajce.JcaContentSignerBuilder
 import org.bouncycastle.pkcs.jcajce.JcaPKCS10CertificationRequest
 import org.bouncycastle.pkcs.jcajce.JcaPKCS10CertificationRequestBuilder
 import org.bouncycastle.util.IPAddress
-import org.junit.After
-import org.junit.Before
-import org.junit.BeforeClass
-import org.junit.Test
-import org.junit.runner.RunWith
-import org.junit.runners.JUnit4
+import org.junit.jupiter.api.BeforeAll
+import org.junit.jupiter.api.Test
 import org.slf4j.Logger
 import org.slf4j.LoggerFactory
 
@@ -43,27 +35,15 @@
 import javax.net.ssl.SSLPeerUnverifiedException
 import javax.net.ssl.SSLSession
 import javax.net.ssl.SSLSocket
-import java.security.InvalidKeyException
-import java.security.KeyPair
-import java.security.KeyPairGenerator
-import java.security.NoSuchAlgorithmException
-import java.security.NoSuchProviderException
-import java.security.SignatureException
+import java.security.*
 import java.security.cert.Certificate
 import java.security.cert.CertificateException
 import java.security.cert.X509Certificate
-import java.util.concurrent.Callable
-import java.util.concurrent.ConcurrentHashMap
-import java.util.concurrent.ExecutionException
-import java.util.concurrent.Executors
-import java.util.concurrent.Future
-import java.util.concurrent.TimeUnit
+import java.util.concurrent.*
 import java.util.concurrent.atomic.AtomicBoolean
 
-import static org.junit.Assert.assertEquals
 import static org.junit.Assert.assertTrue
 
-@RunWith(JUnit4.class)
 class CertificateUtilsTest extends GroovyTestCase {
     private static final Logger logger = LoggerFactory.getLogger(CertificateUtilsTest.class)
 
@@ -80,24 +60,13 @@
     private static final String ISSUER_DN = "CN=NiFi Test CA,OU=Security,O=Apache,ST=CA,C=US"
     private static final List<String> SUBJECT_ALT_NAMES = ["127.0.0.1", "nifi.nifi.apache.org"]
 
-    @BeforeClass
+    @BeforeAll
     static void setUpOnce() {
         logger.metaClass.methodMissing = { String name, args ->
             logger.info("[${name?.toUpperCase()}] ${(args as List).join(" ")}")
         }
     }
 
-    @Before
-    void setUp() {
-        super.setUp()
-
-    }
-
-    @After
-    void tearDown() {
-
-    }
-
     /**
      * Generates a public/private RSA keypair using the default key size.
      *
diff --git a/nifi-commons/nifi-security-utils/src/test/groovy/org/apache/nifi/security/util/crypto/AESKeyedCipherProviderGroovyTest.groovy b/nifi-commons/nifi-security-utils/src/test/groovy/org/apache/nifi/security/util/crypto/AESKeyedCipherProviderGroovyTest.groovy
index 35d1464..1ebc1f5 100644
--- a/nifi-commons/nifi-security-utils/src/test/groovy/org/apache/nifi/security/util/crypto/AESKeyedCipherProviderGroovyTest.groovy
+++ b/nifi-commons/nifi-security-utils/src/test/groovy/org/apache/nifi/security/util/crypto/AESKeyedCipherProviderGroovyTest.groovy
@@ -19,13 +19,8 @@
 import org.apache.commons.codec.binary.Hex
 import org.apache.nifi.security.util.EncryptionMethod
 import org.bouncycastle.jce.provider.BouncyCastleProvider
-import org.junit.After
-import org.junit.Assume
-import org.junit.Before
-import org.junit.BeforeClass
-import org.junit.Test
-import org.junit.runner.RunWith
-import org.junit.runners.JUnit4
+import org.junit.jupiter.api.BeforeAll
+import org.junit.jupiter.api.Test
 import org.slf4j.Logger
 import org.slf4j.LoggerFactory
 
@@ -36,8 +31,8 @@
 import java.security.Security
 
 import static groovy.test.GroovyAssert.shouldFail
+import static org.junit.jupiter.api.Assumptions.assumeTrue
 
-@RunWith(JUnit4.class)
 class AESKeyedCipherProviderGroovyTest {
     private static final Logger logger = LoggerFactory.getLogger(AESKeyedCipherProviderGroovyTest.class)
 
@@ -49,7 +44,7 @@
 
     private static final SecretKey key = new SecretKeySpec(Hex.decodeHex(KEY_HEX as char[]), "AES")
 
-    @BeforeClass
+    @BeforeAll
     static void setUpOnce() throws Exception {
         Security.addProvider(new BouncyCastleProvider())
 
@@ -58,14 +53,6 @@
         }
     }
 
-    @Before
-    void setUp() throws Exception {
-    }
-
-    @After
-    void tearDown() throws Exception {
-    }
-
     private static boolean isUnlimitedStrengthCryptoAvailable() {
         Cipher.getMaxAllowedKeyLength("AES") > 128
     }
@@ -127,7 +114,7 @@
     @Test
     void testGetCipherWithUnlimitedStrengthShouldBeInternallyConsistent() throws Exception {
         // Arrange
-        Assume.assumeTrue("Test is being skipped due to this JVM lacking JCE Unlimited Strength Jurisdiction Policy file.", isUnlimitedStrengthCryptoAvailable())
+        assumeTrue(isUnlimitedStrengthCryptoAvailable(), "Test is being skipped due to this JVM lacking JCE Unlimited Strength Jurisdiction Policy file.")
 
         KeyedCipherProvider cipherProvider = new AESKeyedCipherProvider()
         final List<Integer> LONG_KEY_LENGTHS = [192, 256]
diff --git a/nifi-commons/nifi-security-utils/src/test/groovy/org/apache/nifi/security/util/crypto/Argon2CipherProviderGroovyTest.groovy b/nifi-commons/nifi-security-utils/src/test/groovy/org/apache/nifi/security/util/crypto/Argon2CipherProviderGroovyTest.groovy
index 79c92d4..1bfb031 100644
--- a/nifi-commons/nifi-security-utils/src/test/groovy/org/apache/nifi/security/util/crypto/Argon2CipherProviderGroovyTest.groovy
+++ b/nifi-commons/nifi-security-utils/src/test/groovy/org/apache/nifi/security/util/crypto/Argon2CipherProviderGroovyTest.groovy
@@ -20,13 +20,10 @@
 import org.apache.commons.codec.binary.Hex
 import org.apache.nifi.security.util.EncryptionMethod
 import org.bouncycastle.jce.provider.BouncyCastleProvider
-import org.junit.After
-import org.junit.Assume
-import org.junit.Before
-import org.junit.BeforeClass
-import org.junit.Test
-import org.junit.runner.RunWith
-import org.junit.runners.JUnit4
+import org.junit.jupiter.api.Assumptions
+import org.junit.jupiter.api.BeforeAll
+import org.junit.jupiter.api.BeforeEach
+import org.junit.jupiter.api.Test
 import org.slf4j.Logger
 import org.slf4j.LoggerFactory
 
@@ -38,7 +35,6 @@
 
 import static groovy.test.GroovyAssert.shouldFail
 
-@RunWith(JUnit4.class)
 class Argon2CipherProviderGroovyTest extends GroovyTestCase {
     private static final Logger logger = LoggerFactory.getLogger(Argon2CipherProviderGroovyTest.class)
 
@@ -53,7 +49,7 @@
     RandomIVPBECipherProvider cipherProvider
     private final IntRange FULL_SALT_LENGTH_RANGE= (49..53)
 
-    @BeforeClass
+    @BeforeAll
     static void setUpOnce() throws Exception {
         Security.addProvider(new BouncyCastleProvider())
 
@@ -70,17 +66,12 @@
         }
     }
 
-    @Before
+    @BeforeEach
     void setUp() throws Exception {
         // Very fast parameters to test for correctness rather than production values
         cipherProvider = new Argon2CipherProvider(1024, 1, 3)
     }
 
-    @After
-    void tearDown() throws Exception {
-
-    }
-
     @Test
     void testGetCipherShouldBeInternallyConsistent() throws Exception {
         // Arrange
@@ -234,8 +225,8 @@
     @Test
     void testGetCipherWithUnlimitedStrengthShouldBeInternallyConsistent() throws Exception {
         // Arrange
-        Assume.assumeTrue("Test is being skipped due to this JVM lacking JCE Unlimited Strength Jurisdiction Policy file.",
-                CipherUtility.isUnlimitedStrengthCryptoSupported())
+        Assumptions.assumeTrue(CipherUtility.isUnlimitedStrengthCryptoSupported(),
+                "Test is being skipped due to this JVM lacking JCE Unlimited Strength Jurisdiction Policy file.")
 
         final String PASSWORD = "shortPassword"
         final byte[] SALT = cipherProvider.generateSalt()
diff --git a/nifi-commons/nifi-security-utils/src/test/groovy/org/apache/nifi/security/util/crypto/Argon2SecureHasherTest.groovy b/nifi-commons/nifi-security-utils/src/test/groovy/org/apache/nifi/security/util/crypto/Argon2SecureHasherTest.groovy
index 7c80281..05ee9fb 100644
--- a/nifi-commons/nifi-security-utils/src/test/groovy/org/apache/nifi/security/util/crypto/Argon2SecureHasherTest.groovy
+++ b/nifi-commons/nifi-security-utils/src/test/groovy/org/apache/nifi/security/util/crypto/Argon2SecureHasherTest.groovy
@@ -18,22 +18,20 @@
 
 import org.bouncycastle.jce.provider.BouncyCastleProvider
 import org.bouncycastle.util.encoders.Hex
-import org.junit.BeforeClass
-import org.junit.Ignore
-import org.junit.Test
-import org.junit.runner.RunWith
-import org.junit.runners.JUnit4
+import org.junit.jupiter.api.BeforeAll
+import org.junit.jupiter.api.Disabled
+import org.junit.jupiter.api.Test
+import org.junit.jupiter.api.condition.EnabledIfSystemProperty
 import org.slf4j.Logger
 import org.slf4j.LoggerFactory
 
 import java.nio.charset.StandardCharsets
 import java.security.Security
 
-@RunWith(JUnit4.class)
 class Argon2SecureHasherTest extends GroovyTestCase {
     private static final Logger logger = LoggerFactory.getLogger(Argon2SecureHasherTest.class)
 
-    @BeforeClass
+    @BeforeAll
     static void setUpOnce() throws Exception {
         Security.addProvider(new BouncyCastleProvider())
 
@@ -46,32 +44,6 @@
         Hex.decode(hex?.replaceAll("[^0-9a-fA-F]", ""))
     }
 
-    @Ignore("Cannot override static salt")
-    @Test
-    void testShouldMatchReferenceVectors() {
-        // Arrange
-        int hashLength = 32
-        int memory = 32
-        int parallelism = 4
-        int iterations = 3
-        logger.info("Generating Argon2 hash for hash length: ${hashLength} B, mem: ${memory} KiB, parallelism: ${parallelism}, iterations: ${iterations}")
-
-        Argon2SecureHasher a2sh = new Argon2SecureHasher(hashLength, memory, parallelism, iterations)
-        // Override the static salt for the published test vector
-//        a2sh.staticSalt = [0x02] * 16
-
-        // Act
-        byte[] hash = a2sh.hashRaw([0x01] * 32 as byte[])
-        logger.info("Generated hash: ${Hex.encode(hash)}")
-
-        // Assert
-        assert hash == decodeHex("0d 64 0d f5 8d 78 76 6c 08 c0 37 a3 4a 8b 53 c9 d0 " +
-                "1e f0 45 2d 75 b6 5e b5 25 20 e9 6b 01 e6 59")
-
-        // Clean up
-//        Argon2SecureHasher.staticSalt = "NiFi Static Salt".bytes
-    }
-
     @Test
     void testShouldBeDeterministicWithStaticSalt() {
         // Arrange
@@ -297,7 +269,7 @@
      * This test can have the minimum time threshold updated to determine if the performance
      * is still sufficient compared to the existing threat model.
      */
-    @Ignore("Long running test")
+    @EnabledIfSystemProperty(named = "nifi.test.performance", matches = "true")
     @Test
     void testDefaultCostParamsShouldBeSufficient() {
         // Arrange
diff --git a/nifi-commons/nifi-security-utils/src/test/groovy/org/apache/nifi/security/util/crypto/BcryptCipherProviderGroovyTest.groovy b/nifi-commons/nifi-security-utils/src/test/groovy/org/apache/nifi/security/util/crypto/BcryptCipherProviderGroovyTest.groovy
index 4968d3b..8d28e77 100644
--- a/nifi-commons/nifi-security-utils/src/test/groovy/org/apache/nifi/security/util/crypto/BcryptCipherProviderGroovyTest.groovy
+++ b/nifi-commons/nifi-security-utils/src/test/groovy/org/apache/nifi/security/util/crypto/BcryptCipherProviderGroovyTest.groovy
@@ -21,14 +21,9 @@
 import org.apache.commons.codec.binary.Hex
 import org.apache.nifi.security.util.EncryptionMethod
 import org.bouncycastle.jce.provider.BouncyCastleProvider
-import org.junit.After
-import org.junit.Assume
-import org.junit.Before
-import org.junit.BeforeClass
-import org.junit.Ignore
-import org.junit.Test
-import org.junit.runner.RunWith
-import org.junit.runners.JUnit4
+import org.junit.jupiter.api.BeforeAll
+import org.junit.jupiter.api.Disabled
+import org.junit.jupiter.api.Test
 import org.slf4j.Logger
 import org.slf4j.LoggerFactory
 
@@ -41,8 +36,8 @@
 
 import static groovy.test.GroovyAssert.shouldFail
 import static org.junit.Assert.assertTrue
+import static org.junit.jupiter.api.Assumptions.assumeTrue
 
-@RunWith(JUnit4.class)
 class BcryptCipherProviderGroovyTest {
     private static final Logger logger = LoggerFactory.getLogger(BcryptCipherProviderGroovyTest.class)
 
@@ -54,7 +49,7 @@
     public static final String MICROBENCHMARK = "microbenchmark"
     private static ArrayList<Integer> AES_KEY_LENGTHS
 
-    @BeforeClass
+    @BeforeAll
     static void setUpOnce() throws Exception {
         Security.addProvider(new BouncyCastleProvider())
 
@@ -71,15 +66,6 @@
         }
     }
 
-    @Before
-    void setUp() throws Exception {
-    }
-
-    @After
-    void tearDown() throws Exception {
-
-    }
-
     @Test
     void testGetCipherShouldBeInternallyConsistent() throws Exception {
         // Arrange
@@ -143,8 +129,8 @@
     @Test
     void testGetCipherWithUnlimitedStrengthShouldBeInternallyConsistent() throws Exception {
         // Arrange
-        Assume.assumeTrue("Test is being skipped due to this JVM lacking JCE Unlimited Strength Jurisdiction Policy file.",
-                CipherUtility.isUnlimitedStrengthCryptoSupported())
+        assumeTrue(CipherUtility.isUnlimitedStrengthCryptoSupported(),
+                "Test is being skipped due to this JVM lacking JCE Unlimited Strength Jurisdiction Policy file.")
 
         RandomIVPBECipherProvider cipherProvider = new BcryptCipherProvider(4)
 
@@ -610,7 +596,7 @@
         assert decryptMsg =~ "The salt must be of the format"
     }
 
-    @Ignore("This test can be run on a specific machine to evaluate if the default work factor is sufficient")
+    @Disabled("This test can be run on a specific machine to evaluate if the default work factor is sufficient")
     @Test
     void testDefaultConstructorShouldProvideStrongWorkFactor() {
         // Arrange
diff --git a/nifi-commons/nifi-security-utils/src/test/groovy/org/apache/nifi/security/util/crypto/BcryptSecureHasherTest.groovy b/nifi-commons/nifi-security-utils/src/test/groovy/org/apache/nifi/security/util/crypto/BcryptSecureHasherTest.groovy
index b01a17b..30dbb72 100644
--- a/nifi-commons/nifi-security-utils/src/test/groovy/org/apache/nifi/security/util/crypto/BcryptSecureHasherTest.groovy
+++ b/nifi-commons/nifi-security-utils/src/test/groovy/org/apache/nifi/security/util/crypto/BcryptSecureHasherTest.groovy
@@ -18,37 +18,25 @@
 
 import at.favre.lib.crypto.bcrypt.Radix64Encoder
 import org.bouncycastle.util.encoders.Hex
-import org.junit.After
-import org.junit.Before
-import org.junit.BeforeClass
-import org.junit.Ignore
-import org.junit.Test
-import org.junit.runner.RunWith
-import org.junit.runners.JUnit4
+import org.junit.jupiter.api.BeforeAll
+import org.junit.jupiter.api.Disabled
+import org.junit.jupiter.api.Test
+import org.junit.jupiter.api.condition.EnabledIfSystemProperty
 import org.slf4j.Logger
 import org.slf4j.LoggerFactory
 
 import java.nio.charset.StandardCharsets
 
-@RunWith(JUnit4.class)
 class BcryptSecureHasherTest extends GroovyTestCase {
     private static final Logger logger = LoggerFactory.getLogger(BcryptSecureHasher)
 
-    @BeforeClass
+    @BeforeAll
     static void setupOnce() throws Exception {
         logger.metaClass.methodMissing = { String name, args ->
             logger.info("[${name?.toUpperCase()}] ${(args as List).join(" ")}")
         }
     }
 
-    @Before
-    void setUp() throws Exception {
-    }
-
-    @After
-    void tearDown() throws Exception {
-    }
-
     @Test
     void testShouldBeDeterministicWithStaticSalt() {
         // Arrange
@@ -263,7 +251,7 @@
      * This test can have the minimum time threshold updated to determine if the performance
      * is still sufficient compared to the existing threat model.
      */
-    @Ignore("Long running test")
+    @EnabledIfSystemProperty(named = "nifi.test.performance", matches = "true")
     @Test
     void testDefaultCostParamsShouldBeSufficient() {
         // Arrange
diff --git a/nifi-commons/nifi-security-utils/src/test/groovy/org/apache/nifi/security/util/crypto/CipherProviderFactoryGroovyTest.groovy b/nifi-commons/nifi-security-utils/src/test/groovy/org/apache/nifi/security/util/crypto/CipherProviderFactoryGroovyTest.groovy
index d8e2f1d..d4b0eb3 100644
--- a/nifi-commons/nifi-security-utils/src/test/groovy/org/apache/nifi/security/util/crypto/CipherProviderFactoryGroovyTest.groovy
+++ b/nifi-commons/nifi-security-utils/src/test/groovy/org/apache/nifi/security/util/crypto/CipherProviderFactoryGroovyTest.groovy
@@ -18,19 +18,13 @@
 
 import org.apache.nifi.security.util.KeyDerivationFunction
 import org.bouncycastle.jce.provider.BouncyCastleProvider
-import org.junit.After
-import org.junit.Before
-import org.junit.BeforeClass
-import org.junit.Ignore
-import org.junit.Test
-import org.junit.runner.RunWith
-import org.junit.runners.JUnit4
+import org.junit.jupiter.api.BeforeAll
+import org.junit.jupiter.api.Test
 import org.slf4j.Logger
 import org.slf4j.LoggerFactory
 
 import java.security.Security
 
-@RunWith(JUnit4.class)
 class CipherProviderFactoryGroovyTest extends GroovyTestCase {
     private static final Logger logger = LoggerFactory.getLogger(CipherProviderFactoryGroovyTest.class)
 
@@ -44,7 +38,7 @@
             (KeyDerivationFunction.ARGON2)                  : Argon2CipherProvider.class
     ]
 
-    @BeforeClass
+    @BeforeAll
     static void setUpOnce() throws Exception {
         Security.addProvider(new BouncyCastleProvider())
 
@@ -53,14 +47,6 @@
         }
     }
 
-    @Before
-    void setUp() throws Exception {
-    }
-
-    @After
-    void tearDown() throws Exception {
-    }
-
     @Test
     void testGetCipherProviderShouldResolveRegisteredKDFs() {
         // Arrange
@@ -75,24 +61,4 @@
             assert cp.class == (EXPECTED_CIPHER_PROVIDERS.get(kdf))
         }
     }
-
-    @Ignore("Cannot mock enum using Groovy map coercion")
-    @Test
-    void testGetCipherProviderShouldHandleUnregisteredKDFs() {
-        // Arrange
-
-        // Can't mock this; see http://stackoverflow.com/questions/5323505/mocking-java-enum-to-add-a-value-to-test-fail-case
-        KeyDerivationFunction invalidKDF = [name: "Unregistered", description: "Not a registered KDF"] as KeyDerivationFunction
-        logger.info("Expected: ${invalidKDF.kdfName} -> error")
-
-        // Act
-        def msg = shouldFail(IllegalArgumentException) {
-            CipherProvider cp = CipherProviderFactory.getCipherProvider(invalidKDF)
-            logger.info("Resolved: ${invalidKDF.kdfName} -> ${cp.class.simpleName}")
-        }
-        logger.expected(msg)
-
-        // Assert
-        assert msg =~ "No cipher provider registered for ${invalidKDF.kdfName}"
-    }
 }
diff --git a/nifi-commons/nifi-security-utils/src/test/groovy/org/apache/nifi/security/util/crypto/CipherUtilityGroovyTest.groovy b/nifi-commons/nifi-security-utils/src/test/groovy/org/apache/nifi/security/util/crypto/CipherUtilityGroovyTest.groovy
index bb42a90..22a5ab5 100644
--- a/nifi-commons/nifi-security-utils/src/test/groovy/org/apache/nifi/security/util/crypto/CipherUtilityGroovyTest.groovy
+++ b/nifi-commons/nifi-security-utils/src/test/groovy/org/apache/nifi/security/util/crypto/CipherUtilityGroovyTest.groovy
@@ -20,18 +20,13 @@
 import org.apache.nifi.security.util.EncryptionMethod
 import org.apache.nifi.security.util.KeyDerivationFunction
 import org.bouncycastle.jce.provider.BouncyCastleProvider
-import org.junit.After
-import org.junit.Before
-import org.junit.BeforeClass
-import org.junit.Test
-import org.junit.runner.RunWith
-import org.junit.runners.JUnit4
+import org.junit.jupiter.api.BeforeAll
+import org.junit.jupiter.api.Test
 import org.slf4j.Logger
 import org.slf4j.LoggerFactory
 
 import java.security.Security
 
-@RunWith(JUnit4.class)
 class CipherUtilityGroovyTest extends GroovyTestCase {
     private static final Logger logger = LoggerFactory.getLogger(CipherUtilityGroovyTest.class)
 
@@ -76,7 +71,7 @@
                     "AES/GCM/NoPadding"]
     ]
 
-    @BeforeClass
+    @BeforeAll
     static void setUpOnce() {
         Security.addProvider(new BouncyCastleProvider())
 
@@ -87,16 +82,6 @@
         logger.info("Mapped algorithms: ${ALGORITHMS_MAPPED_BY_CIPHER}")
     }
 
-    @Before
-    void setUp() throws Exception {
-
-    }
-
-    @After
-    void tearDown() throws Exception {
-
-    }
-
     @Test
     void testShouldParseCipherFromAlgorithm() {
         // Arrange
diff --git a/nifi-commons/nifi-security-utils/src/test/groovy/org/apache/nifi/security/util/crypto/HashAlgorithmTest.groovy b/nifi-commons/nifi-security-utils/src/test/groovy/org/apache/nifi/security/util/crypto/HashAlgorithmTest.groovy
index 35f7666..73591bc 100644
--- a/nifi-commons/nifi-security-utils/src/test/groovy/org/apache/nifi/security/util/crypto/HashAlgorithmTest.groovy
+++ b/nifi-commons/nifi-security-utils/src/test/groovy/org/apache/nifi/security/util/crypto/HashAlgorithmTest.groovy
@@ -18,23 +18,18 @@
 
 
 import org.bouncycastle.jce.provider.BouncyCastleProvider
-import org.junit.After
-import org.junit.Before
-import org.junit.BeforeClass
-import org.junit.Test
-import org.junit.runner.RunWith
-import org.junit.runners.JUnit4
+import org.junit.jupiter.api.BeforeAll
+import org.junit.jupiter.api.Test
 import org.slf4j.Logger
 import org.slf4j.LoggerFactory
 
 import java.security.Security
 
-@RunWith(JUnit4.class)
 class HashAlgorithmTest extends GroovyTestCase {
     private static final Logger logger = LoggerFactory.getLogger(HashAlgorithmTest.class)
 
 
-    @BeforeClass
+    @BeforeAll
     static void setUpOnce() throws Exception {
         Security.addProvider(new BouncyCastleProvider())
 
@@ -43,14 +38,6 @@
         }
     }
 
-    @Before
-    void setUp() throws Exception {
-    }
-
-    @After
-    void tearDown() throws Exception {
-    }
-
     @Test
     void testDetermineBrokenAlgorithms() throws Exception {
         // Arrange
diff --git a/nifi-commons/nifi-security-utils/src/test/groovy/org/apache/nifi/security/util/crypto/HashServiceTest.groovy b/nifi-commons/nifi-security-utils/src/test/groovy/org/apache/nifi/security/util/crypto/HashServiceTest.groovy
index 147215c..ec1dbd4 100644
--- a/nifi-commons/nifi-security-utils/src/test/groovy/org/apache/nifi/security/util/crypto/HashServiceTest.groovy
+++ b/nifi-commons/nifi-security-utils/src/test/groovy/org/apache/nifi/security/util/crypto/HashServiceTest.groovy
@@ -16,18 +16,12 @@
  */
 package org.apache.nifi.security.util.crypto
 
+
 import org.apache.nifi.components.AllowableValue
 import org.bouncycastle.jce.provider.BouncyCastleProvider
 import org.bouncycastle.util.encoders.Hex
-import org.junit.After
-import org.junit.AfterClass
-import org.junit.Before
-import org.junit.BeforeClass
-import org.junit.Rule
-import org.junit.Test
-import org.junit.rules.TemporaryFolder
-import org.junit.runner.RunWith
-import org.junit.runners.JUnit4
+import org.junit.jupiter.api.BeforeAll
+import org.junit.jupiter.api.Test
 import org.slf4j.Logger
 import org.slf4j.LoggerFactory
 
@@ -35,14 +29,10 @@
 import java.nio.charset.StandardCharsets
 import java.security.Security
 
-@RunWith(JUnit4.class)
 class HashServiceTest extends GroovyTestCase {
     private static final Logger logger = LoggerFactory.getLogger(HashServiceTest.class)
 
-    @Rule
-    public TemporaryFolder temporaryFolder = new TemporaryFolder()
-
-    @BeforeClass
+    @BeforeAll
     static void setUpOnce() throws Exception {
         Security.addProvider(new BouncyCastleProvider())
 
@@ -51,18 +41,6 @@
         }
     }
 
-    @AfterClass
-    static void tearDownOnce() throws Exception {
-    }
-
-    @Before
-    void setUp() throws Exception {
-    }
-
-    @After
-    void tearDown() throws Exception {
-    }
-
     @Test
     void testShouldHashValue() {
         // Arrange
@@ -393,16 +371,12 @@
         // No command-line md2sum tool available
         def algorithms = HashAlgorithm.values() - HashAlgorithm.MD2
 
-        File inputFile = temporaryFolder.newFile()
-
-        // Generates a file with "apachenifi" 10 times per line for 10_000 lines (11 bytes * 10 * 10_000 ~= 1 MiB)
-        if (!inputFile.exists() || inputFile.length() == 0) {
-            inputFile.createNewFile()
-            10_000.times { int i ->
-                inputFile << "${i.toString().padLeft(5)}: ${"apachenifi " * 10}\n"
-            }
+        StringBuilder sb = new StringBuilder()
+        10_000.times { int i ->
+            sb.append("${i.toString().padLeft(5)}: ${"apachenifi " * 10}\n")
         }
 
+
         /* These values were generated using command-line tools (openssl dgst -md5, shasum [-a 1 224 256 384 512 512224 512256], rhash --sha3-224, b2sum -l 160)
          * Ex: {@code $ openssl dgst -md5 src/test/resources/HashServiceTest/largefile.txt}
          */
@@ -428,9 +402,8 @@
         // Act
         def generatedHashes = algorithms.collectEntries { HashAlgorithm algorithm ->
             // Get a new InputStream for each iteration, or it will calculate the hash of an empty input on iterations 1 - n
-            InputStream input = inputFile.newInputStream()
+            InputStream input = new ByteArrayInputStream(sb.toString().bytes)
             String hash = HashService.hashValueStreaming(algorithm, input)
-            logger.info("${algorithm.getName().padLeft(11)}(${inputFile.path}) [${hash.length() / 2}] = ${hash}")
             [(algorithm.name), hash]
         }
 
diff --git a/nifi-commons/nifi-security-utils/src/test/groovy/org/apache/nifi/security/util/crypto/NiFiLegacyCipherProviderGroovyTest.groovy b/nifi-commons/nifi-security-utils/src/test/groovy/org/apache/nifi/security/util/crypto/NiFiLegacyCipherProviderGroovyTest.groovy
index 70ecda0..47d6fa2 100644
--- a/nifi-commons/nifi-security-utils/src/test/groovy/org/apache/nifi/security/util/crypto/NiFiLegacyCipherProviderGroovyTest.groovy
+++ b/nifi-commons/nifi-security-utils/src/test/groovy/org/apache/nifi/security/util/crypto/NiFiLegacyCipherProviderGroovyTest.groovy
@@ -19,14 +19,9 @@
 import org.apache.commons.codec.binary.Hex
 import org.apache.nifi.security.util.EncryptionMethod
 import org.bouncycastle.jce.provider.BouncyCastleProvider
-import org.junit.After
-import org.junit.Assume
-import org.junit.Before
-import org.junit.BeforeClass
-import org.junit.Ignore
-import org.junit.Test
-import org.junit.runner.RunWith
-import org.junit.runners.JUnit4
+import org.junit.jupiter.api.BeforeAll
+import org.junit.jupiter.api.Test
+import org.junit.jupiter.api.condition.EnabledIfSystemProperty
 import org.slf4j.Logger
 import org.slf4j.LoggerFactory
 
@@ -38,8 +33,8 @@
 import java.security.Security
 
 import static org.junit.Assert.fail
+import static org.junit.jupiter.api.Assumptions.assumeTrue
 
-@RunWith(JUnit4.class)
 class NiFiLegacyCipherProviderGroovyTest {
     private static final Logger logger = LoggerFactory.getLogger(NiFiLegacyCipherProviderGroovyTest.class)
 
@@ -51,7 +46,7 @@
 
     private static final byte[] SALT_16_BYTES = Hex.decodeHex("aabbccddeeff00112233445566778899".toCharArray())
 
-    @BeforeClass
+    @BeforeAll
     static void setUpOnce() throws Exception {
         Security.addProvider(new BouncyCastleProvider())
 
@@ -59,15 +54,6 @@
         limitedStrengthPbeEncryptionMethods = pbeEncryptionMethods.findAll { !it.isUnlimitedStrength() }
     }
 
-    @Before
-    void setUp() throws Exception {
-    }
-
-    @After
-    void tearDown() throws Exception {
-
-    }
-
     private static Cipher getLegacyCipher(String password, byte[] salt, String algorithm) {
         try {
             final PBEKeySpec pbeKeySpec = new PBEKeySpec(password.toCharArray())
@@ -123,9 +109,6 @@
 
     @Test
     void testGetCipherWithUnlimitedStrengthShouldBeInternallyConsistent() throws Exception {
-        // Arrange
-        Assume.assumeTrue("Test is being skipped due to this JVM lacking JCE Unlimited Strength Jurisdiction Policy file.",
-                CipherUtility.isUnlimitedStrengthCryptoSupported())
 
         NiFiLegacyCipherProvider cipherProvider = new NiFiLegacyCipherProvider()
 
@@ -260,7 +243,7 @@
      * from the password using a long digest result at the time of key length checking.
      * @throws IOException
      */
-    @Ignore("Only needed once to determine max supported password lengths")
+    @EnabledIfSystemProperty(named = "legacyCipherTest", matches = "true", disabledReason = "Only needed once to determine max supported password lengths")
     @Test
     void testShouldDetermineDependenceOnUnlimitedStrengthCrypto() throws IOException {
         def encryptionMethods = EncryptionMethod.values().findAll { it.algorithm.startsWith("PBE") }
diff --git a/nifi-commons/nifi-security-utils/src/test/groovy/org/apache/nifi/security/util/crypto/OpenSSLPKCS5CipherProviderGroovyTest.groovy b/nifi-commons/nifi-security-utils/src/test/groovy/org/apache/nifi/security/util/crypto/OpenSSLPKCS5CipherProviderGroovyTest.groovy
index 5d25ba2..b3c337b 100644
--- a/nifi-commons/nifi-security-utils/src/test/groovy/org/apache/nifi/security/util/crypto/OpenSSLPKCS5CipherProviderGroovyTest.groovy
+++ b/nifi-commons/nifi-security-utils/src/test/groovy/org/apache/nifi/security/util/crypto/OpenSSLPKCS5CipherProviderGroovyTest.groovy
@@ -19,13 +19,8 @@
 import org.apache.commons.codec.binary.Hex
 import org.apache.nifi.security.util.EncryptionMethod
 import org.bouncycastle.jce.provider.BouncyCastleProvider
-import org.junit.After
-import org.junit.Assume
-import org.junit.Before
-import org.junit.BeforeClass
-import org.junit.Test
-import org.junit.runner.RunWith
-import org.junit.runners.JUnit4
+import org.junit.jupiter.api.BeforeAll
+import org.junit.jupiter.api.Test
 import org.slf4j.Logger
 import org.slf4j.LoggerFactory
 
@@ -38,8 +33,8 @@
 
 import static groovy.test.GroovyAssert.shouldFail
 import static org.junit.Assert.fail
+import static org.junit.jupiter.api.Assumptions.assumeTrue
 
-@RunWith(JUnit4.class)
 class OpenSSLPKCS5CipherProviderGroovyTest {
     private static final Logger logger = LoggerFactory.getLogger(OpenSSLPKCS5CipherProviderGroovyTest.class)
 
@@ -49,7 +44,7 @@
     private static final String PROVIDER_NAME = "BC"
     private static final int ITERATION_COUNT = 0
 
-    @BeforeClass
+    @BeforeAll
     static void setUpOnce() throws Exception {
         Security.addProvider(new BouncyCastleProvider())
 
@@ -57,15 +52,6 @@
         limitedStrengthPbeEncryptionMethods = pbeEncryptionMethods.findAll { !it.isUnlimitedStrength() }
     }
 
-    @Before
-    void setUp() throws Exception {
-    }
-
-    @After
-    void tearDown() throws Exception {
-
-    }
-
     private static Cipher getLegacyCipher(String password, byte[] salt, String algorithm) {
         try {
             final PBEKeySpec pbeKeySpec = new PBEKeySpec(password.toCharArray())
@@ -121,8 +107,8 @@
     @Test
     void testGetCipherWithUnlimitedStrengthShouldBeInternallyConsistent() throws Exception {
         // Arrange
-        Assume.assumeTrue("Test is being skipped due to this JVM lacking JCE Unlimited Strength Jurisdiction Policy file.",
-                CipherUtility.isUnlimitedStrengthCryptoSupported())
+        assumeTrue(CipherUtility.isUnlimitedStrengthCryptoSupported(),
+                "Test is being skipped due to this JVM lacking JCE Unlimited Strength Jurisdiction Policy file.")
 
         OpenSSLPKCS5CipherProvider cipherProvider = new OpenSSLPKCS5CipherProvider()
 
diff --git a/nifi-commons/nifi-security-utils/src/test/groovy/org/apache/nifi/security/util/crypto/PBKDF2CipherProviderGroovyTest.groovy b/nifi-commons/nifi-security-utils/src/test/groovy/org/apache/nifi/security/util/crypto/PBKDF2CipherProviderGroovyTest.groovy
index c03795b..28aff8e 100644
--- a/nifi-commons/nifi-security-utils/src/test/groovy/org/apache/nifi/security/util/crypto/PBKDF2CipherProviderGroovyTest.groovy
+++ b/nifi-commons/nifi-security-utils/src/test/groovy/org/apache/nifi/security/util/crypto/PBKDF2CipherProviderGroovyTest.groovy
@@ -19,9 +19,10 @@
 import org.apache.commons.codec.binary.Hex
 import org.apache.nifi.security.util.EncryptionMethod
 import org.bouncycastle.jce.provider.BouncyCastleProvider
-import org.junit.*
-import org.junit.runner.RunWith
-import org.junit.runners.JUnit4
+import org.junit.jupiter.api.BeforeAll
+import org.junit.jupiter.api.Disabled
+import org.junit.jupiter.api.Test
+import org.junit.jupiter.api.condition.EnabledIfSystemProperty
 import org.slf4j.Logger
 import org.slf4j.LoggerFactory
 
@@ -30,8 +31,8 @@
 
 import static groovy.test.GroovyAssert.shouldFail
 import static org.junit.Assert.assertTrue
+import static org.junit.jupiter.api.Assumptions.assumeTrue
 
-@RunWith(JUnit4.class)
 class PBKDF2CipherProviderGroovyTest {
     private static final Logger logger = LoggerFactory.getLogger(PBKDF2CipherProviderGroovyTest.class)
 
@@ -47,7 +48,7 @@
     private final String IV_HEX = "01" * 16
     private static ArrayList<Integer> AES_KEY_LENGTHS
 
-    @BeforeClass
+    @BeforeAll
     static void setUpOnce() throws Exception {
         Security.addProvider(new BouncyCastleProvider())
 
@@ -64,15 +65,6 @@
         }
     }
 
-    @Before
-    void setUp() throws Exception {
-    }
-
-    @After
-    void tearDown() throws Exception {
-
-    }
-
     @Test
     void testGetCipherShouldBeInternallyConsistent() throws Exception {
         // Arrange
@@ -163,10 +155,6 @@
 
     @Test
     void testGetCipherWithUnlimitedStrengthShouldBeInternallyConsistent() throws Exception {
-        // Arrange
-        Assume.assumeTrue("Test is being skipped due to this JVM lacking JCE Unlimited Strength Jurisdiction Policy file.",
-                CipherUtility.isUnlimitedStrengthCryptoSupported())
-
         RandomIVPBECipherProvider cipherProvider = new PBKDF2CipherProvider(DEFAULT_PRF, TEST_ITERATION_COUNT)
 
         final String PASSWORD = "shortPassword"
@@ -468,7 +456,7 @@
         }
     }
 
-    @Ignore("This test can be run on a specific machine to evaluate if the default iteration count is sufficient")
+    @EnabledIfSystemProperty(named = "nifi.test.unstable", matches = "true")
     @Test
     void testDefaultConstructorShouldProvideStrongIterationCount() {
         // Arrange
diff --git a/nifi-commons/nifi-security-utils/src/test/groovy/org/apache/nifi/security/util/crypto/PBKDF2SecureHasherTest.groovy b/nifi-commons/nifi-security-utils/src/test/groovy/org/apache/nifi/security/util/crypto/PBKDF2SecureHasherTest.groovy
index 27799ac..8613d8b 100644
--- a/nifi-commons/nifi-security-utils/src/test/groovy/org/apache/nifi/security/util/crypto/PBKDF2SecureHasherTest.groovy
+++ b/nifi-commons/nifi-security-utils/src/test/groovy/org/apache/nifi/security/util/crypto/PBKDF2SecureHasherTest.groovy
@@ -18,18 +18,26 @@
 
 import org.bouncycastle.jce.provider.BouncyCastleProvider
 import org.bouncycastle.util.encoders.Hex
-import org.junit.*
-import org.junit.runner.RunWith
-import org.junit.runners.JUnit4
+import org.junit.jupiter.api.BeforeAll
+import org.junit.jupiter.api.Disabled
+import org.junit.jupiter.api.Test
+import org.junit.jupiter.api.condition.EnabledIfSystemProperty
+import org.slf4j.Logger
+import org.slf4j.LoggerFactory
 
 import java.nio.charset.StandardCharsets
 import java.security.Security
 
-@RunWith(JUnit4.class)
 class PBKDF2SecureHasherTest extends GroovyTestCase {
-    @BeforeClass
+    private static final Logger logger = LoggerFactory.getLogger(PBKDF2SecureHasherTest)
+
+    @BeforeAll
     static void setupOnce() throws Exception {
         Security.addProvider(new BouncyCastleProvider())
+
+        logger.metaClass.methodMissing = { String name, args ->
+            logger.info("[${name?.toUpperCase()}] ${(args as List).join(" ")}")
+        }
     }
 
     @Test
@@ -242,7 +250,7 @@
      * This test can have the minimum time threshold updated to determine if the performance
      * is still sufficient compared to the existing threat model.
      */
-    @Ignore("Long running test")
+    @EnabledIfSystemProperty(named = "nifi.test.performance", matches = "true")
     @Test
     void testDefaultCostParamsShouldBeSufficient() {
         // Arrange
diff --git a/nifi-commons/nifi-security-utils/src/test/groovy/org/apache/nifi/security/util/crypto/ScryptCipherProviderGroovyTest.groovy b/nifi-commons/nifi-security-utils/src/test/groovy/org/apache/nifi/security/util/crypto/ScryptCipherProviderGroovyTest.groovy
index 2a92b1f..bac8348 100644
--- a/nifi-commons/nifi-security-utils/src/test/groovy/org/apache/nifi/security/util/crypto/ScryptCipherProviderGroovyTest.groovy
+++ b/nifi-commons/nifi-security-utils/src/test/groovy/org/apache/nifi/security/util/crypto/ScryptCipherProviderGroovyTest.groovy
@@ -21,14 +21,11 @@
 import org.apache.nifi.security.util.EncryptionMethod
 import org.apache.nifi.security.util.crypto.scrypt.Scrypt
 import org.bouncycastle.jce.provider.BouncyCastleProvider
-import org.junit.After
-import org.junit.Assume
-import org.junit.Before
-import org.junit.BeforeClass
-import org.junit.Ignore
-import org.junit.Test
-import org.junit.runner.RunWith
-import org.junit.runners.JUnit4
+import org.junit.jupiter.api.BeforeAll
+import org.junit.jupiter.api.BeforeEach
+import org.junit.jupiter.api.Disabled
+import org.junit.jupiter.api.Test
+import org.junit.jupiter.api.condition.EnabledIfSystemProperty
 import org.slf4j.Logger
 import org.slf4j.LoggerFactory
 
@@ -41,8 +38,8 @@
 
 import static groovy.test.GroovyAssert.shouldFail
 import static org.junit.Assert.assertTrue
+import static org.junit.jupiter.api.Assumptions.assumeTrue
 
-@RunWith(JUnit4.class)
 class ScryptCipherProviderGroovyTest {
     private static final Logger logger = LoggerFactory.getLogger(ScryptCipherProviderGroovyTest.class)
 
@@ -56,7 +53,7 @@
 
     RandomIVPBECipherProvider cipherProvider
 
-    @BeforeClass
+    @BeforeAll
     static void setUpOnce() throws Exception {
         Security.addProvider(new BouncyCastleProvider())
 
@@ -73,17 +70,12 @@
         }
     }
 
-    @Before
+    @BeforeEach
     void setUp() throws Exception {
         // Very fast parameters to test for correctness rather than production values
         cipherProvider = new ScryptCipherProvider(4, 1, 1)
     }
 
-    @After
-    void tearDown() throws Exception {
-
-    }
-
     @Test
     void testGetCipherShouldBeInternallyConsistent() throws Exception {
         // Arrange
@@ -143,8 +135,8 @@
     @Test
     void testGetCipherWithUnlimitedStrengthShouldBeInternallyConsistent() throws Exception {
         // Arrange
-        Assume.assumeTrue("Test is being skipped due to this JVM lacking JCE Unlimited Strength Jurisdiction Policy file.",
-                CipherUtility.isUnlimitedStrengthCryptoSupported())
+        assumeTrue(CipherUtility.isUnlimitedStrengthCryptoSupported(),
+                "Test is being skipped due to this JVM lacking JCE Unlimited Strength Jurisdiction Policy file.")
 
         final String PASSWORD = "shortPassword"
         final byte[] SALT = cipherProvider.generateSalt()
@@ -621,7 +613,8 @@
         assert isScryptSalt
     }
 
-    @Ignore("This test can be run on a specific machine to evaluate if the default parameters are sufficient")
+    @EnabledIfSystemProperty(named = "nifi.test.unstable", matches = "true",
+        disabledReason = "This test can be run on a specific machine to evaluate if the default parameters are sufficient")
     @Test
     void testDefaultConstructorShouldProvideStrongParameters() {
         // Arrange
diff --git a/nifi-commons/nifi-security-utils/src/test/groovy/org/apache/nifi/security/util/crypto/ScryptSecureHasherTest.groovy b/nifi-commons/nifi-security-utils/src/test/groovy/org/apache/nifi/security/util/crypto/ScryptSecureHasherTest.groovy
index 6dda22d..963fcae 100644
--- a/nifi-commons/nifi-security-utils/src/test/groovy/org/apache/nifi/security/util/crypto/ScryptSecureHasherTest.groovy
+++ b/nifi-commons/nifi-security-utils/src/test/groovy/org/apache/nifi/security/util/crypto/ScryptSecureHasherTest.groovy
@@ -16,15 +16,29 @@
  */
 package org.apache.nifi.security.util.crypto
 
+import org.bouncycastle.jce.provider.BouncyCastleProvider
 import org.bouncycastle.util.encoders.Hex
-import org.junit.*
-import org.junit.runner.RunWith
-import org.junit.runners.JUnit4
+import org.junit.jupiter.api.BeforeAll
+import org.junit.jupiter.api.Disabled
+import org.junit.jupiter.api.Test
+import org.junit.jupiter.api.condition.EnabledIfSystemProperty
+import org.slf4j.Logger
+import org.slf4j.LoggerFactory
 
 import java.nio.charset.StandardCharsets
+import java.security.Security
 
-@RunWith(JUnit4.class)
 class ScryptSecureHasherTest extends GroovyTestCase {
+    private static final Logger logger = LoggerFactory.getLogger(ScryptSecureHasherTest)
+
+    @BeforeAll
+    static void setupOnce() throws Exception {
+        Security.addProvider(new BouncyCastleProvider())
+
+        logger.metaClass.methodMissing = { String name, args ->
+            logger.info("[${name?.toUpperCase()}] ${(args as List).join(" ")}")
+        }
+    }
 
     @Test
     void testShouldBeDeterministicWithStaticSalt() {
@@ -239,7 +253,7 @@
      * This test can have the minimum time threshold updated to determine if the performance
      * is still sufficient compared to the existing threat model.
      */
-    @Ignore("Long running test")
+    @EnabledIfSystemProperty(named = "nifi.test.performance", matches = "true")
     @Test
     void testDefaultCostParamsShouldBeSufficient() {
         // Arrange
diff --git a/nifi-commons/nifi-security-utils/src/test/groovy/org/apache/nifi/security/util/scrypt/ScryptGroovyTest.groovy b/nifi-commons/nifi-security-utils/src/test/groovy/org/apache/nifi/security/util/scrypt/ScryptGroovyTest.groovy
index ad222a0..dcc8b5f 100644
--- a/nifi-commons/nifi-security-utils/src/test/groovy/org/apache/nifi/security/util/scrypt/ScryptGroovyTest.groovy
+++ b/nifi-commons/nifi-security-utils/src/test/groovy/org/apache/nifi/security/util/scrypt/ScryptGroovyTest.groovy
@@ -19,14 +19,10 @@
 import org.apache.commons.codec.binary.Hex
 import org.apache.nifi.security.util.crypto.scrypt.Scrypt
 import org.bouncycastle.jce.provider.BouncyCastleProvider
-import org.junit.After
-import org.junit.Assume
-import org.junit.Before
-import org.junit.BeforeClass
-import org.junit.Ignore
-import org.junit.Test
-import org.junit.runner.RunWith
-import org.junit.runners.JUnit4
+import org.junit.jupiter.api.BeforeAll
+import org.junit.jupiter.api.Disabled
+import org.junit.jupiter.api.Test
+import org.junit.jupiter.api.condition.EnabledIfSystemProperty
 import org.slf4j.Logger
 import org.slf4j.LoggerFactory
 
@@ -34,8 +30,8 @@
 import java.security.Security
 
 import static groovy.test.GroovyAssert.shouldFail
+import static org.junit.jupiter.api.Assumptions.assumeTrue
 
-@RunWith(JUnit4.class)
 class ScryptGroovyTest {
     private static final Logger logger = LoggerFactory.getLogger(ScryptGroovyTest.class)
 
@@ -50,7 +46,7 @@
     private static final int DK_LEN = 128
     private static final long TWO_GIGABYTES = 2048L * 1024 * 1024
 
-    @BeforeClass
+    @BeforeAll
     static void setUpOnce() throws Exception {
         Security.addProvider(new BouncyCastleProvider())
 
@@ -59,15 +55,6 @@
         }
     }
 
-    @Before
-    void setUp() throws Exception {
-    }
-
-    @After
-    void tearDown() throws Exception {
-
-    }
-
     @Test
     void testDeriveScryptKeyShouldBeInternallyConsistent() throws Exception {
         // Arrange
@@ -150,8 +137,7 @@
         long totalMemory = Runtime.getRuntime().totalMemory()
         logger.info("Required memory: ${TWO_GIGABYTES} bytes")
         logger.info("Max heap memory: ${totalMemory} bytes")
-        Assume.assumeTrue("Test is being skipped due to JVM heap size. Please run with -Xmx3072m to set sufficient heap size",
-                totalMemory >= TWO_GIGABYTES)
+        assumeTrue(totalMemory >= TWO_GIGABYTES, "Test is being skipped due to JVM heap size. Please run with -Xmx3072m to set sufficient heap size")
 
         // These values are taken from Colin Percival's scrypt paper: https://www.tarsnap.com/scrypt/scrypt.pdf
         final byte[] HASH = Hex.decodeHex("2101cb9b6a511aaeaddbbe09cf70f881" +
@@ -180,7 +166,7 @@
         assert calculatedHash == HASH
     }
 
-    @Ignore("This test was just to exercise the heap and debug OOME issues")
+    @EnabledIfSystemProperty(named = "nifi.test.unstable", matches = "true")
     @Test
     void testShouldCauseOutOfMemoryError() {
         SecureRandom secureRandom = new SecureRandom()
diff --git a/nifi-commons/nifi-security-utils/src/test/groovy/org/apache/nifi/security/xml/XmlUtilsTest.groovy b/nifi-commons/nifi-security-utils/src/test/groovy/org/apache/nifi/security/xml/XmlUtilsTest.groovy
index 1fda85b..fb12bfe 100644
--- a/nifi-commons/nifi-security-utils/src/test/groovy/org/apache/nifi/security/xml/XmlUtilsTest.groovy
+++ b/nifi-commons/nifi-security-utils/src/test/groovy/org/apache/nifi/security/xml/XmlUtilsTest.groovy
@@ -16,12 +16,8 @@
  */
 package org.apache.nifi.security.xml
 
-import org.junit.After
-import org.junit.Before
-import org.junit.BeforeClass
-import org.junit.Test
-import org.junit.runner.RunWith
-import org.junit.runners.JUnit4
+import org.junit.jupiter.api.BeforeAll
+import org.junit.jupiter.api.Test
 import org.slf4j.Logger
 import org.slf4j.LoggerFactory
 import org.xml.sax.SAXParseException
@@ -38,27 +34,16 @@
 
 import static groovy.test.GroovyAssert.shouldFail
 
-@RunWith(JUnit4.class)
 class XmlUtilsTest {
     private static final Logger logger = LoggerFactory.getLogger(XmlUtilsTest.class)
 
-    @BeforeClass
+    @BeforeAll
     static void setUpOnce() throws Exception {
         logger.metaClass.methodMissing = { String name, args ->
             logger.info("[${name?.toUpperCase()}] ${(args as List).join(" ")}")
         }
     }
 
-    @Before
-    void setUp() throws Exception {
-
-    }
-
-    @After
-    void tearDown() throws Exception {
-
-    }
-
     @Test
     void testShouldHandleXXEInUnmarshal() {
         // Arrange
diff --git a/nifi-commons/nifi-security-utils/src/test/java/org/apache/nifi/security/XXEValidatorTest.java b/nifi-commons/nifi-security-utils/src/test/java/org/apache/nifi/security/XXEValidatorTest.java
index 9c39e28..fd2dcea 100644
--- a/nifi-commons/nifi-security-utils/src/test/java/org/apache/nifi/security/XXEValidatorTest.java
+++ b/nifi-commons/nifi-security-utils/src/test/java/org/apache/nifi/security/XXEValidatorTest.java
@@ -16,22 +16,17 @@
  */
 package org.apache.nifi.security;
 
+import org.apache.nifi.components.ValidationContext;
+import org.apache.nifi.components.ValidationResult;
+import org.apache.nifi.security.xml.XXEValidator;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 import static org.mockito.Mockito.mock;
 
-import org.apache.nifi.components.ValidationContext;
-import org.apache.nifi.components.ValidationResult;
-import org.apache.nifi.security.xml.XXEValidator;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.BeforeClass;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-@RunWith(JUnit4.class)
 public class XXEValidatorTest {
     private String simpleXMLFile = "src/test/resources/no_xxe.xml";
     private String remoteXXEFile = "src/test/resources/remote_xxe_file.xml";
@@ -41,21 +36,11 @@
     private String configurationKey = "Configuration Name";
     private ValidationContext validationContext;
 
-    @BeforeClass
-    public static void setUpOnce() throws Exception {
-
-    }
-
-    @Before
+    @BeforeEach
     public void setUp() throws Exception {
         validationContext = mock(ValidationContext.class);
     }
 
-    @After
-    public void tearDown() throws Exception {
-
-    }
-
     @Test
     public void testXmlFileWithNoXXEIsValid() {
         // Arrange
diff --git a/nifi-commons/nifi-security-utils/src/test/java/org/apache/nifi/security/util/KeyStoreUtilsTest.java b/nifi-commons/nifi-security-utils/src/test/java/org/apache/nifi/security/util/KeyStoreUtilsTest.java
index f41d597..5ffed46 100644
--- a/nifi-commons/nifi-security-utils/src/test/java/org/apache/nifi/security/util/KeyStoreUtilsTest.java
+++ b/nifi-commons/nifi-security-utils/src/test/java/org/apache/nifi/security/util/KeyStoreUtilsTest.java
@@ -17,6 +17,12 @@
 
 package org.apache.nifi.security.util;
 
+import org.apache.commons.lang3.StringUtils;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.Test;
+
+import javax.crypto.SecretKey;
+import javax.crypto.spec.SecretKeySpec;
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.File;
@@ -32,13 +38,6 @@
 import java.security.cert.X509Certificate;
 import java.util.UUID;
 
-import org.apache.commons.lang3.StringUtils;
-import org.junit.BeforeClass;
-import org.junit.Test;
-
-import javax.crypto.SecretKey;
-import javax.crypto.spec.SecretKeySpec;
-
 import static org.junit.Assert.assertArrayEquals;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
@@ -60,7 +59,7 @@
     private static X509Certificate certificate;
     private static SecretKey secretKey;
 
-    @BeforeClass
+    @BeforeAll
     public static void generateKeysAndCertificates() throws NoSuchAlgorithmException, CertificateException {
         keyPair = KeyPairGenerator.getInstance(KEY_ALGORITHM).generateKeyPair();
         certificate = CertificateUtils.generateSelfSignedX509Certificate(keyPair, SUBJECT_DN, SIGNING_ALGORITHM, DURATION_DAYS);
diff --git a/nifi-commons/nifi-security-utils/src/test/java/org/apache/nifi/security/util/crypto/SecureHasherFactoryTest.java b/nifi-commons/nifi-security-utils/src/test/java/org/apache/nifi/security/util/crypto/SecureHasherFactoryTest.java
index 0f4a6cb..d566a2e 100644
--- a/nifi-commons/nifi-security-utils/src/test/java/org/apache/nifi/security/util/crypto/SecureHasherFactoryTest.java
+++ b/nifi-commons/nifi-security-utils/src/test/java/org/apache/nifi/security/util/crypto/SecureHasherFactoryTest.java
@@ -16,9 +16,7 @@
  */
 package org.apache.nifi.security.util.crypto;
 
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.rules.ExpectedException;
+import org.junit.jupiter.api.Test;
 
 import static org.junit.Assert.assertEquals;
 
@@ -26,9 +24,6 @@
 
     private static final Argon2SecureHasher DEFAULT_HASHER = new Argon2SecureHasher();
 
-    @Rule
-    public ExpectedException exceptionRule = ExpectedException.none();
-
     @Test
     public void testSecureHasherFactoryArgon2() {
         SecureHasher hasher = SecureHasherFactory.getSecureHasher("NIFI_ARGON2_AES_GCM_128");
diff --git a/nifi-commons/nifi-sensitive-property-provider/src/test/groovy/org/apache/nifi/properties/AESSensitivePropertyProviderTest.groovy b/nifi-commons/nifi-sensitive-property-provider/src/test/groovy/org/apache/nifi/properties/AESSensitivePropertyProviderTest.groovy
index cef68b1..fe838c3 100644
--- a/nifi-commons/nifi-sensitive-property-provider/src/test/groovy/org/apache/nifi/properties/AESSensitivePropertyProviderTest.groovy
+++ b/nifi-commons/nifi-sensitive-property-provider/src/test/groovy/org/apache/nifi/properties/AESSensitivePropertyProviderTest.groovy
@@ -18,13 +18,10 @@
 
 import org.bouncycastle.jce.provider.BouncyCastleProvider
 import org.bouncycastle.util.encoders.Hex
-import org.junit.After
-import org.junit.Assume
-import org.junit.Before
-import org.junit.BeforeClass
-import org.junit.Test
-import org.junit.runner.RunWith
-import org.junit.runners.JUnit4
+import org.junit.jupiter.api.AfterEach
+import org.junit.jupiter.api.BeforeAll
+import org.junit.jupiter.api.BeforeEach
+import org.junit.jupiter.api.Test
 import org.slf4j.Logger
 import org.slf4j.LoggerFactory
 
@@ -35,7 +32,8 @@
 import java.security.SecureRandom
 import java.security.Security
 
-@RunWith(JUnit4.class)
+import static org.junit.Assume.assumeTrue
+
 class AESSensitivePropertyProviderTest extends GroovyTestCase {
     private static final Logger logger = LoggerFactory.getLogger(AESSensitivePropertyProviderTest.class)
 
@@ -52,7 +50,7 @@
     private static final Base64.Encoder encoder = Base64.encoder
     private static final Base64.Decoder decoder = Base64.decoder
 
-    @BeforeClass
+    @BeforeAll
     static void setUpOnce() throws Exception {
         Security.addProvider(new BouncyCastleProvider())
 
@@ -61,12 +59,12 @@
         }
     }
 
-    @Before
+    @BeforeEach
     void setUp() throws Exception {
 
     }
 
-    @After
+    @AfterEach
     void tearDown() throws Exception {
 
     }
@@ -475,7 +473,7 @@
     @Test
     void testShouldDecryptPaddedValue() {
         // Arrange
-        Assume.assumeTrue("JCE unlimited strength crypto policy must be installed for this test", Cipher.getMaxAllowedKeyLength("AES") > 128)
+        assumeTrue("JCE unlimited strength crypto policy must be installed for this test", Cipher.getMaxAllowedKeyLength("AES") > 128)
 
         final String EXPECTED_VALUE = getKeyOfSize(256) // "thisIsABadKeyPassword"
         String cipherText = "aYDkDKys1ENr3gp+||sTBPpMlIvHcOLTGZlfWct8r9RY8BuDlDkoaYmGJ/9m9af9tZIVzcnDwvYQAaIKxRGF7vI2yrY7Xd6x9GTDnWGiGiRXlaP458BBMMgfzH2O8"
diff --git a/nifi-commons/nifi-sensitive-property-provider/src/test/java/org/apache/nifi/properties/AwsKmsSensitivePropertyProviderIT.java b/nifi-commons/nifi-sensitive-property-provider/src/test/java/org/apache/nifi/properties/AwsKmsSensitivePropertyProviderIT.java
index 30c183c..810bea8 100644
--- a/nifi-commons/nifi-sensitive-property-provider/src/test/java/org/apache/nifi/properties/AwsKmsSensitivePropertyProviderIT.java
+++ b/nifi-commons/nifi-sensitive-property-provider/src/test/java/org/apache/nifi/properties/AwsKmsSensitivePropertyProviderIT.java
@@ -17,10 +17,9 @@
 package org.apache.nifi.properties;
 
 import org.apache.nifi.properties.configuration.AwsKmsClientProvider;
-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 org.mockito.internal.util.io.IOUtil;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -32,6 +31,10 @@
 import java.nio.file.Path;
 import java.util.Properties;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+
 /**
  * To run this test, make sure to first configure sensitive credential information as in the following link
  * https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-files.html
@@ -99,18 +102,18 @@
         IOUtil.writeText(bootstrapConfText.toString(), mockAWSBootstrapConf.toFile());
     }
 
-    @BeforeClass
+    @BeforeAll
     public static void initOnce() throws IOException {
         initializeBootstrapProperties();
-        Assert.assertNotNull(props);
+        assertNotNull(props);
         final AwsKmsClientProvider provider = new AwsKmsClientProvider();
         final Properties properties = provider.getClientProperties(props).orElse(null);
         final KmsClient kmsClient = provider.getClient(properties).orElse(null);
         spp = new AwsKmsSensitivePropertyProvider(kmsClient, properties);
-        Assert.assertNotNull(spp);
+        assertNotNull(spp);
     }
 
-    @AfterClass
+    @AfterAll
     public static void tearDownOnce() throws IOException {
         Files.deleteIfExists(mockBootstrapConf);
         Files.deleteIfExists(mockAWSBootstrapConf);
@@ -132,8 +135,8 @@
         String unprotectedValue = spp.unprotect(protectedValue, ProtectedPropertyContext.defaultContext("property"));
         logger.info("Unprotected Value: " + unprotectedValue);
 
-        Assert.assertEquals(SAMPLE_PLAINTEXT, unprotectedValue);
-        Assert.assertNotEquals(SAMPLE_PLAINTEXT, protectedValue);
-        Assert.assertNotEquals(protectedValue, unprotectedValue);
+        assertEquals(SAMPLE_PLAINTEXT, unprotectedValue);
+        assertNotEquals(SAMPLE_PLAINTEXT, protectedValue);
+        assertNotEquals(protectedValue, unprotectedValue);
     }
 }
diff --git a/nifi-commons/nifi-sensitive-property-provider/src/test/java/org/apache/nifi/properties/StandardSensitivePropertyProviderFactoryTest.java b/nifi-commons/nifi-sensitive-property-provider/src/test/java/org/apache/nifi/properties/StandardSensitivePropertyProviderFactoryTest.java
index f9fa266..c7aa609 100644
--- a/nifi-commons/nifi-sensitive-property-provider/src/test/java/org/apache/nifi/properties/StandardSensitivePropertyProviderFactoryTest.java
+++ b/nifi-commons/nifi-sensitive-property-provider/src/test/java/org/apache/nifi/properties/StandardSensitivePropertyProviderFactoryTest.java
@@ -19,9 +19,9 @@
 import org.apache.commons.io.FilenameUtils;
 import org.apache.nifi.util.NiFiProperties;
 import org.bouncycastle.jce.provider.BouncyCastleProvider;
-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 org.mockito.internal.util.io.IOUtil;
 
 import java.io.FileOutputStream;
@@ -35,12 +35,12 @@
 import java.util.Properties;
 import java.util.function.Supplier;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertThrows;
-import static org.junit.Assert.assertTrue;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertNotEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
 public class StandardSensitivePropertyProviderFactoryTest {
 
@@ -56,7 +56,9 @@
     private static Path nifiProperties;
     private static String defaultBootstrapContents;
 
-    @BeforeClass
+    private static NiFiProperties niFiProperties;
+
+    @BeforeAll
     public static void initOnce() throws IOException {
         Security.addProvider(new BouncyCastleProvider());
         tempConfDir = Files.createTempDirectory("conf");
@@ -86,7 +88,7 @@
         return bootstrapConf;
     }
 
-    @AfterClass
+    @AfterAll
     public static void tearDownOnce() throws IOException {
         Files.deleteIfExists(bootstrapConf);
         Files.deleteIfExists(hashicorpVaultBootstrapConf);
diff --git a/nifi-commons/nifi-single-user-utils/src/test/java/org/apache/nifi/authentication/single/user/command/SetSingleUserCredentialsTest.java b/nifi-commons/nifi-single-user-utils/src/test/java/org/apache/nifi/authentication/single/user/command/SetSingleUserCredentialsTest.java
index 9978cb5..4486ca8 100644
--- a/nifi-commons/nifi-single-user-utils/src/test/java/org/apache/nifi/authentication/single/user/command/SetSingleUserCredentialsTest.java
+++ b/nifi-commons/nifi-single-user-utils/src/test/java/org/apache/nifi/authentication/single/user/command/SetSingleUserCredentialsTest.java
@@ -17,8 +17,8 @@
 package org.apache.nifi.authentication.single.user.command;
 
 import org.apache.commons.io.FilenameUtils;
-import org.junit.After;
-import org.junit.Test;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.Test;
 
 import java.io.File;
 import java.io.IOException;
@@ -34,14 +34,14 @@
 import java.util.regex.Pattern;
 import java.util.stream.Collectors;
 
-import static org.junit.Assert.assertTrue;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
 public class SetSingleUserCredentialsTest {
     private static final Pattern BCRYPT_PATTERN = Pattern.compile("\\$2b\\$12\\$.+");
 
     private static final String PROPERTIES_PATH = "/conf/login.nifi.properties";
 
-    @After
+    @AfterEach
     public void clearProperties() {
         System.clearProperty(SetSingleUserCredentials.PROPERTIES_FILE_PATH);
     }
@@ -66,8 +66,8 @@
     private void assertProvidersUpdated(final Path providersConfigurationPath, final String username) throws IOException {
         final String providersConfiguration = new String(Files.readAllBytes(providersConfigurationPath), StandardCharsets.UTF_8);
 
-        assertTrue("Username not found", providersConfiguration.contains(username));
-        assertTrue("Encoded Password not found", BCRYPT_PATTERN.matcher(providersConfiguration).find());
+        assertTrue(providersConfiguration.contains(username), "Username not found");
+        assertTrue(BCRYPT_PATTERN.matcher(providersConfiguration).find(), "Encoded Password not found");
     }
 
     private Path getNiFiProperties(final Path providersPath) throws IOException, URISyntaxException {
diff --git a/nifi-commons/nifi-single-user-utils/src/test/java/org/apache/nifi/authentication/single/user/encoder/BCryptPasswordEncoderTest.java b/nifi-commons/nifi-single-user-utils/src/test/java/org/apache/nifi/authentication/single/user/encoder/BCryptPasswordEncoderTest.java
index 36b12c8..b922d50 100644
--- a/nifi-commons/nifi-single-user-utils/src/test/java/org/apache/nifi/authentication/single/user/encoder/BCryptPasswordEncoderTest.java
+++ b/nifi-commons/nifi-single-user-utils/src/test/java/org/apache/nifi/authentication/single/user/encoder/BCryptPasswordEncoderTest.java
@@ -16,12 +16,12 @@
  */
 package org.apache.nifi.authentication.single.user.encoder;
 
-import org.junit.Test;
+import org.junit.jupiter.api.Test;
 
 import java.util.regex.Pattern;
 
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
 public class BCryptPasswordEncoderTest {
 
@@ -31,8 +31,8 @@
     public void testEncode() {
         final BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();
         final String encoded = encoder.encode(String.class.getSimpleName().toCharArray());
-        assertNotNull("Encoded Password not found", encoded);
-        assertTrue("Encoded Password bcrypt hash not found", BCRYPT_PATTERN.matcher(encoded).matches());
+        assertNotNull(encoded, "Encoded Password not found");
+        assertTrue(BCRYPT_PATTERN.matcher(encoded).matches(), "Encoded Password bcrypt hash not found");
     }
 
     @Test
@@ -40,6 +40,6 @@
         final BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();
         final char[] password = String.class.getSimpleName().toCharArray();
         final String encoded = encoder.encode(password);
-        assertTrue("Encoded Password not matched", encoder.matches(password, encoded));
+        assertTrue(encoder.matches(password, encoded), "Encoded Password not matched");
     }
 }
diff --git a/nifi-commons/nifi-single-user-utils/src/test/java/org/apache/nifi/authentication/single/user/writer/StandardLoginCredentialsWriterTest.java b/nifi-commons/nifi-single-user-utils/src/test/java/org/apache/nifi/authentication/single/user/writer/StandardLoginCredentialsWriterTest.java
index 0920df8..4efbd53 100644
--- a/nifi-commons/nifi-single-user-utils/src/test/java/org/apache/nifi/authentication/single/user/writer/StandardLoginCredentialsWriterTest.java
+++ b/nifi-commons/nifi-single-user-utils/src/test/java/org/apache/nifi/authentication/single/user/writer/StandardLoginCredentialsWriterTest.java
@@ -17,7 +17,7 @@
 package org.apache.nifi.authentication.single.user.writer;
 
 import org.apache.nifi.authentication.single.user.SingleUserCredentials;
-import org.junit.Test;
+import org.junit.jupiter.api.Test;
 
 import java.io.IOException;
 import java.net.URISyntaxException;
@@ -27,7 +27,7 @@
 import java.nio.file.StandardCopyOption;
 import java.util.UUID;
 
-import static org.junit.Assert.assertTrue;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
 public class StandardLoginCredentialsWriterTest {
     private static final String BLANK_PROVIDERS = "/conf/login-identity-providers.xml";
@@ -64,7 +64,7 @@
         writer.writeLoginCredentials(credentials);
 
         final String configuration = new String(Files.readAllBytes(configuredProvidersPath));
-        assertTrue("Username not found", configuration.contains(username));
-        assertTrue("Password not found", configuration.contains(password));
+        assertTrue(configuration.contains(username), "Username not found");
+        assertTrue(configuration.contains(password), "Password not found");
     }
 }
diff --git a/nifi-commons/nifi-site-to-site-client/src/test/groovy/org/apache/nifi/remote/client/PeerSelectorTest.groovy b/nifi-commons/nifi-site-to-site-client/src/test/groovy/org/apache/nifi/remote/client/PeerSelectorTest.groovy
index d004979..f167da0 100644
--- a/nifi-commons/nifi-site-to-site-client/src/test/groovy/org/apache/nifi/remote/client/PeerSelectorTest.groovy
+++ b/nifi-commons/nifi-site-to-site-client/src/test/groovy/org/apache/nifi/remote/client/PeerSelectorTest.groovy
@@ -23,19 +23,16 @@
 import org.apache.nifi.remote.protocol.SiteToSiteTransportProtocol
 import org.apache.nifi.remote.util.PeerStatusCache
 import org.bouncycastle.jce.provider.BouncyCastleProvider
-import org.junit.After
-import org.junit.Before
-import org.junit.BeforeClass
-import org.junit.Test
-import org.junit.runner.RunWith
-import org.junit.runners.JUnit4
+import org.junit.jupiter.api.AfterEach
+import org.junit.jupiter.api.BeforeAll
+import org.junit.jupiter.api.BeforeEach
+import org.junit.jupiter.api.Test
 import org.slf4j.Logger
 import org.slf4j.LoggerFactory
 
 import java.security.Security
 import java.util.concurrent.ArrayBlockingQueue
 
-@RunWith(JUnit4.class)
 class PeerSelectorTest extends GroovyTestCase {
     private static final Logger logger = LoggerFactory.getLogger(PeerSelectorTest.class)
 
@@ -51,7 +48,7 @@
     private static mockPP
 
 
-    @BeforeClass
+    @BeforeAll
     static void setUpOnce() throws Exception {
         Security.addProvider(new BouncyCastleProvider())
 
@@ -60,14 +57,14 @@
         }
     }
 
-    @Before
+    @BeforeEach
     void setUp() {
         // Mock collaborators
         mockPSP = mockPeerStatusProvider()
         mockPP = mockPeerPersistence()
     }
 
-    @After
+    @AfterEach
     void tearDown() {
 
     }
diff --git a/nifi-commons/nifi-site-to-site-client/src/test/java/org/apache/nifi/remote/client/TestSiteInfoProvider.java b/nifi-commons/nifi-site-to-site-client/src/test/java/org/apache/nifi/remote/client/TestSiteInfoProvider.java
index 2d9de21..6aea71e 100644
--- a/nifi-commons/nifi-site-to-site-client/src/test/java/org/apache/nifi/remote/client/TestSiteInfoProvider.java
+++ b/nifi-commons/nifi-site-to-site-client/src/test/java/org/apache/nifi/remote/client/TestSiteInfoProvider.java
@@ -21,7 +21,7 @@
 import org.apache.nifi.remote.util.SiteToSiteRestApiClient;
 import org.apache.nifi.web.api.dto.ControllerDTO;
 import org.apache.nifi.web.api.dto.PortDTO;
-import org.junit.Test;
+import org.junit.jupiter.api.Test;
 
 import javax.net.ssl.SSLContext;
 import java.io.IOException;
@@ -31,11 +31,11 @@
 import java.util.LinkedHashSet;
 import java.util.Set;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.Mockito.doAnswer;
@@ -190,18 +190,7 @@
             return apiClient;
         }).when(siteInfoProvider).createSiteToSiteRestApiClient(any(), any());
 
-        try {
-            siteInfoProvider.getSiteToSitePort();
-            fail();
-        } catch (IOException e) {
-        }
-
-        try {
-            siteInfoProvider.getActiveClusterUrl();
-            fail();
-        } catch (IOException e) {
-        }
-
+        assertThrows(IOException.class, () -> siteInfoProvider.getSiteToSitePort());
+        assertThrows(IOException.class, () -> siteInfoProvider.getActiveClusterUrl());
     }
-
 }
diff --git a/nifi-commons/nifi-site-to-site-client/src/test/java/org/apache/nifi/remote/client/http/TestHttpClient.java b/nifi-commons/nifi-site-to-site-client/src/test/java/org/apache/nifi/remote/client/http/TestHttpClient.java
index d72662f..437ae78 100644
--- a/nifi-commons/nifi-site-to-site-client/src/test/java/org/apache/nifi/remote/client/http/TestHttpClient.java
+++ b/nifi-commons/nifi-site-to-site-client/src/test/java/org/apache/nifi/remote/client/http/TestHttpClient.java
@@ -16,40 +16,7 @@
  */
 package org.apache.nifi.remote.client.http;
 
-import static org.apache.commons.lang3.StringUtils.isEmpty;
-import static org.apache.nifi.remote.protocol.http.HttpHeaders.LOCATION_HEADER_NAME;
-import static org.apache.nifi.remote.protocol.http.HttpHeaders.LOCATION_URI_INTENT_NAME;
-import static org.apache.nifi.remote.protocol.http.HttpHeaders.LOCATION_URI_INTENT_VALUE;
-import static org.apache.nifi.remote.protocol.http.HttpHeaders.PROTOCOL_VERSION;
-import static org.apache.nifi.remote.protocol.http.HttpHeaders.SERVER_SIDE_TRANSACTION_TTL;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-import static org.junit.Assume.assumeFalse;
-
 import com.fasterxml.jackson.databind.ObjectMapper;
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.net.ServerSocket;
-import java.net.SocketTimeoutException;
-import java.net.URI;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.LinkedHashSet;
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.TimeUnit;
-import javax.servlet.ServletException;
-import javax.servlet.ServletOutputStream;
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
 import org.apache.nifi.controller.ScheduledState;
 import org.apache.nifi.remote.Peer;
 import org.apache.nifi.remote.Transaction;
@@ -88,11 +55,13 @@
 import org.eclipse.jetty.servlet.ServletHandler;
 import org.eclipse.jetty.util.ssl.SslContextFactory;
 import org.eclipse.jetty.util.thread.QueuedThreadPool;
-import org.junit.After;
-import org.junit.AfterClass;
-import org.junit.Before;
-import org.junit.BeforeClass;
-import org.junit.Test;
+import org.junit.jupiter.api.AfterAll;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.condition.DisabledOnOs;
+import org.junit.jupiter.api.condition.OS;
 import org.littleshoot.proxy.HttpProxyServer;
 import org.littleshoot.proxy.ProxyAuthenticator;
 import org.littleshoot.proxy.impl.DefaultHttpProxyServer;
@@ -100,6 +69,40 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import javax.servlet.ServletException;
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.ServerSocket;
+import java.net.SocketTimeoutException;
+import java.net.URI;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.LinkedHashSet;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+import static org.apache.commons.lang3.StringUtils.isEmpty;
+import static org.apache.nifi.remote.protocol.http.HttpHeaders.LOCATION_HEADER_NAME;
+import static org.apache.nifi.remote.protocol.http.HttpHeaders.LOCATION_URI_INTENT_NAME;
+import static org.apache.nifi.remote.protocol.http.HttpHeaders.LOCATION_URI_INTENT_VALUE;
+import static org.apache.nifi.remote.protocol.http.HttpHeaders.PROTOCOL_VERSION;
+import static org.apache.nifi.remote.protocol.http.HttpHeaders.SERVER_SIDE_TRANSACTION_TTL;
+import static org.junit.Assert.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.junit.jupiter.api.Assertions.fail;
+
 public class TestHttpClient {
 
     private static final Logger logger = LoggerFactory.getLogger(TestHttpClient.class);
@@ -139,11 +142,11 @@
             controller.setInstanceId("remote-instance-id");
             controller.setName("Remote NiFi Flow");
 
-            assertNotNull("Test case should set <inputPorts> depending on the test scenario.", inputPorts);
+            assertNotNull(inputPorts, "Test case should set <inputPorts> depending on the test scenario.");
             controller.setInputPorts(inputPorts);
             controller.setInputPortCount(inputPorts.size());
 
-            assertNotNull("Test case should set <outputPorts> depending on the test scenario.", outputPorts);
+            assertNotNull(outputPorts, "Test case should set <outputPorts> depending on the test scenario.");
             controller.setOutputPorts(outputPorts);
             controller.setOutputPortCount(outputPorts.size());
 
@@ -171,10 +174,10 @@
             final PeersEntity peersEntity = new PeersEntity();
 
             if (req.getLocalPort() == httpConnector.getLocalPort()) {
-                assertNotNull("Test case should set <peers> depending on the test scenario.", peers);
+                assertNotNull(peers, "Test case should set <peers> depending on the test scenario.");
                 peersEntity.setPeers(peers);
             } else {
-                assertNotNull("Test case should set <peersSecure> depending on the test scenario.", peersSecure);
+                assertNotNull(peersSecure, "Test case should set <peersSecure> depending on the test scenario.");
                 peersEntity.setPeers(peersSecure);
             }
 
@@ -431,7 +434,7 @@
         out.flush();
     }
 
-    @BeforeClass
+    @BeforeAll
     public static void setup() throws Exception {
         // Create embedded Jetty server
         // Use less threads to mitigate Gateway Timeout (504) with proxy test
@@ -559,7 +562,7 @@
                 .start();
     }
 
-    @AfterClass
+    @AfterAll
     public static void teardown() throws Exception {
         logger.info("Stopping servers.");
         try {
@@ -600,7 +603,7 @@
 
     }
 
-    @Before
+    @BeforeEach
     public void before() throws Exception {
         testCaseFinished = new CountDownLatch(1);
 
@@ -678,7 +681,7 @@
 
     }
 
-    @After
+    @AfterEach
     public void after() throws Exception {
         testCaseFinished.countDown();
     }
@@ -774,13 +777,8 @@
                 .portName("input-unknown")
                 .build()
         ) {
-            try {
-                client.createTransaction(TransferDirection.SEND);
-                fail();
-            } catch (IOException e) {
-                logger.info("Exception message: {}", e.getMessage());
-                assertTrue(e.getMessage().contains("Failed to determine the identifier of port"));
-            }
+            IOException e = assertThrows(IOException.class, () -> client.createTransaction(TransferDirection.SEND));
+            assertTrue(e.getMessage().contains("Failed to determine the identifier of port"));
         }
     }
 
@@ -858,7 +856,7 @@
                         .build()
         ) {
             final Transaction transaction = client.createTransaction(TransferDirection.SEND);
-            assertNull("createTransaction should fail at peer selection and return null.", transaction);
+            assertNull(transaction, "createTransaction should fail at peer selection and return null.");
         }
 
     }
@@ -885,13 +883,8 @@
                         .portName("input-access-denied")
                         .build()
         ) {
-            try {
-                client.createTransaction(TransferDirection.SEND);
-                fail("Handshake exception should be thrown.");
-            } catch (HandshakeException e) {
-            }
+           assertThrows(HandshakeException.class, () -> client.createTransaction(TransferDirection.SEND));
         }
-
     }
 
     @Test
@@ -1112,13 +1105,8 @@
 
     }
 
-    private void completeShouldFail(Transaction transaction) throws IOException {
-        try {
-            transaction.complete();
-            fail("Complete operation should fail since transaction has already failed.");
-        } catch (IllegalStateException e) {
-            logger.info("An exception was thrown as expected.", e);
-        }
+    private void completeShouldFail(Transaction transaction) {
+        assertThrows(IllegalStateException.class, () -> transaction.complete());
     }
 
     private void confirmShouldFail(Transaction transaction) throws IOException {
@@ -1131,8 +1119,8 @@
     }
 
     @Test
+    @DisabledOnOs(OS.WINDOWS)
     public void testSendTimeout() throws Exception {
-        assumeFalse(isWindowsEnvironment());//skip on windows
         try (
             SiteToSiteClient client = getDefaultBuilder()
                 .timeout(1, TimeUnit.SECONDS)
@@ -1151,26 +1139,17 @@
             serverChecksum = "1345413116";
 
             transaction.send(packet);
-            try {
-                transaction.confirm();
-                fail();
-            } catch (IOException e) {
-                logger.info("An exception was thrown as expected.", e);
-                assertTrue(e.getMessage().contains("TimeoutException"));
-            }
+            IOException e = assertThrows(IOException.class, () -> transaction.confirm());
+            assertTrue(e.getMessage().contains("TimeoutException"));
 
             completeShouldFail(transaction);
         }
 
     }
 
-    private boolean isWindowsEnvironment() {
-        return System.getProperty("os.name").toLowerCase().startsWith("windows");
-    }
-
     @Test
+    @DisabledOnOs(OS.WINDOWS)
     public void testSendTimeoutAfterDataExchange() throws Exception {
-        assumeFalse(isWindowsEnvironment());//skip on windows
         System.setProperty("org.slf4j.simpleLogger.log.org.apache.nifi.remote.protocol.http.HttpClientTransaction", "INFO");
 
         try (
@@ -1197,17 +1176,11 @@
                     }
                 }
 
-            try {
-                confirmShouldFail(transaction);
-                fail("Should be timeout.");
-            } catch (IOException e) {
-                logger.info("Exception message: {}", e.getMessage());
-                assertTrue(e.getMessage().contains("TimeoutException"));
-            }
+            IOException e = assertThrows(IOException.class, () -> confirmShouldFail(transaction));
+            assertTrue(e.getMessage().contains("TimeoutException"));
 
             completeShouldFail(transaction);
         }
-
     }
 
     @Test
@@ -1218,13 +1191,8 @@
                 .portName("output-unknown")
                 .build()
         ) {
-            try {
-                client.createTransaction(TransferDirection.RECEIVE);
-                fail();
-            } catch (IOException e) {
-                logger.info("Exception message: {}", e.getMessage());
-                assertTrue(e.getMessage().contains("Failed to determine the identifier of port"));
-            }
+            IOException e = assertThrows(IOException.class, () -> client.createTransaction(TransferDirection.RECEIVE));
+            assertTrue(e.getMessage().contains("Failed to determine the identifier of port"));
         }
     }
 
@@ -1361,13 +1329,8 @@
                         .portName("output-timeout")
                         .build()
         ) {
-            try {
-                client.createTransaction(TransferDirection.RECEIVE);
-                fail();
-            } catch (IOException e) {
-                logger.info("An exception was thrown as expected.", e);
-                assertTrue(e instanceof SocketTimeoutException);
-            }
+            IOException e = assertThrows(IOException.class, () -> client.createTransaction(TransferDirection.RECEIVE));
+            assertTrue(e instanceof SocketTimeoutException);
         }
     }
 
@@ -1387,13 +1350,8 @@
             assertNotNull(packet);
             consumeDataPacket(packet);
 
-            try {
-                transaction.receive();
-                fail();
-            } catch (IOException e) {
-                logger.info("An exception was thrown as expected.", e);
-                assertTrue(e.getCause() instanceof SocketTimeoutException);
-            }
+            IOException e = assertThrows(IOException.class, () -> transaction.receive());
+            assertTrue(e.getCause() instanceof SocketTimeoutException);
 
             confirmShouldFail(transaction);
             completeShouldFail(transaction);
diff --git a/nifi-commons/nifi-site-to-site-client/src/test/java/org/apache/nifi/remote/client/socket/SiteToSiteClientIT.java b/nifi-commons/nifi-site-to-site-client/src/test/java/org/apache/nifi/remote/client/socket/SiteToSiteClientIT.java
new file mode 100644
index 0000000..4aa8736
--- /dev/null
+++ b/nifi-commons/nifi-site-to-site-client/src/test/java/org/apache/nifi/remote/client/socket/SiteToSiteClientIT.java
@@ -0,0 +1,99 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.nifi.remote.client.socket;
+
+import org.apache.nifi.remote.Transaction;
+import org.apache.nifi.remote.TransferDirection;
+import org.apache.nifi.remote.client.SiteToSiteClient;
+import org.apache.nifi.remote.protocol.DataPacket;
+import org.apache.nifi.remote.util.StandardDataPacket;
+import org.apache.nifi.stream.io.StreamUtils;
+import org.junit.jupiter.api.Test;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.HashMap;
+import java.util.Map;
+
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+
+public class SiteToSiteClientIT {
+    @Test
+    public void testReceive() throws IOException {
+        System.setProperty("org.slf4j.simpleLogger.log.org.apache.nifi.remote", "DEBUG");
+
+        final SiteToSiteClient client = new SiteToSiteClient.Builder()
+                .url("http://localhost:8080/nifi")
+                .portName("cba")
+                .requestBatchCount(10)
+                .build();
+
+        try {
+            for (int i = 0; i < 1000; i++) {
+                final Transaction transaction = client.createTransaction(TransferDirection.RECEIVE);
+                assertNotNull(transaction);
+
+                DataPacket packet;
+                while (true) {
+                    packet = transaction.receive();
+                    if (packet == null) {
+                        break;
+                    }
+
+                    final InputStream in = packet.getData();
+                    final long size = packet.getSize();
+                    final byte[] buff = new byte[(int) size];
+
+                    StreamUtils.fillBuffer(in, buff);
+                }
+
+                transaction.confirm();
+                transaction.complete();
+            }
+        } finally {
+            client.close();
+        }
+    }
+
+    @Test
+    public void testSend() throws IOException {
+        System.setProperty("org.slf4j.simpleLogger.log.org.apache.nifi.remote", "DEBUG");
+
+        final SiteToSiteClient client = new SiteToSiteClient.Builder()
+                .url("http://localhost:8080/nifi")
+                .portName("input")
+                .build();
+
+        try {
+            final Transaction transaction = client.createTransaction(TransferDirection.SEND);
+            assertNotNull(transaction);
+
+            final Map<String, String> attrs = new HashMap<>();
+            attrs.put("site-to-site", "yes, please!");
+            final byte[] bytes = "Hello".getBytes();
+            final ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
+            final DataPacket packet = new StandardDataPacket(attrs, bais, bytes.length);
+            transaction.send(packet);
+
+            transaction.confirm();
+            transaction.complete();
+        } finally {
+            client.close();
+        }
+    }
+}
diff --git a/nifi-commons/nifi-site-to-site-client/src/test/java/org/apache/nifi/remote/client/socket/TestSiteToSiteClient.java b/nifi-commons/nifi-site-to-site-client/src/test/java/org/apache/nifi/remote/client/socket/TestSiteToSiteClient.java
index 7c70a7a..65d3f36 100644
--- a/nifi-commons/nifi-site-to-site-client/src/test/java/org/apache/nifi/remote/client/socket/TestSiteToSiteClient.java
+++ b/nifi-commons/nifi-site-to-site-client/src/test/java/org/apache/nifi/remote/client/socket/TestSiteToSiteClient.java
@@ -20,96 +20,23 @@
 import com.esotericsoftware.kryo.io.Input;
 import com.esotericsoftware.kryo.io.Output;
 import org.apache.nifi.components.state.StateManager;
-import org.apache.nifi.remote.Transaction;
-import org.apache.nifi.remote.TransferDirection;
 import org.apache.nifi.remote.client.SiteToSiteClient;
 import org.apache.nifi.remote.client.SiteToSiteClientConfig;
-import org.apache.nifi.remote.protocol.DataPacket;
-import org.apache.nifi.remote.util.StandardDataPacket;
-import org.apache.nifi.stream.io.StreamUtils;
-import org.junit.Assert;
-import org.junit.Ignore;
-import org.junit.Test;
+import org.junit.jupiter.api.Test;
 import org.mockito.Mockito;
 
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.HashMap;
 import java.util.LinkedHashSet;
-import java.util.Map;
 import java.util.Set;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNull;
+
 public class TestSiteToSiteClient {
 
     @Test
-    @Ignore("For local testing only; not really a unit test but a manual test")
-    public void testReceive() throws IOException {
-        System.setProperty("org.slf4j.simpleLogger.log.org.apache.nifi.remote", "DEBUG");
-
-        final SiteToSiteClient client = new SiteToSiteClient.Builder()
-                .url("http://localhost:8080/nifi")
-                .portName("cba")
-                .requestBatchCount(10)
-                .build();
-
-        try {
-            for (int i = 0; i < 1000; i++) {
-                final Transaction transaction = client.createTransaction(TransferDirection.RECEIVE);
-                Assert.assertNotNull(transaction);
-
-                DataPacket packet;
-                while (true) {
-                    packet = transaction.receive();
-                    if (packet == null) {
-                        break;
-                    }
-
-                    final InputStream in = packet.getData();
-                    final long size = packet.getSize();
-                    final byte[] buff = new byte[(int) size];
-
-                    StreamUtils.fillBuffer(in, buff);
-                }
-
-                transaction.confirm();
-                transaction.complete();
-            }
-        } finally {
-            client.close();
-        }
-    }
-
-    @Test
-    @Ignore("For local testing only; not really a unit test but a manual test")
-    public void testSend() throws IOException {
-        System.setProperty("org.slf4j.simpleLogger.log.org.apache.nifi.remote", "DEBUG");
-
-        final SiteToSiteClient client = new SiteToSiteClient.Builder()
-                .url("http://localhost:8080/nifi")
-                .portName("input")
-                .build();
-
-        try {
-            final Transaction transaction = client.createTransaction(TransferDirection.SEND);
-            Assert.assertNotNull(transaction);
-
-            final Map<String, String> attrs = new HashMap<>();
-            attrs.put("site-to-site", "yes, please!");
-            final byte[] bytes = "Hello".getBytes();
-            final ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
-            final DataPacket packet = new StandardDataPacket(attrs, bais, bytes.length);
-            transaction.send(packet);
-
-            transaction.confirm();
-            transaction.complete();
-        } finally {
-            client.close();
-        }
-    }
-
-    @Test
     public void testSerialization() {
         final SiteToSiteClientConfig clientConfig = new SiteToSiteClient.Builder()
                 .url("http://localhost:8080/nifi")
@@ -132,7 +59,7 @@
 
         try {
             SiteToSiteClientConfig clientConfig2 = kryo.readObject(input, SiteToSiteClient.StandardSiteToSiteClientConfig.class);
-            Assert.assertEquals(clientConfig.getUrls(), clientConfig2.getUrls());
+            assertEquals(clientConfig.getUrls(), clientConfig2.getUrls());
         } finally {
             input.close();
         }
@@ -163,10 +90,10 @@
 
         try {
             SiteToSiteClientConfig clientConfig2 = kryo.readObject(input, SiteToSiteClient.StandardSiteToSiteClientConfig.class);
-            Assert.assertEquals(clientConfig.getUrls(), clientConfig2.getUrls());
+            assertEquals(clientConfig.getUrls(), clientConfig2.getUrls());
             // Serialization works, but the state manager is not serialized.
-            Assert.assertNotNull(clientConfig.getStateManager());
-            Assert.assertNull(clientConfig2.getStateManager());
+            assertNotNull(clientConfig.getStateManager());
+            assertNull(clientConfig2.getStateManager());
         } finally {
             input.close();
         }
@@ -181,8 +108,8 @@
                 .urls(urls)
                 .buildConfig();
 
-        Assert.assertEquals("http://node1:8080/nifi", config.getUrl());
-        Assert.assertEquals(urls, config.getUrls());
+        assertEquals("http://node1:8080/nifi", config.getUrl());
+        assertEquals(urls, config.getUrls());
     }
 
 }
diff --git a/nifi-commons/nifi-site-to-site-client/src/test/java/org/apache/nifi/remote/protocol/SiteToSiteTestUtils.java b/nifi-commons/nifi-site-to-site-client/src/test/java/org/apache/nifi/remote/protocol/SiteToSiteTestUtils.java
index 1ed23e0..c0eb074 100644
--- a/nifi-commons/nifi-site-to-site-client/src/test/java/org/apache/nifi/remote/protocol/SiteToSiteTestUtils.java
+++ b/nifi-commons/nifi-site-to-site-client/src/test/java/org/apache/nifi/remote/protocol/SiteToSiteTestUtils.java
@@ -16,22 +16,23 @@
  */
 package org.apache.nifi.remote.protocol;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
+import org.apache.nifi.remote.Transaction;
+import org.apache.nifi.remote.TransactionCompletion;
+import org.apache.nifi.remote.util.StandardDataPacket;
+import org.apache.nifi.stream.io.StreamUtils;
 
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.io.UnsupportedEncodingException;
 import java.util.HashMap;
-import org.apache.nifi.remote.Transaction;
-import org.apache.nifi.remote.TransactionCompletion;
-import org.apache.nifi.remote.util.StandardDataPacket;
-import org.apache.nifi.stream.io.StreamUtils;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
 public class SiteToSiteTestUtils {
     public static DataPacket createDataPacket(String contents) {
@@ -61,7 +62,7 @@
 
         TransactionCompletion completion = transaction.complete();
         assertEquals(Transaction.TransactionState.TRANSACTION_COMPLETED, transaction.getState());
-        assertFalse("Should NOT be backoff", completion.isBackoff());
+        assertFalse(completion.isBackoff(), "Should NOT be backoff");
         assertEquals(0, completion.getDataPacketsTransferred());
     }
 
@@ -81,7 +82,7 @@
 
         TransactionCompletion completion = transaction.complete();
         assertEquals(Transaction.TransactionState.TRANSACTION_COMPLETED, transaction.getState());
-        assertFalse("Should NOT be backoff", completion.isBackoff());
+        assertFalse(completion.isBackoff(), "Should NOT be backoff");
         assertEquals(1, completion.getDataPacketsTransferred());
     }
 
@@ -104,7 +105,7 @@
 
         TransactionCompletion completion = transaction.complete();
         assertEquals(Transaction.TransactionState.TRANSACTION_COMPLETED, transaction.getState());
-        assertFalse("Should NOT be backoff", completion.isBackoff());
+        assertFalse(completion.isBackoff(), "Should NOT be backoff");
         assertEquals(2, completion.getDataPacketsTransferred());
     }
 
@@ -124,36 +125,18 @@
         packet = transaction.receive();
         assertNull(packet);
 
-        try {
-            transaction.confirm();
-            fail();
-        } catch (IOException e){
-            assertTrue(e.getMessage().contains("Received a BadChecksum response"));
-            assertEquals(Transaction.TransactionState.ERROR, transaction.getState());
-        }
+        IOException io = assertThrows(IOException.class, () -> transaction.confirm());
+        assertTrue(io.getMessage().contains("Received a BadChecksum response"));
+        assertEquals(Transaction.TransactionState.ERROR, transaction.getState());
 
-        try {
-            transaction.complete();
-            fail("It's not confirmed.");
-        } catch (IllegalStateException e){
-            assertEquals(Transaction.TransactionState.ERROR, transaction.getState());
-        }
+        assertThrows(IllegalStateException.class, () -> transaction.complete());
+        assertEquals(Transaction.TransactionState.ERROR, transaction.getState());
     }
 
     public static void execSendZeroFlowFile(Transaction transaction) throws IOException {
         assertEquals(Transaction.TransactionState.TRANSACTION_STARTED, transaction.getState());
-
-        try {
-            transaction.confirm();
-            fail("Nothing has been sent.");
-        } catch (IllegalStateException e){
-        }
-
-        try {
-            transaction.complete();
-            fail("Nothing has been sent.");
-        } catch (IllegalStateException e){
-        }
+        assertThrows(IllegalStateException.class, () -> transaction.confirm());
+        assertThrows(IllegalStateException.class, () -> transaction.complete());
     }
 
     public static void execSendOneFlowFile(Transaction transaction) throws IOException {
@@ -167,7 +150,7 @@
 
         TransactionCompletion completion = transaction.complete();
         assertEquals(Transaction.TransactionState.TRANSACTION_COMPLETED, transaction.getState());
-        assertFalse("Should NOT be backoff", completion.isBackoff());
+        assertFalse(completion.isBackoff(), "Should NOT be backoff");
         assertEquals(1, completion.getDataPacketsTransferred());
     }
 
@@ -185,7 +168,7 @@
 
         TransactionCompletion completion = transaction.complete();
         assertEquals(Transaction.TransactionState.TRANSACTION_COMPLETED, transaction.getState());
-        assertFalse("Should NOT be backoff", completion.isBackoff());
+        assertFalse(completion.isBackoff(), "Should NOT be backoff");
         assertEquals(2, completion.getDataPacketsTransferred());
     }
 
@@ -198,21 +181,12 @@
         packet = createDataPacket("contents on client 2");
         transaction.send(packet);
 
+        IOException e = assertThrows(IOException.class, () -> transaction.confirm());
+        assertTrue(e.getMessage().contains("peer calculated CRC32 Checksum as Different checksum"));
+        assertEquals(Transaction.TransactionState.ERROR, transaction.getState());
 
-        try {
-            transaction.confirm();
-            fail();
-        } catch (IOException e){
-            assertTrue(e.getMessage().contains("peer calculated CRC32 Checksum as Different checksum"));
-            assertEquals(Transaction.TransactionState.ERROR, transaction.getState());
-        }
-
-        try {
-            transaction.complete();
-            fail("It's not confirmed.");
-        } catch (IllegalStateException e){
-            assertEquals(Transaction.TransactionState.ERROR, transaction.getState());
-        }
+        assertThrows(IllegalStateException.class, () -> transaction.complete());
+        assertEquals(Transaction.TransactionState.ERROR, transaction.getState());
     }
 
     public static void execSendButDestinationFull(Transaction transaction) throws IOException {
@@ -229,7 +203,7 @@
 
         TransactionCompletion completion = transaction.complete();
         assertEquals(Transaction.TransactionState.TRANSACTION_COMPLETED, transaction.getState());
-        assertTrue("Should be backoff", completion.isBackoff());
+        assertTrue(completion.isBackoff(), "Should be backoff");
         assertEquals(2, completion.getDataPacketsTransferred());
     }
 
diff --git a/nifi-commons/nifi-site-to-site-client/src/test/java/org/apache/nifi/remote/protocol/http/TestHttpClientTransaction.java b/nifi-commons/nifi-site-to-site-client/src/test/java/org/apache/nifi/remote/protocol/http/TestHttpClientTransaction.java
index 2783cef..590794f 100644
--- a/nifi-commons/nifi-site-to-site-client/src/test/java/org/apache/nifi/remote/protocol/http/TestHttpClientTransaction.java
+++ b/nifi-commons/nifi-site-to-site-client/src/test/java/org/apache/nifi/remote/protocol/http/TestHttpClientTransaction.java
@@ -16,32 +16,6 @@
  */
 package org.apache.nifi.remote.protocol.http;
 
-import static org.apache.nifi.remote.protocol.ResponseCode.CONFIRM_TRANSACTION;
-import static org.apache.nifi.remote.protocol.SiteToSiteTestUtils.createDataPacket;
-import static org.apache.nifi.remote.protocol.SiteToSiteTestUtils.execReceiveOneFlowFile;
-import static org.apache.nifi.remote.protocol.SiteToSiteTestUtils.execReceiveTwoFlowFiles;
-import static org.apache.nifi.remote.protocol.SiteToSiteTestUtils.execReceiveWithInvalidChecksum;
-import static org.apache.nifi.remote.protocol.SiteToSiteTestUtils.execReceiveZeroFlowFile;
-import static org.apache.nifi.remote.protocol.SiteToSiteTestUtils.execSendButDestinationFull;
-import static org.apache.nifi.remote.protocol.SiteToSiteTestUtils.execSendOneFlowFile;
-import static org.apache.nifi.remote.protocol.SiteToSiteTestUtils.execSendTwoFlowFiles;
-import static org.apache.nifi.remote.protocol.SiteToSiteTestUtils.execSendWithInvalidChecksum;
-import static org.apache.nifi.remote.protocol.SiteToSiteTestUtils.execSendZeroFlowFile;
-import static org.apache.nifi.remote.protocol.SiteToSiteTestUtils.readContents;
-import static org.junit.Assert.assertEquals;
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.eq;
-import static org.mockito.Mockito.doAnswer;
-import static org.mockito.Mockito.doNothing;
-import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.verify;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
 import org.apache.nifi.events.EventReporter;
 import org.apache.nifi.remote.Peer;
 import org.apache.nifi.remote.PeerDescription;
@@ -57,12 +31,37 @@
 import org.apache.nifi.remote.util.SiteToSiteRestApiClient;
 import org.apache.nifi.reporting.Severity;
 import org.apache.nifi.web.api.entity.TransactionResultEntity;
-import org.junit.Test;
-import org.mockito.invocation.InvocationOnMock;
-import org.mockito.stubbing.Answer;
+import org.junit.jupiter.api.Test;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+
+import static org.apache.nifi.remote.protocol.ResponseCode.CONFIRM_TRANSACTION;
+import static org.apache.nifi.remote.protocol.SiteToSiteTestUtils.createDataPacket;
+import static org.apache.nifi.remote.protocol.SiteToSiteTestUtils.execReceiveOneFlowFile;
+import static org.apache.nifi.remote.protocol.SiteToSiteTestUtils.execReceiveTwoFlowFiles;
+import static org.apache.nifi.remote.protocol.SiteToSiteTestUtils.execReceiveWithInvalidChecksum;
+import static org.apache.nifi.remote.protocol.SiteToSiteTestUtils.execReceiveZeroFlowFile;
+import static org.apache.nifi.remote.protocol.SiteToSiteTestUtils.execSendButDestinationFull;
+import static org.apache.nifi.remote.protocol.SiteToSiteTestUtils.execSendOneFlowFile;
+import static org.apache.nifi.remote.protocol.SiteToSiteTestUtils.execSendTwoFlowFiles;
+import static org.apache.nifi.remote.protocol.SiteToSiteTestUtils.execSendWithInvalidChecksum;
+import static org.apache.nifi.remote.protocol.SiteToSiteTestUtils.execSendZeroFlowFile;
+import static org.apache.nifi.remote.protocol.SiteToSiteTestUtils.readContents;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.doAnswer;
+import static org.mockito.Mockito.doNothing;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+
 public class TestHttpClientTransaction {
 
     private Logger logger = LoggerFactory.getLogger(TestHttpClientTransaction.class);
@@ -108,7 +107,7 @@
 
         execReceiveZeroFlowFile(transaction);
 
-        assertEquals("Client sends nothing as payload to receive flow files.", 0, clientRequest.toByteArray().length);
+        assertEquals(0, clientRequest.toByteArray().length, "Client sends nothing as payload to receive flow files.");
     }
 
     @Test
@@ -129,7 +128,7 @@
 
         execReceiveOneFlowFile(transaction);
 
-        assertEquals("Client sends nothing as payload to receive flow files.", 0, clientRequest.toByteArray().length);
+        assertEquals(0, clientRequest.toByteArray().length, "Client sends nothing as payload to receive flow files.");
         verify(apiClient).commitReceivingFlowFiles(transactionUrl, CONFIRM_TRANSACTION, "3680976076");
     }
 
@@ -152,7 +151,7 @@
 
         execReceiveTwoFlowFiles(transaction);
 
-        assertEquals("Client sends nothing as payload to receive flow files.", 0, clientRequest.toByteArray().length);
+        assertEquals(0, clientRequest.toByteArray().length, "Client sends nothing as payload to receive flow files.");
         verify(apiClient).commitReceivingFlowFiles(transactionUrl, CONFIRM_TRANSACTION, "2969091230");
     }
 
@@ -176,7 +175,7 @@
 
         execReceiveWithInvalidChecksum(transaction);
 
-        assertEquals("Client sends nothing as payload to receive flow files.", 0, clientRequest.toByteArray().length);
+        assertEquals(0, clientRequest.toByteArray().length, "Client sends nothing as payload to receive flow files.");
         verify(apiClient).commitReceivingFlowFiles(transactionUrl, CONFIRM_TRANSACTION, "2969091230");
     }
 
@@ -194,7 +193,7 @@
 
         execSendZeroFlowFile(transaction);
 
-        assertEquals("Client didn't send anything", 0, clientRequest.toByteArray().length);
+        assertEquals(0, clientRequest.toByteArray().length, "Client didn't send anything");
     }
 
     @Test
@@ -204,13 +203,10 @@
         final String transactionUrl = "http://www.example.com/data-transfer/input-ports/portId/transactions/transactionId";
         doNothing().when(apiClient).openConnectionForSend(eq(transactionUrl), any(Peer.class));
         // Emulate that server returns correct checksum.
-        doAnswer(new Answer() {
-            @Override
-            public Object answer(InvocationOnMock invocation) throws Throwable {
-                HttpCommunicationsSession commSession = (HttpCommunicationsSession)invocation.getArguments()[0];
-                commSession.setChecksum("2946083981");
-                return null;
-            }
+        doAnswer(invocation -> {
+            HttpCommunicationsSession commSession = (HttpCommunicationsSession)invocation.getArguments()[0];
+            commSession.setChecksum("2946083981");
+            return null;
         }).when(apiClient).finishTransferFlowFiles(any(CommunicationsSession.class));
         TransactionResultEntity resultEntity = new TransactionResultEntity();
         resultEntity.setResponseCode(ResponseCode.TRANSACTION_FINISHED.getCode());
@@ -238,13 +234,10 @@
         final String transactionUrl = "http://www.example.com/data-transfer/input-ports/portId/transactions/transactionId";
         doNothing().when(apiClient).openConnectionForSend(eq("portId"), any(Peer.class));
         // Emulate that server returns correct checksum.
-        doAnswer(new Answer() {
-            @Override
-            public Object answer(InvocationOnMock invocation) throws Throwable {
-                HttpCommunicationsSession commSession = (HttpCommunicationsSession)invocation.getArguments()[0];
-                commSession.setChecksum("3359812065");
-                return null;
-            }
+        doAnswer(invocation -> {
+            HttpCommunicationsSession commSession = (HttpCommunicationsSession)invocation.getArguments()[0];
+            commSession.setChecksum("3359812065");
+            return null;
         }).when(apiClient).finishTransferFlowFiles(any(CommunicationsSession.class));
         TransactionResultEntity resultEntity = new TransactionResultEntity();
         resultEntity.setResponseCode(ResponseCode.TRANSACTION_FINISHED.getCode());
@@ -273,21 +266,15 @@
         final String transactionUrl = "http://www.example.com/data-transfer/input-ports/portId/transactions/transactionId";
         doNothing().when(apiClient).openConnectionForSend(eq(transactionUrl), any(Peer.class));
         // Emulate that server returns incorrect checksum.
-        doAnswer(new Answer() {
-            @Override
-            public Object answer(InvocationOnMock invocation) throws Throwable {
-                HttpCommunicationsSession commSession = (HttpCommunicationsSession)invocation.getArguments()[0];
-                commSession.setChecksum("Different checksum");
-                return null;
-            }
+        doAnswer(invocation -> {
+            HttpCommunicationsSession commSession = (HttpCommunicationsSession)invocation.getArguments()[0];
+            commSession.setChecksum("Different checksum");
+            return null;
         }).when(apiClient).finishTransferFlowFiles(any(CommunicationsSession.class));
-        doAnswer(new Answer() {
-            @Override
-            public Object answer(InvocationOnMock invocation) throws Throwable {
-                TransactionResultEntity serverResult = new TransactionResultEntity();
-                serverResult.setResponseCode(ResponseCode.CANCEL_TRANSACTION.getCode());
-                return serverResult;
-            }
+        doAnswer(invocation -> {
+            TransactionResultEntity serverResult = new TransactionResultEntity();
+            serverResult.setResponseCode(ResponseCode.CANCEL_TRANSACTION.getCode());
+            return serverResult;
         }).when(apiClient).commitTransferFlowFiles(eq(transactionUrl), eq(ResponseCode.BAD_CHECKSUM));
 
         ByteArrayOutputStream serverResponseBos = new ByteArrayOutputStream();
@@ -314,13 +301,10 @@
         final String transactionUrl = "http://www.example.com/data-transfer/input-ports/portId/transactions/transactionId";
         doNothing().when(apiClient).openConnectionForSend(eq("portId"), any(Peer.class));
         // Emulate that server returns correct checksum.
-        doAnswer(new Answer() {
-            @Override
-            public Object answer(InvocationOnMock invocation) throws Throwable {
-                HttpCommunicationsSession commSession = (HttpCommunicationsSession)invocation.getArguments()[0];
-                commSession.setChecksum("3359812065");
-                return null;
-            }
+        doAnswer(invocation -> {
+            HttpCommunicationsSession commSession = (HttpCommunicationsSession)invocation.getArguments()[0];
+            commSession.setChecksum("3359812065");
+            return null;
         }).when(apiClient).finishTransferFlowFiles(any(CommunicationsSession.class));
         TransactionResultEntity resultEntity = new TransactionResultEntity();
         resultEntity.setResponseCode(ResponseCode.TRANSACTION_FINISHED_BUT_DESTINATION_FULL.getCode());
diff --git a/nifi-commons/nifi-site-to-site-client/src/test/java/org/apache/nifi/remote/protocol/socket/TestSocketClientTransaction.java b/nifi-commons/nifi-site-to-site-client/src/test/java/org/apache/nifi/remote/protocol/socket/TestSocketClientTransaction.java
index edae052..058602c 100644
--- a/nifi-commons/nifi-site-to-site-client/src/test/java/org/apache/nifi/remote/protocol/socket/TestSocketClientTransaction.java
+++ b/nifi-commons/nifi-site-to-site-client/src/test/java/org/apache/nifi/remote/protocol/socket/TestSocketClientTransaction.java
@@ -30,7 +30,7 @@
 import org.apache.nifi.remote.protocol.RequestType;
 import org.apache.nifi.remote.protocol.Response;
 import org.apache.nifi.remote.protocol.ResponseCode;
-import org.junit.Test;
+import org.junit.jupiter.api.Test;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -51,7 +51,7 @@
 import static org.apache.nifi.remote.protocol.SiteToSiteTestUtils.execSendWithInvalidChecksum;
 import static org.apache.nifi.remote.protocol.SiteToSiteTestUtils.execSendZeroFlowFile;
 import static org.apache.nifi.remote.protocol.SiteToSiteTestUtils.readContents;
-import static org.junit.Assert.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
@@ -124,7 +124,7 @@
         assertEquals(RequestType.RECEIVE_FLOWFILES, RequestType.readRequestType(sentByClient));
         Response confirmResponse = Response.read(sentByClient);
         assertEquals(ResponseCode.CONFIRM_TRANSACTION, confirmResponse.getCode());
-        assertEquals("Checksum should be calculated at client", "3680976076", confirmResponse.getMessage());
+        assertEquals( "3680976076", confirmResponse.getMessage(), "Checksum should be calculated at client");
         Response completeResponse = Response.read(sentByClient);
         assertEquals(ResponseCode.TRANSACTION_FINISHED, completeResponse.getCode());
         assertEquals(-1, sentByClient.read());
@@ -157,7 +157,7 @@
         assertEquals(RequestType.RECEIVE_FLOWFILES, RequestType.readRequestType(sentByClient));
         Response confirmResponse = Response.read(sentByClient);
         assertEquals(ResponseCode.CONFIRM_TRANSACTION, confirmResponse.getCode());
-        assertEquals("Checksum should be calculated at client", "2969091230", confirmResponse.getMessage());
+        assertEquals("2969091230", confirmResponse.getMessage(), "Checksum should be calculated at client");
         Response completeResponse = Response.read(sentByClient);
         assertEquals(ResponseCode.TRANSACTION_FINISHED, completeResponse.getCode());
         assertEquals(-1, sentByClient.read());
@@ -188,7 +188,7 @@
         assertEquals(RequestType.RECEIVE_FLOWFILES, RequestType.readRequestType(sentByClient));
         Response confirmResponse = Response.read(sentByClient);
         assertEquals(ResponseCode.CONFIRM_TRANSACTION, confirmResponse.getCode());
-        assertEquals("Checksum should be calculated at client", "2969091230", confirmResponse.getMessage());
+        assertEquals( "2969091230", confirmResponse.getMessage(), "Checksum should be calculated at client");
         assertEquals(-1, sentByClient.read());
     }
 
diff --git a/nifi-commons/nifi-site-to-site-client/src/test/java/org/apache/nifi/remote/util/TestSiteToSiteRestApiClient.java b/nifi-commons/nifi-site-to-site-client/src/test/java/org/apache/nifi/remote/util/TestSiteToSiteRestApiClient.java
index 22b192b..d38022c 100644
--- a/nifi-commons/nifi-site-to-site-client/src/test/java/org/apache/nifi/remote/util/TestSiteToSiteRestApiClient.java
+++ b/nifi-commons/nifi-site-to-site-client/src/test/java/org/apache/nifi/remote/util/TestSiteToSiteRestApiClient.java
@@ -16,21 +16,21 @@
  */
 package org.apache.nifi.remote.util;
 
-import org.junit.Assert;
-import org.junit.Test;
+import org.junit.jupiter.api.Test;
 
 import java.util.Iterator;
 import java.util.Set;
 
 import static org.apache.nifi.remote.util.SiteToSiteRestApiClient.parseClusterUrls;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
 public class TestSiteToSiteRestApiClient {
 
     private static void assertSingleUri(final String expected, final Set<String> urls) {
-        Assert.assertEquals(1, urls.size());
-        Assert.assertEquals(expected, urls.iterator().next().toString());
+        assertEquals(1, urls.size());
+        assertEquals(expected, urls.iterator().next().toString());
     }
 
     @Test
@@ -122,57 +122,42 @@
 
     @Test
     public void testGetUrlsEmpty() throws Exception {
-        try {
-            parseClusterUrls(null);
-            fail("Should fail if cluster URL was not specified.");
-        } catch (IllegalArgumentException e) {
-        }
+        assertThrows(IllegalArgumentException.class, () -> parseClusterUrls(null));
 
-        try {
-            parseClusterUrls("");
-            fail("Should fail if cluster URL was not specified.");
-        } catch (IllegalArgumentException e) {
-        }
+        assertThrows(IllegalArgumentException.class, () -> parseClusterUrls(""));
     }
 
     @Test
     public void testGetUrlsOne() throws Exception {
         final Set<String> urls = parseClusterUrls("http://localhost:8080/nifi");
 
-        Assert.assertEquals(1, urls.size());
-        Assert.assertEquals("http://localhost:8080/nifi-api", urls.iterator().next());
+        assertEquals(1, urls.size());
+        assertEquals("http://localhost:8080/nifi-api", urls.iterator().next());
     }
 
     @Test
     public void testGetUrlsThree() throws Exception {
         final Set<String> urls = parseClusterUrls("http://host1:8080/nifi,http://host2:8080/nifi,http://host3:8080/nifi");
 
-        Assert.assertEquals(3, urls.size());
+        assertEquals(3, urls.size());
         final Iterator<String> iterator = urls.iterator();
-        Assert.assertEquals("http://host1:8080/nifi-api", iterator.next());
-        Assert.assertEquals("http://host2:8080/nifi-api", iterator.next());
-        Assert.assertEquals("http://host3:8080/nifi-api", iterator.next());
+        assertEquals("http://host1:8080/nifi-api", iterator.next());
+        assertEquals("http://host2:8080/nifi-api", iterator.next());
+        assertEquals("http://host3:8080/nifi-api", iterator.next());
     }
 
     @Test
-    public void testGetUrlsDifferentProtocols() throws Exception {
+    public void testGetUrlsDifferentProtocols() {
+        IllegalArgumentException exception = assertThrows(IllegalArgumentException.class,
+                () -> parseClusterUrls("http://host1:8080/nifi,https://host2:8080/nifi,http://host3:8080/nifi"));
 
-        try {
-            parseClusterUrls("http://host1:8080/nifi,https://host2:8080/nifi,http://host3:8080/nifi");
-            fail("Should fail if cluster URLs contain different protocols.");
-        } catch (IllegalArgumentException e) {
-            assertTrue(e.getMessage().contains("Different protocols"));
-        }
+        assertTrue(exception.getMessage().contains("Different protocols"));
     }
 
     @Test
-    public void testGetUrlsMalformed() throws Exception {
-
-        try {
-            parseClusterUrls("http://host1:8080/nifi,host&2:8080,http://host3:8080/nifi");
-            fail("Should fail if cluster URLs contain illegal URL.");
-        } catch (IllegalArgumentException e) {
-            assertTrue(e.getMessage().contains("malformed"));
-        }
+    public void testGetUrlsMalformed() {
+        IllegalArgumentException exception = assertThrows(IllegalArgumentException.class,
+                () -> parseClusterUrls("http://host1:8080/nifi,host&2:8080,http://host3:8080/nifi"));
+        assertTrue(exception.getMessage().contains("malformed"));
     }
 }
diff --git a/nifi-commons/nifi-socket-utils/src/test/groovy/org/apache/nifi/io/socket/SocketUtilsTest.groovy b/nifi-commons/nifi-socket-utils/src/test/groovy/org/apache/nifi/io/socket/SocketUtilsTest.groovy
index 9b35109..2ffaf6a 100644
--- a/nifi-commons/nifi-socket-utils/src/test/groovy/org/apache/nifi/io/socket/SocketUtilsTest.groovy
+++ b/nifi-commons/nifi-socket-utils/src/test/groovy/org/apache/nifi/io/socket/SocketUtilsTest.groovy
@@ -16,25 +16,19 @@
  */
 package org.apache.nifi.io.socket
 
-
 import org.apache.nifi.security.util.KeystoreType
 import org.apache.nifi.security.util.StandardTlsConfiguration
 import org.apache.nifi.security.util.TlsConfiguration
 import org.apache.nifi.util.NiFiProperties
 import org.bouncycastle.jce.provider.BouncyCastleProvider
-import org.junit.After
-import org.junit.Before
-import org.junit.BeforeClass
-import org.junit.Test
-import org.junit.runner.RunWith
-import org.junit.runners.JUnit4
+import org.junit.jupiter.api.BeforeAll
+import org.junit.jupiter.api.Test
 import org.slf4j.Logger
 import org.slf4j.LoggerFactory
 
 import javax.net.ssl.SSLServerSocket
 import java.security.Security
 
-@RunWith(JUnit4.class)
 class SocketUtilsTest extends GroovyTestCase {
     private static final Logger logger = LoggerFactory.getLogger(SocketUtilsTest.class)
 
@@ -65,7 +59,7 @@
 //    private static final TlsConfiguration TLS_CONFIGURATION = new StandardTlsConfiguration(KEYSTORE_PATH, KEYSTORE_PASSWORD, KEY_PASSWORD, KEYSTORE_TYPE, TRUSTSTORE_PATH, TRUSTSTORE_PASSWORD, TRUSTSTORE_TYPE, PROTOCOL)
 //    private static final SSLContext sslContext = SslContextFactory.createSslContext(TLS_CONFIGURATION, ClientAuth.NONE)
 
-    @BeforeClass
+    @BeforeAll
     static void setUpOnce() throws Exception {
         Security.addProvider(new BouncyCastleProvider())
 
@@ -74,16 +68,6 @@
         }
     }
 
-    @Before
-    void setUp() {
-
-    }
-
-    @After
-    void tearDown() {
-
-    }
-
     @Test
     void testCreateSSLServerSocketShouldRestrictTlsProtocols() {
         // Arrange
diff --git a/nifi-commons/nifi-socket-utils/src/test/java/org/apache/nifi/io/nio/example/ServerMain.java b/nifi-commons/nifi-socket-utils/src/test/java/org/apache/nifi/io/nio/example/ServerMain.java
index a266ade..120e778 100644
--- a/nifi-commons/nifi-socket-utils/src/test/java/org/apache/nifi/io/nio/example/ServerMain.java
+++ b/nifi-commons/nifi-socket-utils/src/test/java/org/apache/nifi/io/nio/example/ServerMain.java
@@ -16,6 +16,13 @@
  */
 package org.apache.nifi.io.nio.example;
 
+import org.apache.nifi.io.nio.BufferPool;
+import org.apache.nifi.io.nio.ChannelListener;
+import org.apache.nifi.io.nio.consumer.StreamConsumer;
+import org.apache.nifi.io.nio.consumer.StreamConsumerFactory;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 import java.io.IOException;
 import java.util.Calendar;
 import java.util.HashSet;
@@ -27,14 +34,6 @@
 import java.util.concurrent.ScheduledFuture;
 import java.util.concurrent.TimeUnit;
 
-import org.apache.nifi.io.nio.BufferPool;
-import org.apache.nifi.io.nio.ChannelListener;
-import org.apache.nifi.io.nio.consumer.StreamConsumer;
-import org.apache.nifi.io.nio.consumer.StreamConsumerFactory;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
 /**
  *
  */
diff --git a/nifi-commons/nifi-socket-utils/src/test/java/org/apache/nifi/io/nio/example/TCPClient.java b/nifi-commons/nifi-socket-utils/src/test/java/org/apache/nifi/io/nio/example/TCPClient.java
index 1c4b70c..c9d8886 100644
--- a/nifi-commons/nifi-socket-utils/src/test/java/org/apache/nifi/io/nio/example/TCPClient.java
+++ b/nifi-commons/nifi-socket-utils/src/test/java/org/apache/nifi/io/nio/example/TCPClient.java
@@ -16,13 +16,13 @@
  */
 package org.apache.nifi.io.nio.example;
 
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 import java.io.IOException;
 import java.net.Socket;
 import java.net.SocketException;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
 /**
  */
 public class TCPClient {
diff --git a/nifi-commons/nifi-socket-utils/src/test/java/org/apache/nifi/io/nio/example/UDPClient.java b/nifi-commons/nifi-socket-utils/src/test/java/org/apache/nifi/io/nio/example/UDPClient.java
index 00a00a1..9741e94 100644
--- a/nifi-commons/nifi-socket-utils/src/test/java/org/apache/nifi/io/nio/example/UDPClient.java
+++ b/nifi-commons/nifi-socket-utils/src/test/java/org/apache/nifi/io/nio/example/UDPClient.java
@@ -16,13 +16,13 @@
  */
 package org.apache.nifi.io.nio.example;
 
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 import java.net.DatagramPacket;
 import java.net.DatagramSocket;
 import java.net.InetSocketAddress;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
 /**
  */
 public class UDPClient {
diff --git a/nifi-commons/nifi-socket-utils/src/test/java/org/apache/nifi/io/nio/example/UselessStreamConsumer.java b/nifi-commons/nifi-socket-utils/src/test/java/org/apache/nifi/io/nio/example/UselessStreamConsumer.java
index 107c087..1ce90df 100644
--- a/nifi-commons/nifi-socket-utils/src/test/java/org/apache/nifi/io/nio/example/UselessStreamConsumer.java
+++ b/nifi-commons/nifi-socket-utils/src/test/java/org/apache/nifi/io/nio/example/UselessStreamConsumer.java
@@ -16,11 +16,11 @@
  */
 package org.apache.nifi.io.nio.example;
 
+import org.apache.nifi.io.nio.consumer.AbstractStreamConsumer;
+
 import java.io.IOException;
 import java.nio.ByteBuffer;
 
-import org.apache.nifi.io.nio.consumer.AbstractStreamConsumer;
-
 /**
  *
  */
diff --git a/nifi-commons/nifi-utils/src/test/groovy/org/apache/nifi/util/TestFormatUtilsGroovy.groovy b/nifi-commons/nifi-utils/src/test/groovy/org/apache/nifi/util/TestFormatUtilsGroovy.groovy
index 8fc9d0c..f469d87 100644
--- a/nifi-commons/nifi-utils/src/test/groovy/org/apache/nifi/util/TestFormatUtilsGroovy.groovy
+++ b/nifi-commons/nifi-utils/src/test/groovy/org/apache/nifi/util/TestFormatUtilsGroovy.groovy
@@ -16,39 +16,23 @@
  */
 package org.apache.nifi.util
 
-
-import org.junit.After
-import org.junit.Before
-import org.junit.BeforeClass
-import org.junit.Test
-import org.junit.runner.RunWith
-import org.junit.runners.JUnit4
+import org.junit.jupiter.api.BeforeAll
+import org.junit.jupiter.api.Test
 import org.slf4j.Logger
 import org.slf4j.LoggerFactory
 
 import java.util.concurrent.TimeUnit
 
-@RunWith(JUnit4.class)
 class TestFormatUtilsGroovy extends GroovyTestCase {
     private static final Logger logger = LoggerFactory.getLogger(TestFormatUtilsGroovy.class)
 
-    @BeforeClass
+    @BeforeAll
     static void setUpOnce() throws Exception {
         logger.metaClass.methodMissing = { String name, args ->
             logger.info("[${name?.toUpperCase()}] ${(args as List).join(" ")}")
         }
     }
 
-    @Before
-    void setUp() throws Exception {
-
-    }
-
-    @After
-    void tearDown() throws Exception {
-
-    }
-
     /**
      * New feature test
      */
diff --git a/nifi-commons/nifi-utils/src/test/java/org/apache/nifi/processor/TestFormatUtils.java b/nifi-commons/nifi-utils/src/test/java/org/apache/nifi/processor/TestFormatUtils.java
index deb4b9e..65f628a 100644
--- a/nifi-commons/nifi-utils/src/test/java/org/apache/nifi/processor/TestFormatUtils.java
+++ b/nifi-commons/nifi-utils/src/test/java/org/apache/nifi/processor/TestFormatUtils.java
@@ -17,7 +17,7 @@
 package org.apache.nifi.processor;
 
 import org.apache.nifi.util.FormatUtils;
-import org.junit.Test;
+import org.junit.jupiter.api.Test;
 
 import java.text.DecimalFormatSymbols;
 import java.util.concurrent.TimeUnit;
diff --git a/nifi-commons/nifi-utils/src/test/java/org/apache/nifi/remote/io/TestCompressionInputOutputStreams.java b/nifi-commons/nifi-utils/src/test/java/org/apache/nifi/remote/io/TestCompressionInputOutputStreams.java
index bd30a96..c994661 100644
--- a/nifi-commons/nifi-utils/src/test/java/org/apache/nifi/remote/io/TestCompressionInputOutputStreams.java
+++ b/nifi-commons/nifi-utils/src/test/java/org/apache/nifi/remote/io/TestCompressionInputOutputStreams.java
@@ -16,7 +16,7 @@
  */
 package org.apache.nifi.remote.io;
 
-import static org.junit.Assert.assertTrue;
+import org.junit.jupiter.api.Test;
 
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
@@ -24,10 +24,7 @@
 import java.io.InputStream;
 import java.util.Arrays;
 
-import org.apache.nifi.remote.io.CompressionInputStream;
-import org.apache.nifi.remote.io.CompressionOutputStream;
-
-import org.junit.Test;
+import static org.junit.Assert.assertTrue;
 
 public class TestCompressionInputOutputStreams {
 
diff --git a/nifi-commons/nifi-utils/src/test/java/org/apache/nifi/stream/io/ByteCountingInputStreamTest.java b/nifi-commons/nifi-utils/src/test/java/org/apache/nifi/stream/io/ByteCountingInputStreamTest.java
index 1ab5f31..d2fd26c 100644
--- a/nifi-commons/nifi-utils/src/test/java/org/apache/nifi/stream/io/ByteCountingInputStreamTest.java
+++ b/nifi-commons/nifi-utils/src/test/java/org/apache/nifi/stream/io/ByteCountingInputStreamTest.java
@@ -16,12 +16,15 @@
  */
 package org.apache.nifi.stream.io;
 
+import org.junit.jupiter.api.Test;
+
 import java.io.ByteArrayInputStream;
 import java.nio.charset.StandardCharsets;
-import junit.framework.TestCase;
 
-public class ByteCountingInputStreamTest extends TestCase {
+import static org.junit.jupiter.api.Assertions.assertEquals;
 
+public class ByteCountingInputStreamTest {
+    @Test
     public void testReset() throws Exception {
 
         final ByteArrayInputStream reader = new ByteArrayInputStream("abcdefghijklmnopqrstuvwxyz".getBytes(StandardCharsets.UTF_8));
@@ -53,6 +56,7 @@
         assertEquals(bytesAtMark, bcis.getBytesRead());
     }
 
+    @Test
     public void testAvailableShouldReturnCorrectCount() throws Exception {
         // Arrange
         final String ALPHABET = "abcdefghijklmnopqrstuvwxyz";
diff --git a/nifi-commons/nifi-utils/src/test/java/org/apache/nifi/stream/io/LimitingInputStreamTest.java b/nifi-commons/nifi-utils/src/test/java/org/apache/nifi/stream/io/LimitingInputStreamTest.java
index 475a665..9d347bc 100644
--- a/nifi-commons/nifi-utils/src/test/java/org/apache/nifi/stream/io/LimitingInputStreamTest.java
+++ b/nifi-commons/nifi-utils/src/test/java/org/apache/nifi/stream/io/LimitingInputStreamTest.java
@@ -16,15 +16,21 @@
  */
 package org.apache.nifi.stream.io;
 
+import org.junit.jupiter.api.Test;
+
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
-import junit.framework.TestCase;
 
-public class LimitingInputStreamTest extends TestCase {
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+public class LimitingInputStreamTest {
 
     private final static byte[] TEST_BUFFER = new byte[]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
 
+    @Test
     public void testReadLimitNotReached() throws IOException {
         final LimitingInputStream is = new LimitingInputStream(new ByteArrayInputStream(TEST_BUFFER), 50);
         long bytesRead = StreamUtils.copy(is, new ByteArrayOutputStream());
@@ -32,6 +38,7 @@
         assertFalse(is.hasReachedLimit());
     }
 
+    @Test
     public void testReadLimitMatched() throws IOException {
         final LimitingInputStream is = new LimitingInputStream(new ByteArrayInputStream(TEST_BUFFER), 10);
         long bytesRead = StreamUtils.copy(is, new ByteArrayOutputStream());
@@ -39,11 +46,11 @@
         assertTrue(is.hasReachedLimit());
     }
 
+    @Test
     public void testReadLimitExceeded() throws IOException {
         final LimitingInputStream is = new LimitingInputStream(new ByteArrayInputStream(TEST_BUFFER), 9);
         final long bytesRead = StreamUtils.copy(is, new ByteArrayOutputStream());
         assertEquals(bytesRead, 9);
         assertTrue(is.hasReachedLimit());
     }
-
 }
diff --git a/nifi-commons/nifi-utils/src/test/java/org/apache/nifi/stream/io/TestLeakyBucketThrottler.java b/nifi-commons/nifi-utils/src/test/java/org/apache/nifi/stream/io/TestLeakyBucketThrottler.java
index 3f28412..a945814 100644
--- a/nifi-commons/nifi-utils/src/test/java/org/apache/nifi/stream/io/TestLeakyBucketThrottler.java
+++ b/nifi-commons/nifi-utils/src/test/java/org/apache/nifi/stream/io/TestLeakyBucketThrottler.java
@@ -16,8 +16,9 @@
  */
 package org.apache.nifi.stream.io;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
+import org.junit.jupiter.api.Disabled;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.Timeout;
 
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
@@ -26,13 +27,16 @@
 import java.io.OutputStream;
 import java.util.ArrayList;
 import java.util.List;
-import org.junit.Ignore;
-import org.junit.Test;
+import java.util.concurrent.TimeUnit;
 
-@Ignore("Tests are time-based")
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+@Disabled("Tests are time-based")
 public class TestLeakyBucketThrottler {
 
-    @Test(timeout = 10000)
+    @Test
+    @Timeout(value = 10000, unit = TimeUnit.MILLISECONDS)
     public void testOutputStreamInterface() throws IOException {
         // throttle rate at 1 MB/sec
         final LeakyBucketStreamThrottler throttler = new LeakyBucketStreamThrottler(1024 * 1024);
@@ -51,7 +55,8 @@
         }
     }
 
-    @Test(timeout = 10000)
+    @Test
+    @Timeout(value = 10000, unit = TimeUnit.MILLISECONDS)
     public void testInputStreamInterface() throws IOException {
 
         final byte[] data = new byte[1024 * 1024 * 4];
@@ -75,7 +80,8 @@
         }
     }
 
-    @Test(timeout = 10000)
+    @Test
+    @Timeout(value = 10000, unit = TimeUnit.MILLISECONDS)
     public void testDirectInterface() throws IOException, InterruptedException {
         // throttle rate at 1 MB/sec
         try (final LeakyBucketStreamThrottler throttler = new LeakyBucketStreamThrottler(1024 * 1024);
diff --git a/nifi-commons/nifi-utils/src/test/java/org/apache/nifi/stream/io/util/StreamDemarcatorTest.java b/nifi-commons/nifi-utils/src/test/java/org/apache/nifi/stream/io/util/StreamDemarcatorTest.java
index 16af077..9002202 100644
--- a/nifi-commons/nifi-utils/src/test/java/org/apache/nifi/stream/io/util/StreamDemarcatorTest.java
+++ b/nifi-commons/nifi-utils/src/test/java/org/apache/nifi/stream/io/util/StreamDemarcatorTest.java
@@ -16,13 +16,7 @@
  */
 package org.apache.nifi.stream.io.util;
 
-import static org.junit.Assert.assertArrayEquals;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-import static org.mockito.Mockito.mock;
+import org.junit.jupiter.api.Test;
 
 import java.io.ByteArrayInputStream;
 import java.io.IOException;
@@ -30,39 +24,26 @@
 import java.nio.charset.StandardCharsets;
 import java.util.Arrays;
 
-import org.junit.Test;
+import static org.junit.jupiter.api.Assertions.assertArrayEquals;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.mockito.Mockito.mock;
+
 
 @SuppressWarnings("resource")
 public class StreamDemarcatorTest {
     @Test
     public void validateInitializationFailure() {
-        try {
-            new StreamDemarcator(null, null, -1);
-            fail();
-        } catch (IllegalArgumentException e) {
-            // success
-        }
+        assertThrows(IllegalArgumentException.class, () ->new StreamDemarcator(null, null, -1));
 
-        try {
-            new StreamDemarcator(mock(InputStream.class), null, -1);
-            fail();
-        } catch (IllegalArgumentException e) {
-            // success
-        }
+        assertThrows(IllegalArgumentException.class, () -> new StreamDemarcator(mock(InputStream.class), null, -1));
 
-        try {
-            new StreamDemarcator(mock(InputStream.class), null, 10, -1);
-            fail();
-        } catch (IllegalArgumentException e) {
-            // success
-        }
+        assertThrows(IllegalArgumentException.class, () -> new StreamDemarcator(mock(InputStream.class), null, 10, -1));
 
-        try {
-            new StreamDemarcator(mock(InputStream.class), new byte[0], 10, 1);
-            fail();
-        } catch (IllegalArgumentException e) {
-            // success
-        }
+        assertThrows(IllegalArgumentException.class, () -> new StreamDemarcator(mock(InputStream.class), new byte[0], 10, 1));
     }
 
     @Test
@@ -229,13 +210,13 @@
         assertNull(scanner.nextToken());
     }
 
-    @Test(expected = IOException.class)
+    @Test
     public void validateMaxBufferSize() throws IOException {
         String data = "THIS IS MY TEXT<MY DELIMITER>THIS IS MY NEW TEXT THEN<MY DELIMITER>THIS IS MY NEWEST TEXT";
         ByteArrayInputStream is = new ByteArrayInputStream(data.getBytes());
         StreamDemarcator scanner = new StreamDemarcator(is, "<MY DELIMITER>".getBytes(StandardCharsets.UTF_8), 20);
         scanner.nextToken();
-        scanner.nextToken();
+        assertThrows(IOException.class, () -> scanner.nextToken());
     }
 
     @Test
diff --git a/nifi-commons/nifi-utils/src/test/java/org/apache/nifi/stream/io/util/TestLineDemarcator.java b/nifi-commons/nifi-utils/src/test/java/org/apache/nifi/stream/io/util/TestLineDemarcator.java
index 85cf85e..88031d0 100644
--- a/nifi-commons/nifi-utils/src/test/java/org/apache/nifi/stream/io/util/TestLineDemarcator.java
+++ b/nifi-commons/nifi-utils/src/test/java/org/apache/nifi/stream/io/util/TestLineDemarcator.java
@@ -17,8 +17,8 @@
 package org.apache.nifi.stream.io.util;
 
 import org.apache.nifi.stream.io.RepeatingInputStream;
-import org.junit.Ignore;
-import org.junit.Test;
+import org.junit.jupiter.api.Disabled;
+import org.junit.jupiter.api.Test;
 
 import java.io.ByteArrayInputStream;
 import java.io.IOException;
@@ -100,8 +100,9 @@
     }
 
     @Test
-    @Ignore("Intended only for manual testing. While this can take a while to run, it can be very helpful for manual testing before and after a change to the class. However, we don't want this to " +
-        "run in automated tests because we have no way to compare from one run to another, so it will only slow down automated tests.")
+    @Disabled("Intended only for manual testing. While this can take a while to run, it can be very helpful for manual testing before " +
+            "and after a change to the class. However, we don't want this to run in automated tests because we have no way to compare " +
+            "from one run to another, so it will only slow down automated tests.")
     public void testPerformance() throws IOException {
         final String lines = "The\nquick\nbrown\nfox\njumped\nover\nthe\nlazy\ndog.\r\n\n";
         final byte[] bytes = lines.getBytes(StandardCharsets.UTF_8);
diff --git a/nifi-commons/nifi-utils/src/test/java/org/apache/nifi/stream/io/util/TextLineDemarcatorTest.java b/nifi-commons/nifi-utils/src/test/java/org/apache/nifi/stream/io/util/TextLineDemarcatorTest.java
index fefd9eb..cc0dc2f 100644
--- a/nifi-commons/nifi-utils/src/test/java/org/apache/nifi/stream/io/util/TextLineDemarcatorTest.java
+++ b/nifi-commons/nifi-utils/src/test/java/org/apache/nifi/stream/io/util/TextLineDemarcatorTest.java
@@ -16,32 +16,33 @@
  */
 package org.apache.nifi.stream.io.util;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-import static org.mockito.Mockito.mock;
+import org.apache.nifi.stream.io.util.TextLineDemarcator.OffsetInfo;
+import org.junit.jupiter.api.Test;
 
 import java.io.ByteArrayInputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.nio.charset.StandardCharsets;
 
-import org.apache.nifi.stream.io.util.TextLineDemarcator.OffsetInfo;
-import org.junit.Test;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.mockito.Mockito.mock;
 
 @SuppressWarnings("resource")
 public class TextLineDemarcatorTest {
 
-    @Test(expected = IllegalArgumentException.class)
+    @Test
     public void nullStream() {
-        new TextLineDemarcator(null);
+        assertThrows(IllegalArgumentException.class, () -> new TextLineDemarcator(null));
     }
 
-    @Test(expected = IllegalArgumentException.class)
+    @Test
     public void illegalBufferSize() {
-        new TextLineDemarcator(mock(InputStream.class), -234);
+        assertThrows(IllegalArgumentException.class, () -> new TextLineDemarcator(mock(InputStream.class), -234));
     }
 
     @Test
diff --git a/nifi-commons/nifi-utils/src/test/java/org/apache/nifi/util/StringSelectorTest.java b/nifi-commons/nifi-utils/src/test/java/org/apache/nifi/util/StringSelectorTest.java
index 06158f4..3825680 100644
--- a/nifi-commons/nifi-utils/src/test/java/org/apache/nifi/util/StringSelectorTest.java
+++ b/nifi-commons/nifi-utils/src/test/java/org/apache/nifi/util/StringSelectorTest.java
@@ -16,7 +16,7 @@
  */
 package org.apache.nifi.util;
 
-import org.junit.Test;
+import org.junit.jupiter.api.Test;
 
 import static org.junit.Assert.assertEquals;
 
diff --git a/nifi-commons/nifi-utils/src/test/java/org/apache/nifi/util/TestNaiveSearchRingBuffer.java b/nifi-commons/nifi-utils/src/test/java/org/apache/nifi/util/TestNaiveSearchRingBuffer.java
index 0838e96..19672fa 100644
--- a/nifi-commons/nifi-utils/src/test/java/org/apache/nifi/util/TestNaiveSearchRingBuffer.java
+++ b/nifi-commons/nifi-utils/src/test/java/org/apache/nifi/util/TestNaiveSearchRingBuffer.java
@@ -16,10 +16,10 @@
  */
 package org.apache.nifi.util;
 
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
+import org.junit.jupiter.api.Test;
 
-import org.junit.Test;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
 public class TestNaiveSearchRingBuffer {
 
diff --git a/nifi-commons/nifi-utils/src/test/java/org/apache/nifi/util/file/classloader/TestClassLoaderUtils.java b/nifi-commons/nifi-utils/src/test/java/org/apache/nifi/util/file/classloader/TestClassLoaderUtils.java
index fec1d86..5aec543 100644
--- a/nifi-commons/nifi-utils/src/test/java/org/apache/nifi/util/file/classloader/TestClassLoaderUtils.java
+++ b/nifi-commons/nifi-utils/src/test/java/org/apache/nifi/util/file/classloader/TestClassLoaderUtils.java
@@ -16,6 +16,8 @@
  */
 package org.apache.nifi.util.file.classloader;
 
+import org.junit.jupiter.api.Test;
+
 import java.io.FilenameFilter;
 import java.net.MalformedURLException;
 import java.net.URISyntaxException;
@@ -24,12 +26,10 @@
 import java.util.HashSet;
 import java.util.Set;
 
-import org.junit.Test;
-
-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 static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
 public class TestClassLoaderUtils {
 
@@ -46,25 +46,16 @@
         final ClassLoader originalClassLoader = this.getClass().getClassLoader();
         ClassLoader customClassLoader =  ClassLoaderUtils.getCustomClassLoader(null,originalClassLoader, getJarFilenameFilter());
         assertTrue(customClassLoader != null);
-        try{
-            customClassLoader.loadClass("TestSuccess");
-        }catch (ClassNotFoundException cex){
-            assertTrue(cex.getLocalizedMessage().equals("TestSuccess"));
-            return;
-        }
-        fail("exception did not occur, class should not be found");
+        ClassNotFoundException cex = assertThrows(ClassNotFoundException.class, () -> customClassLoader.loadClass("TestSuccess"));
+        assertTrue(cex.getLocalizedMessage().equals("TestSuccess"));
     }
 
     @Test
     public void testGetCustomClassLoaderWithInvalidPath() {
         final String jarFilePath = "src/test/resources/FakeTestClassLoaderUtils/TestSuccess.jar";
-        try {
-            ClassLoaderUtils.getCustomClassLoader(jarFilePath, this.getClass().getClassLoader(), getJarFilenameFilter());
-        }catch(MalformedURLException mex){
-            assertTrue(mex.getLocalizedMessage().equals("Path specified does not exist"));
-            return;
-        }
-        fail("exception did not occur, path should not exist");
+        MalformedURLException mex = assertThrows(MalformedURLException.class,
+                () -> ClassLoaderUtils.getCustomClassLoader(jarFilePath, this.getClass().getClassLoader(), getJarFilenameFilter()));
+        assertTrue(mex.getLocalizedMessage().equals("Path specified does not exist"));
     }
 
     @Test
@@ -99,10 +90,10 @@
         assertEquals(1, urls.length);
     }
 
-    @Test(expected = MalformedURLException.class)
+    @Test
     public void testGetURLsForClasspathWithSomeNonExistentAndNoSuppression() throws MalformedURLException {
         final String jarFilePath = "src/test/resources/TestClassLoaderUtils/TestSuccess.jar,src/test/resources/TestClassLoaderUtils/FakeTest.jar";
-        ClassLoaderUtils.getURLsForClasspath(jarFilePath, null, false);
+        assertThrows(MalformedURLException.class, () -> ClassLoaderUtils.getURLsForClasspath(jarFilePath, null, false));
     }
 
     @Test
diff --git a/nifi-commons/nifi-utils/src/test/java/org/apache/nifi/util/file/monitor/TestCompoundUpdateMonitor.java b/nifi-commons/nifi-utils/src/test/java/org/apache/nifi/util/file/monitor/TestCompoundUpdateMonitor.java
index 2c92ba4..f96af10 100644
--- a/nifi-commons/nifi-utils/src/test/java/org/apache/nifi/util/file/monitor/TestCompoundUpdateMonitor.java
+++ b/nifi-commons/nifi-utils/src/test/java/org/apache/nifi/util/file/monitor/TestCompoundUpdateMonitor.java
@@ -16,9 +16,7 @@
  */
 package org.apache.nifi.util.file.monitor;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotSame;
-import static org.junit.Assert.assertTrue;
+import org.junit.jupiter.api.Test;
 
 import java.io.File;
 import java.io.FileOutputStream;
@@ -27,7 +25,9 @@
 import java.nio.file.Path;
 import java.util.UUID;
 
-import org.junit.Test;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotSame;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
 public class TestCompoundUpdateMonitor {
 
diff --git a/nifi-commons/nifi-utils/src/test/java/org/apache/nifi/util/file/monitor/TestSynchronousFileWatcher.java b/nifi-commons/nifi-utils/src/test/java/org/apache/nifi/util/file/monitor/TestSynchronousFileWatcher.java
index 43abc5b..0dead15 100644
--- a/nifi-commons/nifi-utils/src/test/java/org/apache/nifi/util/file/monitor/TestSynchronousFileWatcher.java
+++ b/nifi-commons/nifi-utils/src/test/java/org/apache/nifi/util/file/monitor/TestSynchronousFileWatcher.java
@@ -16,8 +16,7 @@
  */
 package org.apache.nifi.util.file.monitor;
 
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
+import org.junit.jupiter.api.Test;
 
 import java.io.ByteArrayInputStream;
 import java.io.FileOutputStream;
@@ -28,7 +27,8 @@
 import java.nio.file.Paths;
 import java.nio.file.StandardCopyOption;
 
-import org.junit.Test;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
 public class TestSynchronousFileWatcher {
 
diff --git a/nifi-commons/nifi-utils/src/test/java/org/apache/nifi/util/locale/TestLocaleOfTestSuite.java b/nifi-commons/nifi-utils/src/test/java/org/apache/nifi/util/locale/TestLocaleOfTestSuite.java
index a7e87a2..d2c5862 100644
--- a/nifi-commons/nifi-utils/src/test/java/org/apache/nifi/util/locale/TestLocaleOfTestSuite.java
+++ b/nifi-commons/nifi-utils/src/test/java/org/apache/nifi/util/locale/TestLocaleOfTestSuite.java
@@ -16,15 +16,16 @@
  */
 package org.apache.nifi.util.locale;
 
-import org.junit.Assert;
-import org.junit.Assume;
-import org.junit.Test;
+import org.junit.jupiter.api.Test;
 
 import java.text.DecimalFormatSymbols;
 import java.text.NumberFormat;
 import java.util.Locale;
 import java.util.regex.Pattern;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assumptions.assumeTrue;
+
 /**
  * Testing of the test suite environment {@link java.util.Locale}.  The locales specified
  * in ".github/workflows/ci-workflow.yml" are exercised.  This test is inert when run in alternate locales.
@@ -37,14 +38,14 @@
     @Test
     public void testLocaleCI_EN_AU() {
         final Locale locale = Locale.getDefault();
-        Assume.assumeTrue(locale.toLanguageTag().equals("en-AU"));
+        assumeTrue(locale.toLanguageTag().equals("en-AU"));
 
         final String runtimeJavaVersion = System.getProperty("java.version");
         final boolean isJava8 = Pattern.compile("1\\.8.+").matcher(runtimeJavaVersion).matches();
         final String expected = (isJava8 ? "E" : "e");  // tested in Java 8 and Java 11
 
-        Assert.assertEquals(expected, DecimalFormatSymbols.getInstance(locale).getExponentSeparator());
-        Assert.assertEquals("1,000", NumberFormat.getInstance(locale).format(1000));
+        assertEquals(expected, DecimalFormatSymbols.getInstance(locale).getExponentSeparator());
+        assertEquals("1,000", NumberFormat.getInstance(locale).format(1000));
     }
 
     /**
@@ -53,10 +54,10 @@
     @Test
     public void testLocaleCI_JA_JP() {
         final Locale locale = Locale.getDefault();
-        Assume.assumeTrue(locale.toLanguageTag().equals("ja-JP"));
+        assumeTrue(locale.toLanguageTag().equals("ja-JP"));
 
-        Assert.assertEquals("E", DecimalFormatSymbols.getInstance(locale).getExponentSeparator());
-        Assert.assertEquals("1,000", NumberFormat.getInstance(locale).format(1000));
+        assertEquals("E", DecimalFormatSymbols.getInstance(locale).getExponentSeparator());
+        assertEquals("1,000", NumberFormat.getInstance(locale).format(1000));
     }
 
     /**
@@ -65,9 +66,9 @@
     @Test
     public void testLocaleCI_FR_FR() {
         final Locale locale = Locale.getDefault();
-        Assume.assumeTrue(locale.toLanguageTag().equals("fr-FR"));
+        assumeTrue(locale.toLanguageTag().equals("fr-FR"));
 
-        Assert.assertEquals("E", DecimalFormatSymbols.getInstance(locale).getExponentSeparator());
-        Assert.assertEquals("1\u00a0000", NumberFormat.getInstance(locale).format(1000));
+        assertEquals("E", DecimalFormatSymbols.getInstance(locale).getExponentSeparator());
+        assertEquals("1\u00a0000", NumberFormat.getInstance(locale).format(1000));
     }
 }
diff --git a/nifi-commons/nifi-utils/src/test/java/org/apache/nifi/util/text/TestRegexDateTimeMatcher.java b/nifi-commons/nifi-utils/src/test/java/org/apache/nifi/util/text/TestRegexDateTimeMatcher.java
index 4a5e168..aadc98b 100644
--- a/nifi-commons/nifi-utils/src/test/java/org/apache/nifi/util/text/TestRegexDateTimeMatcher.java
+++ b/nifi-commons/nifi-utils/src/test/java/org/apache/nifi/util/text/TestRegexDateTimeMatcher.java
@@ -16,12 +16,12 @@
  */
 package org.apache.nifi.util.text;
 
-import org.junit.Test;
+import org.junit.jupiter.api.Test;
 
 import java.util.LinkedHashMap;
 import java.util.Map;
 
-import static org.junit.Assert.assertTrue;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
 public class TestRegexDateTimeMatcher {
 
@@ -63,7 +63,7 @@
             final RegexDateTimeMatcher matcher = new RegexDateTimeMatcher.Compiler().compile(entry.getValue());
             final boolean matches = matcher.matches(entry.getKey());
 
-            assertTrue("Pattern <" + entry.getValue() + "> did not match <" + entry.getKey() + ">", matches);
+            assertTrue(matches, "Pattern <" + entry.getValue() + "> did not match <" + entry.getKey() + ">");
         }
     }
 }
diff --git a/nifi-commons/nifi-utils/src/test/java/org/apache/nifi/util/timebuffer/TestRingBuffer.java b/nifi-commons/nifi-utils/src/test/java/org/apache/nifi/util/timebuffer/TestRingBuffer.java
index b01b495..66934f5 100644
--- a/nifi-commons/nifi-utils/src/test/java/org/apache/nifi/util/timebuffer/TestRingBuffer.java
+++ b/nifi-commons/nifi-utils/src/test/java/org/apache/nifi/util/timebuffer/TestRingBuffer.java
@@ -16,17 +16,17 @@
  */
 package org.apache.nifi.util.timebuffer;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
+import org.apache.nifi.util.RingBuffer;
+import org.apache.nifi.util.RingBuffer.ForEachEvaluator;
+import org.apache.nifi.util.RingBuffer.IterationDirection;
+import org.junit.jupiter.api.Test;
 
 import java.util.List;
 import java.util.concurrent.atomic.AtomicInteger;
 
-import org.apache.nifi.util.RingBuffer;
-import org.apache.nifi.util.RingBuffer.ForEachEvaluator;
-import org.apache.nifi.util.RingBuffer.IterationDirection;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
-import org.junit.Test;
 
 /**
  *
diff --git a/nifi-commons/nifi-utils/src/test/java/org/apache/nifi/util/timebuffer/TestTimedBuffer.java b/nifi-commons/nifi-utils/src/test/java/org/apache/nifi/util/timebuffer/TestTimedBuffer.java
index 39ca330..35ae85e 100644
--- a/nifi-commons/nifi-utils/src/test/java/org/apache/nifi/util/timebuffer/TestTimedBuffer.java
+++ b/nifi-commons/nifi-utils/src/test/java/org/apache/nifi/util/timebuffer/TestTimedBuffer.java
@@ -16,12 +16,12 @@
  */
 package org.apache.nifi.util.timebuffer;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNull;
+import org.junit.jupiter.api.Test;
 
 import java.util.concurrent.TimeUnit;
 
-import org.junit.Test;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
 
 public class TestTimedBuffer {
 
diff --git a/nifi-commons/nifi-utils/src/test/java/org/apache/nifi/util/validator/TestStandardValidators.java b/nifi-commons/nifi-utils/src/test/java/org/apache/nifi/util/validator/TestStandardValidators.java
index 69bbe9b..6c75df8 100644
--- a/nifi-commons/nifi-utils/src/test/java/org/apache/nifi/util/validator/TestStandardValidators.java
+++ b/nifi-commons/nifi-utils/src/test/java/org/apache/nifi/util/validator/TestStandardValidators.java
@@ -16,26 +16,26 @@
  */
 package org.apache.nifi.util.validator;
 
-import static org.hamcrest.CoreMatchers.containsString;
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-
-import java.util.concurrent.TimeUnit;
-import java.util.regex.Pattern;
-
 import org.apache.nifi.components.PropertyValue;
 import org.apache.nifi.components.ValidationContext;
 import org.apache.nifi.components.ValidationResult;
 import org.apache.nifi.components.Validator;
 import org.apache.nifi.processor.util.StandardValidators;
-import org.junit.Test;
+import org.junit.jupiter.api.Test;
 import org.mockito.Mockito;
 
+import java.util.concurrent.TimeUnit;
+import java.util.regex.Pattern;
+
+import static org.hamcrest.CoreMatchers.containsString;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
 public class TestStandardValidators {
 
     @Test
diff --git a/nifi-commons/nifi-vault-utils/src/test/java/org/apache/nifi/vault/hashicorp/StandardHashiCorpVaultCommunicationServiceIT.java b/nifi-commons/nifi-vault-utils/src/test/java/org/apache/nifi/vault/hashicorp/StandardHashiCorpVaultCommunicationServiceIT.java
index adca355..6261376 100644
--- a/nifi-commons/nifi-vault-utils/src/test/java/org/apache/nifi/vault/hashicorp/StandardHashiCorpVaultCommunicationServiceIT.java
+++ b/nifi-commons/nifi-vault-utils/src/test/java/org/apache/nifi/vault/hashicorp/StandardHashiCorpVaultCommunicationServiceIT.java
@@ -17,14 +17,14 @@
 package org.apache.nifi.vault.hashicorp;
 
 import org.apache.nifi.vault.hashicorp.config.HashiCorpVaultProperties;
-import org.junit.Before;
-import org.junit.Test;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
 
 import java.nio.charset.StandardCharsets;
 import java.util.HashMap;
 import java.util.Map;
 
-import static org.junit.Assert.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertEquals;
 
 /**
  * The simplest way to run this test is by installing Vault locally, then running:
@@ -46,7 +46,7 @@
 
     private HashiCorpVaultCommunicationService vcs;
 
-    @Before
+    @BeforeEach
     public void init() {
         vcs = new StandardHashiCorpVaultCommunicationService(new HashiCorpVaultProperties.HashiCorpVaultPropertiesBuilder()
                 .setAuthPropertiesFilename(System.getProperty("vault.auth.properties"))
diff --git a/nifi-commons/nifi-vault-utils/src/test/java/org/apache/nifi/vault/hashicorp/TestHashiCorpVaultConfiguration.java b/nifi-commons/nifi-vault-utils/src/test/java/org/apache/nifi/vault/hashicorp/TestHashiCorpVaultConfiguration.java
index e1ec59c..9dd75f9 100644
--- a/nifi-commons/nifi-vault-utils/src/test/java/org/apache/nifi/vault/hashicorp/TestHashiCorpVaultConfiguration.java
+++ b/nifi-commons/nifi-vault-utils/src/test/java/org/apache/nifi/vault/hashicorp/TestHashiCorpVaultConfiguration.java
@@ -19,11 +19,10 @@
 import org.apache.nifi.vault.hashicorp.config.HashiCorpVaultConfiguration;
 import org.apache.nifi.vault.hashicorp.config.HashiCorpVaultProperties;
 import org.apache.nifi.vault.hashicorp.config.HashiCorpVaultPropertySource;
-import org.junit.AfterClass;
-import org.junit.Assert;
-import org.junit.Before;
-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.BeforeEach;
+import org.junit.jupiter.api.Test;
 import org.springframework.vault.authentication.ClientAuthentication;
 import org.springframework.vault.client.VaultEndpoint;
 import org.springframework.vault.support.SslConfiguration;
@@ -39,6 +38,10 @@
 import java.util.Map;
 import java.util.Properties;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+
 public class TestHashiCorpVaultConfiguration {
     public static final String VAULT_AUTHENTICATION = "vault.authentication";
     public static final String VAULT_TOKEN = "vault.token";
@@ -61,21 +64,21 @@
 
     private HashiCorpVaultConfiguration config;
 
-    @BeforeClass
+    @BeforeAll
     public static void initClass() throws IOException {
         keystoreFile = Files.createTempFile("test", ".jks");
         truststoreFile = Files.createTempFile("test", ".jks");
         authProps = writeBasicVaultAuthProperties();
     }
 
-    @AfterClass
+    @AfterAll
     public static void cleanUpClass() throws IOException {
         Files.deleteIfExists(keystoreFile);
         Files.deleteIfExists(truststoreFile);
         Files.deleteIfExists(authProps.toPath());
     }
 
-    @Before
+    @BeforeEach
     public void init() throws IOException {
         propertiesBuilder = new HashiCorpVaultProperties.HashiCorpVaultPropertiesBuilder()
                 .setUri(URI_VALUE)
@@ -118,12 +121,12 @@
         config = new HashiCorpVaultConfiguration(new HashiCorpVaultPropertySource(propertiesBuilder.build()));
 
         VaultEndpoint endpoint = config.vaultEndpoint();
-        Assert.assertEquals("localhost", endpoint.getHost());
-        Assert.assertEquals(8200, endpoint.getPort());
-        Assert.assertEquals(expectedScheme, endpoint.getScheme());
+        assertEquals("localhost", endpoint.getHost());
+        assertEquals(8200, endpoint.getPort());
+        assertEquals(expectedScheme, endpoint.getScheme());
 
         ClientAuthentication clientAuthentication = config.clientAuthentication();
-        Assert.assertNotNull(clientAuthentication);
+        assertNotNull(clientAuthentication);
     }
 
     @Test
@@ -146,20 +149,20 @@
         this.runTest("https");
 
         SslConfiguration sslConfiguration = config.sslConfiguration();
-        Assert.assertEquals(keystoreFile.toFile().getAbsolutePath(), sslConfiguration.getKeyStoreConfiguration().getResource().getFile().getAbsolutePath());
-        Assert.assertEquals(KEYSTORE_PASSWORD_VALUE, new String(sslConfiguration.getKeyStoreConfiguration().getStorePassword()));
-        Assert.assertEquals(KEYSTORE_TYPE_VALUE, sslConfiguration.getKeyStoreConfiguration().getStoreType());
-        Assert.assertEquals(truststoreFile.toFile().getAbsolutePath(), sslConfiguration.getTrustStoreConfiguration().getResource().getFile().getAbsolutePath());
-        Assert.assertEquals(TRUSTSTORE_PASSWORD_VALUE, new String(sslConfiguration.getTrustStoreConfiguration().getStorePassword()));
-        Assert.assertEquals(TRUSTSTORE_TYPE_VALUE, sslConfiguration.getTrustStoreConfiguration().getStoreType());
-        Assert.assertEquals(Arrays.asList(TLS_V_1_3_VALUE), sslConfiguration.getEnabledProtocols());
-        Assert.assertEquals(Arrays.asList(TEST_CIPHER_SUITE_VALUE), sslConfiguration.getEnabledCipherSuites());
+        assertEquals(keystoreFile.toFile().getAbsolutePath(), sslConfiguration.getKeyStoreConfiguration().getResource().getFile().getAbsolutePath());
+        assertEquals(KEYSTORE_PASSWORD_VALUE, new String(sslConfiguration.getKeyStoreConfiguration().getStorePassword()));
+        assertEquals(KEYSTORE_TYPE_VALUE, sslConfiguration.getKeyStoreConfiguration().getStoreType());
+        assertEquals(truststoreFile.toFile().getAbsolutePath(), sslConfiguration.getTrustStoreConfiguration().getResource().getFile().getAbsolutePath());
+        assertEquals(TRUSTSTORE_PASSWORD_VALUE, new String(sslConfiguration.getTrustStoreConfiguration().getStorePassword()));
+        assertEquals(TRUSTSTORE_TYPE_VALUE, sslConfiguration.getTrustStoreConfiguration().getStoreType());
+        assertEquals(Arrays.asList(TLS_V_1_3_VALUE), sslConfiguration.getEnabledProtocols());
+        assertEquals(Arrays.asList(TEST_CIPHER_SUITE_VALUE), sslConfiguration.getEnabledCipherSuites());
     }
 
     @Test
     public void testInvalidTLS() {
         propertiesBuilder.setUri(URI_VALUE.replace("http", "https"));
-        Assert.assertThrows(NullPointerException.class, () -> this.runTest("https"));
+        assertThrows(NullPointerException.class, () -> this.runTest("https"));
     }
 
     @Test
@@ -171,7 +174,7 @@
             authProperties = writeVaultAuthProperties(props);
             propertiesBuilder.setAuthPropertiesFilename(authProperties.getAbsolutePath());
 
-            Assert.assertThrows(IllegalArgumentException.class, () -> this.runTest("http"));
+            assertThrows(IllegalArgumentException.class, () -> this.runTest("http"));
         } finally {
             if (authProperties != null) {
                 Files.deleteIfExists(authProperties.toPath());
@@ -187,7 +190,7 @@
             authProperties = writeVaultAuthProperties(props);
             propertiesBuilder.setAuthPropertiesFilename(authProperties.getAbsolutePath());
 
-            Assert.assertThrows(IllegalArgumentException.class, () -> this.runTest("http"));
+            assertThrows(IllegalArgumentException.class, () -> this.runTest("http"));
         } finally {
             if (authProperties != null) {
                 Files.deleteIfExists(authProperties.toPath());
diff --git a/nifi-commons/nifi-vault-utils/src/test/java/org/apache/nifi/vault/hashicorp/TestStandardHashiCorpVaultCommunicationService.java b/nifi-commons/nifi-vault-utils/src/test/java/org/apache/nifi/vault/hashicorp/TestStandardHashiCorpVaultCommunicationService.java
index 785c5dc..4eb14eb 100644
--- a/nifi-commons/nifi-vault-utils/src/test/java/org/apache/nifi/vault/hashicorp/TestStandardHashiCorpVaultCommunicationService.java
+++ b/nifi-commons/nifi-vault-utils/src/test/java/org/apache/nifi/vault/hashicorp/TestStandardHashiCorpVaultCommunicationService.java
@@ -20,9 +20,9 @@
 import org.apache.nifi.security.util.TlsConfiguration;
 import org.apache.nifi.vault.hashicorp.config.HashiCorpVaultProperties;
 import org.apache.nifi.vault.hashicorp.config.HashiCorpVaultSslProperties;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
 import org.mockito.Mockito;
 
 import java.io.File;
@@ -40,7 +40,7 @@
     private HashiCorpVaultSslProperties sslProperties;
     private File authProps;
 
-    @Before
+    @BeforeEach
     public void init() throws IOException {
         authProps = TestHashiCorpVaultConfiguration.writeBasicVaultAuthProperties();
 
@@ -52,7 +52,7 @@
         Mockito.when(properties.getSsl()).thenReturn(sslProperties);
     }
 
-    @After
+    @AfterEach
     public void cleanUp() throws IOException {
         Files.deleteIfExists(authProps.toPath());
     }
diff --git a/nifi-commons/nifi-web-utils/src/test/groovy/org/apache/nifi/web/util/WebUtilsTest.java b/nifi-commons/nifi-web-utils/src/test/groovy/org/apache/nifi/web/util/WebUtilsTest.java
index 38690a7..2df2632 100644
--- a/nifi-commons/nifi-web-utils/src/test/groovy/org/apache/nifi/web/util/WebUtilsTest.java
+++ b/nifi-commons/nifi-web-utils/src/test/groovy/org/apache/nifi/web/util/WebUtilsTest.java
@@ -23,10 +23,10 @@
 
 import javax.servlet.http.HttpServletRequest;
 
+import static org.junit.Assert.assertEquals;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.Mockito.when;
-import static org.junit.Assert.assertEquals;
 
 @RunWith(MockitoJUnitRunner.class)
 public class WebUtilsTest {
diff --git a/nifi-commons/nifi-write-ahead-log/src/test/java/org/apache/nifi/wali/TestBlockingQueuePool.java b/nifi-commons/nifi-write-ahead-log/src/test/java/org/apache/nifi/wali/TestBlockingQueuePool.java
index 2492283..2fb0181 100644
--- a/nifi-commons/nifi-write-ahead-log/src/test/java/org/apache/nifi/wali/TestBlockingQueuePool.java
+++ b/nifi-commons/nifi-write-ahead-log/src/test/java/org/apache/nifi/wali/TestBlockingQueuePool.java
@@ -17,16 +17,17 @@
 
 package org.apache.nifi.wali;
 
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNotSame;
-import static org.junit.Assert.assertSame;
-import static org.junit.Assert.assertTrue;
+import org.junit.jupiter.api.Test;
 
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.function.Consumer;
 
-import org.junit.Test;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNotSame;
+import static org.junit.jupiter.api.Assertions.assertSame;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
 
 public class TestBlockingQueuePool {
     private static final Consumer<AtomicBoolean> DO_NOTHING = ab -> {};
diff --git a/nifi-commons/nifi-write-ahead-log/src/test/java/org/apache/nifi/wali/TestHashMapSnapshot.java b/nifi-commons/nifi-write-ahead-log/src/test/java/org/apache/nifi/wali/TestHashMapSnapshot.java
index 692500e..7733ca1 100644
--- a/nifi-commons/nifi-write-ahead-log/src/test/java/org/apache/nifi/wali/TestHashMapSnapshot.java
+++ b/nifi-commons/nifi-write-ahead-log/src/test/java/org/apache/nifi/wali/TestHashMapSnapshot.java
@@ -17,9 +17,13 @@
 
 package org.apache.nifi.wali;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.wali.DummyRecord;
+import org.wali.DummyRecordSerde;
+import org.wali.SerDeFactory;
+import org.wali.SingletonSerDeFactory;
+import org.wali.UpdateType;
 
 import java.io.File;
 import java.io.IOException;
@@ -30,14 +34,10 @@
 import java.util.Map;
 import java.util.Set;
 
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-import org.wali.DummyRecord;
-import org.wali.DummyRecordSerde;
-import org.wali.SerDeFactory;
-import org.wali.SingletonSerDeFactory;
-import org.wali.UpdateType;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
 public class TestHashMapSnapshot {
 
@@ -45,7 +45,7 @@
     private DummyRecordSerde serde;
     private SerDeFactory<DummyRecord> serdeFactory;
 
-    @Before
+    @BeforeEach
     public void setup() throws IOException {
         if (!storageDirectory.exists()) {
             Files.createDirectories(storageDirectory.toPath());
@@ -135,12 +135,7 @@
 
         serde.setThrowOOMEAfterNSerializeEdits(3);
 
-        try {
-            snapshot.writeSnapshot(snapshot.prepareSnapshot(150L));
-            Assert.fail("Expected OOME");
-        } catch (final OutOfMemoryError oome) {
-            // expected
-        }
+        assertThrows(OutOfMemoryError.class, () -> snapshot.writeSnapshot(snapshot.prepareSnapshot(150L)));
 
         final SnapshotRecovery<DummyRecord> recovery = snapshot.recover();
         assertEquals(25L, recovery.getMaxTransactionId());
@@ -184,12 +179,7 @@
         serde.setThrowIOEAfterNSerializeEdits(3);
 
         for (int i = 0; i < 5; i++) {
-            try {
-                snapshot.writeSnapshot(snapshot.prepareSnapshot(150L));
-                Assert.fail("Expected IOE");
-            } catch (final IOException ioe) {
-                // expected
-            }
+            assertThrows(IOException.class, () -> snapshot.writeSnapshot(snapshot.prepareSnapshot(150L)));
         }
 
         final SnapshotRecovery<DummyRecord> recovery = snapshot.recover();
diff --git a/nifi-commons/nifi-write-ahead-log/src/test/java/org/apache/nifi/wali/TestLengthDelimitedJournal.java b/nifi-commons/nifi-write-ahead-log/src/test/java/org/apache/nifi/wali/TestLengthDelimitedJournal.java
index c3572f9..3ea1e7d 100644
--- a/nifi-commons/nifi-write-ahead-log/src/test/java/org/apache/nifi/wali/TestLengthDelimitedJournal.java
+++ b/nifi-commons/nifi-write-ahead-log/src/test/java/org/apache/nifi/wali/TestLengthDelimitedJournal.java
@@ -17,9 +17,8 @@
 
 package org.apache.nifi.wali;
 
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
 import org.wali.DummyRecord;
 import org.wali.DummyRecordSerde;
 import org.wali.SerDeFactory;
@@ -48,11 +47,12 @@
 import java.util.function.Supplier;
 import java.util.stream.Collectors;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
 public class TestLengthDelimitedJournal {
     private final File journalFile = new File("target/testLengthDelimitedJournal/testJournal.journal");
@@ -61,7 +61,7 @@
     private ObjectPool<ByteArrayDataOutputStream> streamPool;
     private static final int BUFFER_SIZE = 4096;
 
-    @Before
+    @BeforeEach
     public void setupJournal() throws IOException {
         Files.deleteIfExists(journalFile.toPath());
 
@@ -217,28 +217,14 @@
 
             final DummyRecord thirdRecord = new DummyRecord("1", UpdateType.UPDATE);
             final RecordLookup<DummyRecord> lookup = key -> secondRecord;
-            try {
-                journal.update(Collections.singleton(thirdRecord), lookup);
-                Assert.fail("Expected IOException");
-            } catch (final IOException ioe) {
-                // expected
-            }
+            assertThrows(IOException.class, () -> journal.update(Collections.singleton(thirdRecord), lookup));
 
             serde.setThrowIOEAfterNSerializeEdits(-1);
 
             final Collection<DummyRecord> records = Collections.singleton(thirdRecord);
             for (int i = 0; i < 10; i++) {
-                try {
-                    journal.update(records, lookup);
-                    Assert.fail("Expected IOException");
-                } catch (final IOException expected) {
-                }
-
-                try {
-                    journal.fsync();
-                    Assert.fail("Expected IOException");
-                } catch (final IOException expected) {
-                }
+                assertThrows(IOException.class, () -> journal.update(records, lookup));
+                assertThrows(IOException.class, () -> journal.fsync());
             }
         }
     }
@@ -258,28 +244,14 @@
 
             final DummyRecord thirdRecord = new DummyRecord("1", UpdateType.UPDATE);
             final RecordLookup<DummyRecord> lookup = key -> secondRecord;
-            try {
-                journal.update(Collections.singleton(thirdRecord), lookup);
-                Assert.fail("Expected OOME");
-            } catch (final OutOfMemoryError oome) {
-                // expected
-            }
+            assertThrows(OutOfMemoryError.class, () ->journal.update(Collections.singleton(thirdRecord), lookup));
 
             serde.setThrowOOMEAfterNSerializeEdits(-1);
 
             final Collection<DummyRecord> records = Collections.singleton(thirdRecord);
             for (int i = 0; i < 10; i++) {
-                try {
-                    journal.update(records, lookup);
-                    Assert.fail("Expected IOException");
-                } catch (final IOException expected) {
-                }
-
-                try {
-                    journal.fsync();
-                    Assert.fail("Expected IOException");
-                } catch (final IOException expected) {
-                }
+                assertThrows(IOException.class, () -> journal.update(records, lookup));
+                assertThrows(IOException.class, () -> journal.fsync());
             }
         }
     }
diff --git a/nifi-commons/nifi-write-ahead-log/src/test/java/org/apache/nifi/wali/TestSequentialAccessWriteAheadLog.java b/nifi-commons/nifi-write-ahead-log/src/test/java/org/apache/nifi/wali/TestSequentialAccessWriteAheadLog.java
index 6d24445..6eee5ee 100644
--- a/nifi-commons/nifi-write-ahead-log/src/test/java/org/apache/nifi/wali/TestSequentialAccessWriteAheadLog.java
+++ b/nifi-commons/nifi-write-ahead-log/src/test/java/org/apache/nifi/wali/TestSequentialAccessWriteAheadLog.java
@@ -17,11 +17,9 @@
 
 package org.apache.nifi.wali;
 
-import org.junit.Assert;
-import org.junit.Ignore;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.rules.TestName;
+import org.junit.jupiter.api.Disabled;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.TestInfo;
 import org.wali.DummyRecord;
 import org.wali.DummyRecordSerde;
 import org.wali.SerDeFactory;
@@ -45,20 +43,17 @@
 import java.util.function.Function;
 import java.util.stream.Collectors;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
 public class TestSequentialAccessWriteAheadLog {
-    @Rule
-    public TestName testName = new TestName();
-
-
     @Test
-    public void testUpdateWithExternalFile() throws IOException {
+    public void testUpdateWithExternalFile(TestInfo testInfo) throws IOException {
         final DummyRecordSerde serde = new DummyRecordSerde();
-        final SequentialAccessWriteAheadLog<DummyRecord> repo = createWriteRepo(serde);
+        final SequentialAccessWriteAheadLog<DummyRecord> repo = createWriteRepo(testInfo, serde);
 
         final List<DummyRecord> records = new ArrayList<>();
         for (int i = 0; i < 350_000; i++) {
@@ -71,7 +66,7 @@
 
         assertEquals(1, serde.getExternalFileReferences().size());
 
-        final SequentialAccessWriteAheadLog<DummyRecord> recoveryRepo = createRecoveryRepo();
+        final SequentialAccessWriteAheadLog<DummyRecord> recoveryRepo = createRecoveryRepo(testInfo);
         final Collection<DummyRecord> recovered = recoveryRepo.recoverRecords();
 
         // ensure that we get the same records back, but the order may be different, so wrap both collections
@@ -80,9 +75,9 @@
     }
 
     @Test
-    public void testUpdateWithExternalFileFollowedByInlineUpdate() throws IOException {
+    public void testUpdateWithExternalFileFollowedByInlineUpdate(TestInfo testInfo) throws IOException {
         final DummyRecordSerde serde = new DummyRecordSerde();
-        final SequentialAccessWriteAheadLog<DummyRecord> repo = createWriteRepo(serde);
+        final SequentialAccessWriteAheadLog<DummyRecord> repo = createWriteRepo(testInfo, serde);
 
         final List<DummyRecord> records = new ArrayList<>();
         for (int i = 0; i < 350_000; i++) {
@@ -98,7 +93,7 @@
 
         assertEquals(1, serde.getExternalFileReferences().size());
 
-        final SequentialAccessWriteAheadLog<DummyRecord> recoveryRepo = createRecoveryRepo();
+        final SequentialAccessWriteAheadLog<DummyRecord> recoveryRepo = createRecoveryRepo(testInfo);
         final Collection<DummyRecord> recovered = recoveryRepo.recoverRecords();
 
         // ensure that we get the same records back, but the order may be different, so wrap both collections
@@ -109,8 +104,8 @@
     }
 
     @Test
-    public void testRecoverWithNoCheckpoint() throws IOException {
-        final SequentialAccessWriteAheadLog<DummyRecord> repo = createWriteRepo();
+    public void testRecoverWithNoCheckpoint(TestInfo testInfo) throws IOException {
+        final SequentialAccessWriteAheadLog<DummyRecord> repo = createWriteRepo(testInfo);
 
         final List<DummyRecord> records = new ArrayList<>();
         for (int i = 0; i < 10; i++) {
@@ -121,7 +116,7 @@
         repo.update(records, false);
         repo.shutdown();
 
-        final SequentialAccessWriteAheadLog<DummyRecord> recoveryRepo = createRecoveryRepo();
+        final SequentialAccessWriteAheadLog<DummyRecord> recoveryRepo = createRecoveryRepo(testInfo);
         final Collection<DummyRecord> recovered = recoveryRepo.recoverRecords();
 
         // ensure that we get the same records back, but the order may be different, so wrap both collections
@@ -130,8 +125,8 @@
     }
 
     @Test
-    public void testRecoverWithNoJournalUpdates() throws IOException {
-        final SequentialAccessWriteAheadLog<DummyRecord> repo = createWriteRepo();
+    public void testRecoverWithNoJournalUpdates(TestInfo testInfo) throws IOException {
+        final SequentialAccessWriteAheadLog<DummyRecord> repo = createWriteRepo(testInfo);
 
         final List<DummyRecord> records = new ArrayList<>();
         for (int i = 0; i < 10; i++) {
@@ -143,7 +138,7 @@
         repo.checkpoint();
         repo.shutdown();
 
-        final SequentialAccessWriteAheadLog<DummyRecord> recoveryRepo = createRecoveryRepo();
+        final SequentialAccessWriteAheadLog<DummyRecord> recoveryRepo = createRecoveryRepo(testInfo);
         final Collection<DummyRecord> recovered = recoveryRepo.recoverRecords();
 
         // ensure that we get the same records back, but the order may be different, so wrap both collections
@@ -152,8 +147,8 @@
     }
 
     @Test
-    public void testRecoverWithMultipleCheckpointsBetweenJournalUpdate() throws IOException {
-        final SequentialAccessWriteAheadLog<DummyRecord> repo = createWriteRepo();
+    public void testRecoverWithMultipleCheckpointsBetweenJournalUpdate(TestInfo testInfo) throws IOException {
+        final SequentialAccessWriteAheadLog<DummyRecord> repo = createWriteRepo(testInfo);
 
         final List<DummyRecord> records = new ArrayList<>();
         for (int i = 0; i < 10; i++) {
@@ -173,7 +168,7 @@
 
         repo.shutdown();
 
-        final SequentialAccessWriteAheadLog<DummyRecord> recoveryRepo = createRecoveryRepo();
+        final SequentialAccessWriteAheadLog<DummyRecord> recoveryRepo = createRecoveryRepo(testInfo);
         final Collection<DummyRecord> recovered = recoveryRepo.recoverRecords();
 
         // what we expect is the same as what we updated with, except we don't want the DummyRecord for CREATE 4
@@ -187,9 +182,9 @@
         assertEquals(expected, new HashSet<>(recovered));
     }
 
-    private SequentialAccessWriteAheadLog<DummyRecord> createRecoveryRepo() throws IOException {
+    private SequentialAccessWriteAheadLog<DummyRecord> createRecoveryRepo(TestInfo testInfo) throws IOException {
         final File targetDir = new File("target");
-        final File storageDir = new File(targetDir, testName.getMethodName());
+        final File storageDir = new File(targetDir, testInfo.getTestMethod().get().getName());
 
         final DummyRecordSerde serde = new DummyRecordSerde();
         final SerDeFactory<DummyRecord> serdeFactory = new SingletonSerDeFactory<>(serde);
@@ -198,13 +193,13 @@
         return repo;
     }
 
-    private SequentialAccessWriteAheadLog<DummyRecord> createWriteRepo() throws IOException {
-        return createWriteRepo(new DummyRecordSerde());
+    private SequentialAccessWriteAheadLog<DummyRecord> createWriteRepo(TestInfo testInfo) throws IOException {
+        return createWriteRepo(testInfo, new DummyRecordSerde());
     }
 
-    private SequentialAccessWriteAheadLog<DummyRecord> createWriteRepo(final DummyRecordSerde serde) throws IOException {
+    private SequentialAccessWriteAheadLog<DummyRecord> createWriteRepo(final TestInfo testInfo, final DummyRecordSerde serde) throws IOException {
         final File targetDir = new File("target");
-        final File storageDir = new File(targetDir, testName.getMethodName());
+        final File storageDir = new File(targetDir, testInfo.getTestMethod().get().getName());
         deleteRecursively(storageDir);
         assertTrue(storageDir.mkdirs());
 
@@ -224,8 +219,8 @@
      * are able to checkpoint, then update journals, and then recover updates to both the checkpoint and the journals.
      */
     @Test
-    public void testUpdateThenRecover() throws IOException {
-        final SequentialAccessWriteAheadLog<DummyRecord> repo = createWriteRepo();
+    public void testUpdateThenRecover(TestInfo testInfo) throws IOException {
+        final SequentialAccessWriteAheadLog<DummyRecord> repo = createWriteRepo(testInfo);
 
         final DummyRecord firstCreate = new DummyRecord("0", UpdateType.CREATE);
         repo.update(Collections.singleton(firstCreate), false);
@@ -276,7 +271,7 @@
 
         repo.shutdown();
 
-        final SequentialAccessWriteAheadLog<DummyRecord> recoveryRepo = createRecoveryRepo();
+        final SequentialAccessWriteAheadLog<DummyRecord> recoveryRepo = createRecoveryRepo(testInfo);
         final Collection<DummyRecord> recoveredRecords = recoveryRepo.recoverRecords();
 
         // We should now have records:
@@ -309,7 +304,7 @@
 
 
     @Test
-    @Ignore("For manual performance testing")
+    @Disabled("For manual performance testing")
     public void testUpdatePerformance() throws IOException, InterruptedException {
         final Path path = Paths.get("target/sequential-access-repo");
         deleteRecursively(path.toFile());
@@ -343,12 +338,7 @@
                                 batch.add(record);
                             }
 
-                            try {
-                                repo.update(batch, false);
-                            } catch (Throwable t) {
-                                t.printStackTrace();
-                                Assert.fail(t.toString());
-                            }
+                            assertThrows(Throwable.class, () -> repo.update(batch, false));
                         }
                     }
                 });
diff --git a/nifi-commons/nifi-write-ahead-log/src/test/java/org/wali/TestMinimalLockingWriteAheadLog.java b/nifi-commons/nifi-write-ahead-log/src/test/java/org/wali/TestMinimalLockingWriteAheadLog.java
index 5f1c589..7954553 100644
--- a/nifi-commons/nifi-write-ahead-log/src/test/java/org/wali/TestMinimalLockingWriteAheadLog.java
+++ b/nifi-commons/nifi-write-ahead-log/src/test/java/org/wali/TestMinimalLockingWriteAheadLog.java
@@ -16,9 +16,10 @@
  */
 package org.wali;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
+import org.junit.jupiter.api.Disabled;
+import org.junit.jupiter.api.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import java.io.BufferedInputStream;
 import java.io.DataInputStream;
@@ -48,11 +49,12 @@
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.atomic.AtomicReference;
-import org.junit.Assert;
-import org.junit.Ignore;
-import org.junit.Test;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+
+import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
 @SuppressWarnings("deprecation")
 public class TestMinimalLockingWriteAheadLog {
@@ -140,7 +142,7 @@
     }
 
     @Test
-    @Ignore("For manual performance testing")
+    @Disabled("For manual performance testing")
     public void testUpdatePerformance() throws IOException, InterruptedException {
         final int numPartitions = 16;
 
@@ -164,25 +166,17 @@
 
         for (int j = 0; j < 2; j++) {
             for (int i = 0; i < numThreads; i++) {
-                final Thread t = new Thread(new Runnable() {
-                    @Override
-                    public void run() {
-                        final List<DummyRecord> batch = new ArrayList<>();
+                final Thread t = new Thread(() -> {
+                    final List<DummyRecord> batch = new ArrayList<>();
 
-                        for (int i = 0; i < updateCountPerThread / batchSize; i++) {
-                            batch.clear();
-                            for (int j = 0; j < batchSize; j++) {
-                                final DummyRecord record = new DummyRecord(String.valueOf(i), UpdateType.CREATE);
-                                batch.add(record);
-                            }
-
-                            try {
-                                repo.update(batch, false);
-                            } catch (Throwable t) {
-                                t.printStackTrace();
-                                Assert.fail(t.toString());
-                            }
+                    for (int i1 = 0; i1 < updateCountPerThread / batchSize; i1++) {
+                        batch.clear();
+                        for (int j1 = 0; j1 < batchSize; j1++) {
+                            final DummyRecord record = new DummyRecord(String.valueOf(i1), UpdateType.CREATE);
+                            batch.add(record);
                         }
+
+                        assertDoesNotThrow(() -> repo.update(batch, false));
                     }
                 });
 
@@ -253,34 +247,20 @@
 
             long expectedSize = sizeOf(path.toFile());
             for (int i = 0; i < 1000; i++) {
-                try {
-                    final DummyRecord record = new DummyRecord(String.valueOf(i), UpdateType.CREATE);
-                    repo.update(Collections.singleton(record), false);
-                    Assert.fail("Expected IOE but it didn't happen");
-                } catch (final IOException ioe) {
-                    // will get IOException because all Partitions have been blacklisted
-                }
+                final DummyRecord record = new DummyRecord(String.valueOf(i), UpdateType.CREATE);
+                assertThrows(IOException.class, () -> repo.update(Collections.singleton(record), false));
             }
 
             long newSize = sizeOf(path.toFile());
             assertEquals(expectedSize, newSize);
 
-            try {
-                repo.checkpoint();
-                Assert.fail("Expected OOME but it didn't happen");
-            } catch (final OutOfMemoryError oome) {
-            }
+            assertThrows(OutOfMemoryError.class, () -> repo.checkpoint());
 
             expectedSize = sizeOf(path.toFile());
 
             for (int i = 0; i < 100000; i++) {
-                try {
-                    final DummyRecord record = new DummyRecord(String.valueOf(i), UpdateType.CREATE);
-                    repo.update(Collections.singleton(record), false);
-                    Assert.fail("Expected IOE but it didn't happen");
-                } catch (final IOException ioe) {
-                    // will get IOException because all Partitions have been blacklisted
-                }
+                final DummyRecord record = new DummyRecord(String.valueOf(i), UpdateType.CREATE);
+                assertThrows(IOException.class, () -> repo.update(Collections.singleton(record), false));
             }
 
             newSize = sizeOf(path.toFile());
@@ -300,7 +280,7 @@
      * @throws InterruptedException if a thread is interrupted
      */
     @Test
-    @Ignore
+    @Disabled
     public void tryToCauseThreadingIssue() throws IOException, InterruptedException {
         System.setProperty("org.slf4j.simpleLogger.log.org.wali", "INFO");
 
@@ -314,28 +294,20 @@
         final AtomicReference<WriteAheadRepository<DummyRecord>> writeRepoRef = new AtomicReference<>();
         final AtomicBoolean checkpointing = new AtomicBoolean(false);
 
-        final Thread bgThread = new Thread(new Runnable() {
-            @Override
-            public void run() {
-                while (true) {
-                    checkpointing.set(true);
+        final Thread bgThread = new Thread(() -> {
+            while (true) {
+                checkpointing.set(true);
 
-                    final WriteAheadRepository<DummyRecord> repo = writeRepoRef.get();
-                    if (repo != null) {
-                        try {
-                            repo.checkpoint();
-                        } catch (IOException e) {
-                            e.printStackTrace();
-                            Assert.fail();
-                        }
-                    }
+                final WriteAheadRepository<DummyRecord> repo = writeRepoRef.get();
+                if (repo != null) {
+                    assertDoesNotThrow(() -> repo.checkpoint());
+                }
 
-                    checkpointing.set(false);
+                checkpointing.set(false);
 
-                    try {
-                        TimeUnit.SECONDS.sleep(5);
-                    } catch (InterruptedException e) {
-                    }
+                try {
+                    TimeUnit.SECONDS.sleep(5);
+                } catch (InterruptedException e) {
                 }
             }
         });
@@ -453,12 +425,7 @@
 
         repo.update(firstTransaction, true);
         repo.update(secondTransaction, true);
-        try {
-            repo.update(thirdTransaction, true);
-            Assert.fail("Did not throw IOException on third transaction");
-        } catch (final IOException e) {
-            // expected behavior.
-        }
+        assertThrows(IOException.class, () -> repo.update(thirdTransaction, true));
 
         repo.shutdown();
 
@@ -667,33 +634,18 @@
 
         repo.update(firstTransaction, true);
 
-        try {
-            repo.update(secondTransaction, true);
-            Assert.fail("Did not throw IOException on second transaction");
-        } catch (final IOException e) {
-            // expected behavior.
-        }
+        assertThrows(IOException.class, () -> repo.update(secondTransaction, true));
 
         for (int i = 0; i < 4; i++) {
-            try {
-                repo.update(thirdTransaction, true);
-                Assert.fail("Did not throw IOException on third transaction");
-            } catch (final IOException e) {
-                // expected behavior.
-            }
+            assertThrows(IOException.class, () -> repo.update(thirdTransaction, true));
         }
 
         serde.setThrowIOEAfterNSerializeEdits(-1);
         final List<DummyRecord> fourthTransaction = new ArrayList<>();
         fourthTransaction.add(new DummyRecord("1", UpdateType.DELETE));
 
-        try {
-            repo.update(fourthTransaction, true);
-            Assert.fail("Successfully updated repo for 4th transaction");
-        } catch (final IOException e) {
-            // expected behavior
-            assertTrue(e.getMessage().contains("All Partitions have been blacklisted"));
-        }
+        IOException e = assertThrows(IOException.class, () -> repo.update(fourthTransaction, true));
+        assertTrue(e.getMessage().contains("All Partitions have been blacklisted"));
 
         repo.shutdown();
         serde.setThrowIOEAfterNSerializeEdits(-1);
@@ -817,14 +769,10 @@
 
         writeRepo.update(Collections.singleton(new SimpleRecord(1L, 1L)), false);
         writeRepo.update(Collections.singleton(new SimpleRecord(2L, 2L)), false);
-        try {
-            // Use a size of 8194 because the BufferedOutputStream has a buffer size of 8192 and we want
-            // to exceed this for testing purposes.
-            writeRepo.update(Collections.singleton(new SimpleRecord(3L, 8194L)), false);
-            Assert.fail("Expected IOException but did not get it");
-        } catch (final IOException ioe) {
-            // expected behavior
-        }
+        // Use a size of 8194 because the BufferedOutputStream has a buffer size of 8192 and we want
+        // to exceed this for testing purposes.
+        assertThrows(IOException.class,
+                () -> writeRepo.update(Collections.singleton(new SimpleRecord(3L, 8194L)), false));
 
         final Path partitionDir = path.resolve("partition-0");
         final File journalFile = partitionDir.toFile().listFiles()[0];
@@ -835,7 +783,7 @@
 
         // Ensure that calling shutdown() didn't write anything to the journal file
         final long newJournalSize = journalFile.length();
-        assertEquals("Calling Shutdown wrote " + (newJournalSize - journalFileSize) + " bytes to the journal file", newJournalSize, journalFile.length());
+        assertEquals(newJournalSize, journalFile.length(), "Calling Shutdown wrote " + (newJournalSize - journalFileSize) + " bytes to the journal file");
     }
 
     private void verifyBlacklistedJournalContents(final File journalFile, final SerDe<?> serde) throws IOException {
@@ -940,15 +888,10 @@
 
         @Override
         public void run() {
-            try {
-                int counter = 0;
-                for (final List<DummyRecord> list : records) {
-                    final boolean forceSync = (++counter == records.size());
-                    repo.update(list, forceSync);
-                }
-            } catch (IOException e) {
-                Assert.fail("Failed to update: " + e.toString());
-                e.printStackTrace();
+            int counter = 0;
+            for (final List<DummyRecord> list : records) {
+                final boolean forceSync = (++counter == records.size());
+                assertDoesNotThrow(() -> repo.update(list, forceSync));
             }
         }
     }
diff --git a/pom.xml b/pom.xml
index 2fc31dd..2d4a4d3 100644
--- a/pom.xml
+++ b/pom.xml
@@ -111,7 +111,7 @@
         <aspectj.version>1.9.6</aspectj.version>
         <jersey.version>2.33</jersey.version>
         <logback.version>1.2.6</logback.version>
-        <mockito.version>2.28.2</mockito.version>
+        <mockito.version>3.11.2</mockito.version>
     </properties>
 
     <repositories>