diff --git a/nifi-mock/pom.xml b/nifi-mock/pom.xml
index 8688dff..08ea3e2 100644
--- a/nifi-mock/pom.xml
+++ b/nifi-mock/pom.xml
@@ -66,8 +66,8 @@
         <dependency>
             <!-- Dependency marked as compile, not test, because we have assertion
             methods in our MockSession & MockFlowFile -->
-            <groupId>junit</groupId>
-            <artifactId>junit</artifactId>
+            <groupId>org.junit.jupiter</groupId>
+            <artifactId>junit-jupiter-api</artifactId>
             <scope>compile</scope>
         </dependency>
     </dependencies>
diff --git a/nifi-mock/src/main/java/org/apache/nifi/state/MockStateManager.java b/nifi-mock/src/main/java/org/apache/nifi/state/MockStateManager.java
index 1cc8a39..ad86864 100644
--- a/nifi-mock/src/main/java/org/apache/nifi/state/MockStateManager.java
+++ b/nifi-mock/src/main/java/org/apache/nifi/state/MockStateManager.java
@@ -21,7 +21,7 @@
 import org.apache.nifi.components.state.Scope;
 import org.apache.nifi.components.state.StateManager;
 import org.apache.nifi.components.state.StateMap;
-import org.junit.Assert;
+import org.junit.jupiter.api.Assertions;
 
 import java.io.IOException;
 import java.util.Collections;
@@ -170,7 +170,7 @@
 
         // ensure that the @Stateful annotation is present with the appropriate Scope
         if ((scope == Scope.LOCAL && !usesLocalState) || (scope == Scope.CLUSTER && !usesClusterState)) {
-            Assert.fail("Component is attempting to set or retrieve state with a scope of " + scope + " but does not declare that it will use "
+            Assertions.fail("Component is attempting to set or retrieve state with a scope of " + scope + " but does not declare that it will use "
                 + scope + " state. A @Stateful annotation should be added to the component with a scope of " + scope);
         }
     }
@@ -197,7 +197,7 @@
      * @param scope the scope
      */
     public void assertStateEquals(final String key, final String value, final Scope scope) {
-        Assert.assertEquals(value, getValue(key, scope));
+        Assertions.assertEquals(value, getValue(key, scope));
     }
 
     /**
@@ -208,7 +208,7 @@
      */
     public void assertStateEquals(final Map<String, String> stateValues, final Scope scope) {
         final StateMap stateMap = retrieveState(scope);
-        Assert.assertEquals(stateValues, stateMap.toMap());
+        Assertions.assertEquals(stateValues, stateMap.toMap());
     }
 
     /**
@@ -219,7 +219,7 @@
      */
     public void assertStateNotEquals(final Map<String, String> stateValues, final Scope scope) {
         final StateMap stateMap = retrieveState(scope);
-        Assert.assertNotSame(stateValues, stateMap.toMap());
+        Assertions.assertNotSame(stateValues, stateMap.toMap());
     }
 
     /**
@@ -230,7 +230,7 @@
      * @param scope the scope
      */
     public void assertStateNotEquals(final String key, final String value, final Scope scope) {
-        Assert.assertNotEquals(value, getValue(key, scope));
+        Assertions.assertNotEquals(value, getValue(key, scope));
     }
 
     /**
@@ -240,7 +240,7 @@
      * @param scope the scope
      */
     public void assertStateSet(final String key, final Scope scope) {
-        Assert.assertNotNull("Expected state to be set for key " + key + " and scope " + scope + ", but it was not set", getValue(key, scope));
+        Assertions.assertNotNull(getValue(key, scope), "Expected state to be set for key " + key + " and scope " + scope + ", but it was not set");
     }
 
     /**
@@ -250,7 +250,7 @@
      * @param scope the scope
      */
     public void assertStateNotSet(final String key, final Scope scope) {
-        Assert.assertNull("Expected state not to be set for key " + key + " and scope " + scope + ", but it was set", getValue(key, scope));
+        Assertions.assertNull(getValue(key, scope), "Expected state not to be set for key " + key + " and scope " + scope + ", but it was set");
     }
 
     /**
@@ -260,7 +260,7 @@
      */
     public void assertStateSet(final Scope scope) {
         final StateMap stateMap = (scope == Scope.CLUSTER) ? clusterStateMap : localStateMap;
-        Assert.assertNotSame("Expected state to be set for Scope " + scope + ", but it was not set", -1L, stateMap.getVersion());
+        Assertions.assertNotSame(-1L, stateMap.getVersion(), "Expected state to be set for Scope " + scope + ", but it was not set");
     }
 
     /**
@@ -278,7 +278,7 @@
      */
     public void assertStateNotSet(final Scope scope) {
         final StateMap stateMap = (scope == Scope.CLUSTER) ? clusterStateMap : localStateMap;
-        Assert.assertEquals("Expected state not to be set for Scope " + scope + ", but it was set", -1L, stateMap.getVersion());
+        Assertions.assertEquals(-1L, stateMap.getVersion(), "Expected state not to be set for Scope " + scope + ", but it was set");
     }
 
     /**
diff --git a/nifi-mock/src/main/java/org/apache/nifi/util/MockFlowFile.java b/nifi-mock/src/main/java/org/apache/nifi/util/MockFlowFile.java
index 254320e..7ee30a7 100644
--- a/nifi-mock/src/main/java/org/apache/nifi/util/MockFlowFile.java
+++ b/nifi-mock/src/main/java/org/apache/nifi/util/MockFlowFile.java
@@ -38,7 +38,7 @@
 import org.apache.nifi.controller.repository.claim.ContentClaim;
 import org.apache.nifi.flowfile.FlowFile;
 import org.apache.nifi.flowfile.attributes.CoreAttributes;
-import org.junit.Assert;
+import org.junit.jupiter.api.Assertions;
 
 public class MockFlowFile implements FlowFileRecord {
 
@@ -217,21 +217,21 @@
     }
 
     public void assertAttributeExists(final String attributeName) {
-        Assert.assertTrue("Attribute " + attributeName + " does not exist", attributes.containsKey(attributeName));
+        Assertions.assertTrue(attributes.containsKey(attributeName), "Attribute " + attributeName + " does not exist");
     }
 
     public void assertAttributeNotExists(final String attributeName) {
-        Assert.assertFalse("Attribute " + attributeName + " should not exist on FlowFile, but exists with value "
-                + attributes.get(attributeName), attributes.containsKey(attributeName));
+        Assertions.assertFalse(attributes.containsKey(attributeName), "Attribute " + attributeName + " should not exist on FlowFile, but exists with value "
+                + attributes.get(attributeName));
     }
 
     public void assertAttributeEquals(final String attributeName, final String expectedValue) {
-        Assert.assertEquals("Expected attribute " + attributeName + " to be " + expectedValue + " but instead it was " + attributes.get(attributeName),
-            expectedValue, attributes.get(attributeName));
+        Assertions.assertEquals(expectedValue, attributes.get(attributeName), "Expected attribute " + attributeName + " to be " +
+                expectedValue + " but instead it was " + attributes.get(attributeName));
     }
 
     public void assertAttributeNotEquals(final String attributeName, final String expectedValue) {
-        Assert.assertNotSame(expectedValue, attributes.get(attributeName));
+        Assertions.assertNotSame(expectedValue, attributes.get(attributeName));
     }
 
     /**
@@ -281,7 +281,7 @@
 
     public void assertContentEquals(final String data, final Charset charset) {
         final String value = new String(this.data, charset);
-        Assert.assertEquals(data, value);
+        Assertions.assertEquals(data, value);
     }
 
     /**
@@ -298,11 +298,11 @@
             for (int i = 0; i < data.length; i++) {
                 final int fromStream = buffered.read();
                 if (fromStream < 0) {
-                    Assert.fail("FlowFile content is " + data.length + " bytes but provided input is only " + bytesRead + " bytes");
+                    Assertions.fail("FlowFile content is " + data.length + " bytes but provided input is only " + bytesRead + " bytes");
                 }
 
                 if ((fromStream & 0xFF) != (data[i] & 0xFF)) {
-                    Assert.fail("FlowFile content differs from input at byte " + bytesRead + " with input having value "
+                    Assertions.fail("FlowFile content differs from input at byte " + bytesRead + " with input having value "
                             + (fromStream & 0xFF) + " and FlowFile having value " + (data[i] & 0xFF));
                 }
 
@@ -311,7 +311,7 @@
 
             final int nextByte = buffered.read();
             if (nextByte >= 0) {
-                Assert.fail("Contents of input and FlowFile were the same through byte " + data.length + "; however, FlowFile's content ended at this point, and input has more data");
+                Assertions.fail("Contents of input and FlowFile were the same through byte " + data.length + "; however, FlowFile's content ended at this point, and input has more data");
             }
         }
     }
diff --git a/nifi-mock/src/main/java/org/apache/nifi/util/MockProcessContext.java b/nifi-mock/src/main/java/org/apache/nifi/util/MockProcessContext.java
index e2199f4..5c8a8e8 100644
--- a/nifi-mock/src/main/java/org/apache/nifi/util/MockProcessContext.java
+++ b/nifi-mock/src/main/java/org/apache/nifi/util/MockProcessContext.java
@@ -34,7 +34,7 @@
 import org.apache.nifi.registry.VariableRegistry;
 import org.apache.nifi.scheduling.ExecutionNode;
 import org.apache.nifi.state.MockStateManager;
-import org.junit.Assert;
+import org.junit.jupiter.api.Assertions;
 
 import java.util.ArrayList;
 import java.util.Collection;
@@ -412,7 +412,7 @@
         }
 
         if (failureCount > 0) {
-            Assert.fail("Processor has " + failureCount + " validation failures:\n" + sb.toString());
+            Assertions.fail("Processor has " + failureCount + " validation failures:\n" + sb.toString());
         }
     }
 
diff --git a/nifi-mock/src/main/java/org/apache/nifi/util/MockProcessSession.java b/nifi-mock/src/main/java/org/apache/nifi/util/MockProcessSession.java
index a4a967b..163fc78 100644
--- a/nifi-mock/src/main/java/org/apache/nifi/util/MockProcessSession.java
+++ b/nifi-mock/src/main/java/org/apache/nifi/util/MockProcessSession.java
@@ -34,7 +34,7 @@
 import org.apache.nifi.processor.io.StreamCallback;
 import org.apache.nifi.provenance.ProvenanceReporter;
 import org.apache.nifi.state.MockStateManager;
-import org.junit.Assert;
+import org.junit.jupiter.api.Assertions;
 
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
@@ -565,7 +565,7 @@
         }
 
         if ("uuid".equals(attrName)) {
-            Assert.fail("Should not be attempting to set FlowFile UUID via putAttribute. This will be ignored in production");
+            Assertions.fail("Should not be attempting to set FlowFile UUID via putAttribute. This will be ignored in production");
         }
 
         final MockFlowFile mock = (MockFlowFile) flowFile;
@@ -1203,28 +1203,28 @@
      * Assert that the session has been committed
      */
     public void assertCommitted() {
-        Assert.assertTrue("Session was not committed", committed);
+        Assertions.assertTrue(committed, "Session was not committed");
     }
 
     /**
      * Assert that the session has not been committed
      */
     public void assertNotCommitted() {
-        Assert.assertFalse("Session was committed", committed);
+        Assertions.assertFalse(committed, "Session was committed");
     }
 
     /**
      * Assert that {@link #rollback()} has been called
      */
     public void assertRolledBack() {
-        Assert.assertTrue("Session was not rolled back", rolledback);
+        Assertions.assertTrue(rolledback, "Session was not rolled back");
     }
 
     /**
      * Assert that {@link #rollback()} has not been called
      */
     public void assertNotRolledBack() {
-        Assert.assertFalse("Session was rolled back", rolledback);
+        Assertions.assertFalse(rolledback, "Session was rolled back");
     }
 
     /**
@@ -1236,8 +1236,8 @@
      */
     public void assertTransferCount(final Relationship relationship, final int count) {
         final int transferCount = getFlowFilesForRelationship(relationship).size();
-        Assert.assertEquals("Expected " + count + " FlowFiles to be transferred to "
-            + relationship + " but actual transfer count was " + transferCount, count, transferCount);
+        Assertions.assertEquals(count, transferCount, "Expected " + count + " FlowFiles to be transferred to "
+            + relationship + " but actual transfer count was " + transferCount);
     }
 
     /**
@@ -1255,14 +1255,14 @@
      * Assert that there are no FlowFiles left on the input queue.
      */
     public void assertQueueEmpty() {
-        Assert.assertTrue("FlowFile Queue has " + this.processorQueue.size() + " items", this.processorQueue.isEmpty());
+        Assertions.assertTrue(this.processorQueue.isEmpty(), "FlowFile Queue has " + this.processorQueue.size() + " items");
     }
 
     /**
      * Assert that at least one FlowFile is on the input queue
      */
     public void assertQueueNotEmpty() {
-        Assert.assertFalse("FlowFile Queue is empty", this.processorQueue.isEmpty());
+        Assertions.assertFalse(this.processorQueue.isEmpty(), "FlowFile Queue is empty");
     }
 
     /**
@@ -1287,7 +1287,7 @@
             final List<MockFlowFile> flowFiles = entry.getValue();
 
             if (!rel.equals(relationship) && flowFiles != null && !flowFiles.isEmpty()) {
-                Assert.fail("Expected all Transferred FlowFiles to go to " + relationship + " but " + flowFiles.size() + " were routed to " + rel);
+                Assertions.fail("Expected all Transferred FlowFiles to go to " + relationship + " but " + flowFiles.size() + " were routed to " + rel);
             }
         }
     }
diff --git a/nifi-mock/src/main/java/org/apache/nifi/util/StandardProcessorTestRunner.java b/nifi-mock/src/main/java/org/apache/nifi/util/StandardProcessorTestRunner.java
index 27de55d..d489177 100644
--- a/nifi-mock/src/main/java/org/apache/nifi/util/StandardProcessorTestRunner.java
+++ b/nifi-mock/src/main/java/org/apache/nifi/util/StandardProcessorTestRunner.java
@@ -43,7 +43,7 @@
 import org.apache.nifi.registry.VariableDescriptor;
 import org.apache.nifi.reporting.InitializationException;
 import org.apache.nifi.state.MockStateManager;
-import org.junit.Assert;
+import org.junit.jupiter.api.Assertions;
 
 import java.io.ByteArrayInputStream;
 import java.io.IOException;
@@ -131,7 +131,7 @@
         try {
             ReflectionUtils.invokeMethodsWithAnnotation(OnAdded.class, processor);
         } catch (final Exception e) {
-            Assert.fail("Could not invoke methods annotated with @OnAdded annotation due to: " + e);
+            Assertions.fail("Could not invoke methods annotated with @OnAdded annotation due to: " + e);
         }
 
         triggerSerially = null != processor.getClass().getAnnotation(TriggerSerially.class);
@@ -201,7 +201,7 @@
                     ReflectionUtils.invokeMethodsWithAnnotation(OnScheduled.class, processor, context);
                 } catch (final Exception e) {
                     e.printStackTrace();
-                    Assert.fail("Could not invoke methods annotated with @OnScheduled annotation due to: " + e);
+                    Assertions.fail("Could not invoke methods annotated with @OnScheduled annotation due to: " + e);
                 }
             }
 
@@ -252,7 +252,7 @@
         try {
             ReflectionUtils.invokeMethodsWithAnnotation(OnUnscheduled.class, processor, context);
         } catch (final Exception e) {
-            Assert.fail("Could not invoke methods annotated with @OnUnscheduled annotation due to: " + e);
+            Assertions.fail("Could not invoke methods annotated with @OnUnscheduled annotation due to: " + e);
         }
     }
 
@@ -260,7 +260,7 @@
         try {
             ReflectionUtils.invokeMethodsWithAnnotation(OnStopped.class, processor, context);
         } catch (final Exception e) {
-            Assert.fail("Could not invoke methods annotated with @OnStopped annotation due to: " + e);
+            Assertions.fail("Could not invoke methods annotated with @OnStopped annotation due to: " + e);
         }
     }
 
@@ -269,7 +269,7 @@
         try {
             ReflectionUtils.invokeMethodsWithAnnotation(OnShutdown.class, processor);
         } catch (final Exception e) {
-            Assert.fail("Could not invoke methods annotated with @OnShutdown annotation due to: " + e);
+            Assertions.fail("Could not invoke methods annotated with @OnShutdown annotation due to: " + e);
         }
     }
 
@@ -318,7 +318,7 @@
         assertAllFlowFiles(new FlowFileValidator() {
             @Override
             public void assertFlowFile(FlowFile f) {
-                Assert.assertTrue(f.getAttribute(attributeName) != null);
+                Assertions.assertTrue(f.getAttribute(attributeName) != null);
             }
         });
     }
@@ -328,7 +328,7 @@
         assertAllFlowFiles(relationship, new FlowFileValidator() {
             @Override
             public void assertFlowFile(FlowFile f) {
-                Assert.assertTrue(f.getAttribute(attributeName) != null);
+                Assertions.assertTrue(f.getAttribute(attributeName) != null);
             }
         });
     }
@@ -355,17 +355,17 @@
 
     @Override
     public void assertTransferCount(final Relationship relationship, final int count) {
-        Assert.assertEquals(count, getFlowFilesForRelationship(relationship).size());
+        Assertions.assertEquals(count, getFlowFilesForRelationship(relationship).size());
     }
 
     @Override
     public void assertTransferCount(final String relationship, final int count) {
-        Assert.assertEquals(count, getFlowFilesForRelationship(relationship).size());
+        Assertions.assertEquals(count, getFlowFilesForRelationship(relationship).size());
     }
 
     @Override
     public void assertPenalizeCount(final int count) {
-        Assert.assertEquals(count, getPenalizedFlowFiles().size());
+        Assertions.assertEquals(count, getPenalizedFlowFiles().size());
     }
 
     @Override
@@ -375,7 +375,7 @@
 
     @Override
     public void assertNotValid() {
-        Assert.assertFalse("Processor appears to be valid but expected it to be invalid", context.isValid());
+        Assertions.assertFalse(context.isValid(), "Processor appears to be valid but expected it to be invalid");
     }
 
     @Override
@@ -385,12 +385,12 @@
 
     @Override
     public void assertQueueEmpty() {
-        Assert.assertTrue(flowFileQueue.isEmpty());
+        Assertions.assertTrue(flowFileQueue.isEmpty());
     }
 
     @Override
     public void assertQueueNotEmpty() {
-        Assert.assertFalse(flowFileQueue.isEmpty());
+        Assertions.assertFalse(flowFileQueue.isEmpty());
     }
 
     @Override
@@ -540,7 +540,7 @@
     @Override
     public void setThreadCount(final int threadCount) {
         if (threadCount > 1 && triggerSerially) {
-            Assert.fail("Cannot set thread-count higher than 1 because the processor is triggered serially");
+            Assertions.fail("Cannot set thread-count higher than 1 because the processor is triggered serially");
         }
 
         this.numThreads = threadCount;
@@ -652,7 +652,7 @@
             }
         }
 
-        Assert.fail("Expected Controller Service " + service + " to be invalid but it is valid");
+        Assertions.fail("Expected Controller Service " + service + " to be invalid but it is valid");
     }
 
     @Override
@@ -667,7 +667,7 @@
 
         for (final ValidationResult result : results) {
             if (!result.isValid()) {
-                Assert.fail("Expected Controller Service to be valid but it is invalid due to: " + result.toString());
+                Assertions.fail("Expected Controller Service to be valid but it is invalid due to: " + result.toString());
             }
         }
     }
@@ -687,7 +687,7 @@
             ReflectionUtils.invokeMethodsWithAnnotation(OnDisabled.class, service);
         } catch (final Exception e) {
             e.printStackTrace();
-            Assert.fail("Failed to disable Controller Service " + service + " due to " + e);
+            Assertions.fail("Failed to disable Controller Service " + service + " due to " + e);
         }
 
         configuration.setEnabled(false);
@@ -723,10 +723,10 @@
             ReflectionUtils.invokeMethodsWithAnnotation(OnEnabled.class, service, configContext);
         } catch (final InvocationTargetException ite) {
             ite.getCause().printStackTrace();
-            Assert.fail("Failed to enable Controller Service " + service + " due to " + ite.getCause());
+            Assertions.fail("Failed to enable Controller Service " + service + " due to " + ite.getCause());
         } catch (final Exception e) {
             e.printStackTrace();
-            Assert.fail("Failed to enable Controller Service " + service + " due to " + e);
+            Assertions.fail("Failed to enable Controller Service " + service + " due to " + e);
         }
 
         configuration.setEnabled(true);
@@ -752,7 +752,7 @@
             ReflectionUtils.invokeMethodsWithAnnotation(OnRemoved.class, service);
         } catch (final Exception e) {
             e.printStackTrace();
-            Assert.fail("Failed to remove Controller Service " + service + " due to " + e);
+            Assertions.fail("Failed to remove Controller Service " + service + " due to " + e);
         }
 
         context.removeControllerService(service);
@@ -989,18 +989,18 @@
     public void assertAllConditionsMet(final Relationship relationship, Predicate<MockFlowFile> predicate) {
 
         if (predicate==null) {
-            Assert.fail("predicate cannot be null");
+            Assertions.fail("predicate cannot be null");
         }
 
         final List<MockFlowFile> flowFiles = getFlowFilesForRelationship(relationship);
 
         if (flowFiles.isEmpty()) {
-            Assert.fail("Relationship " + relationship.getName() + " does not contain any FlowFile");
+            Assertions.fail("Relationship " + relationship.getName() + " does not contain any FlowFile");
         }
 
         for (MockFlowFile flowFile : flowFiles) {
             if (predicate.test(flowFile)==false) {
-                Assert.fail("FlowFile " + flowFile + " does not meet all condition");
+                Assertions.fail("FlowFile " + flowFile + " does not meet all condition");
             }
         }
     }
diff --git a/nifi-mock/src/main/java/org/apache/nifi/util/TestRunner.java b/nifi-mock/src/main/java/org/apache/nifi/util/TestRunner.java
index f16fb79..fde8c6a 100644
--- a/nifi-mock/src/main/java/org/apache/nifi/util/TestRunner.java
+++ b/nifi-mock/src/main/java/org/apache/nifi/util/TestRunner.java
@@ -211,7 +211,7 @@
     /**
      * Updates the value of the property with the given PropertyDescriptor to
      * the specified value IF and ONLY IF the value is valid according to the
-     * descriptor's validator. Otherwise, Assert.fail() is called, causing the
+     * descriptor's validator. Otherwise, Assertions.fail() is called, causing the
      * unit test to fail
      *
      * @param propertyName name
@@ -223,7 +223,7 @@
     /**
      * Updates the value of the property with the given PropertyDescriptor to
      * the specified value IF and ONLY IF the value is valid according to the
-     * descriptor's validator. Otherwise, Assert.fail() is called, causing the
+     * descriptor's validator. Otherwise, Assertions.fail() is called, causing the
      * unit test to fail
      *
      * @param descriptor descriptor
@@ -235,7 +235,7 @@
     /**
      * Updates the value of the property with the given PropertyDescriptor to
      * the specified value IF and ONLY IF the value is valid according to the
-     * descriptor's validator. Otherwise, Assert.fail() is called, causing the
+     * descriptor's validator. Otherwise, Assertions.fail() is called, causing the
      * unit test to fail
      *
      * @param descriptor descriptor
diff --git a/nifi-mock/src/test/java/org/apache/nifi/util/CurrentTestStandardProcessorTestRunner.java b/nifi-mock/src/test/java/org/apache/nifi/util/CurrentTestStandardProcessorTestRunner.java
index 6b403af..cde947e 100644
--- a/nifi-mock/src/test/java/org/apache/nifi/util/CurrentTestStandardProcessorTestRunner.java
+++ b/nifi-mock/src/test/java/org/apache/nifi/util/CurrentTestStandardProcessorTestRunner.java
@@ -21,7 +21,7 @@
 import org.apache.nifi.processor.ProcessSession;
 import org.apache.nifi.processor.exception.ProcessException;
 import org.junit.Assert;
-import org.junit.Test;
+import org.junit.jupiter.api.Test;
 
 public class CurrentTestStandardProcessorTestRunner {
 
diff --git a/nifi-mock/src/test/java/org/apache/nifi/util/TestMockProcessContext.java b/nifi-mock/src/test/java/org/apache/nifi/util/TestMockProcessContext.java
index f83db9f..241394a 100644
--- a/nifi-mock/src/test/java/org/apache/nifi/util/TestMockProcessContext.java
+++ b/nifi-mock/src/test/java/org/apache/nifi/util/TestMockProcessContext.java
@@ -31,7 +31,7 @@
 import org.apache.nifi.processor.ProcessSession;
 import org.apache.nifi.processor.exception.ProcessException;
 import org.apache.nifi.processor.util.StandardValidators;
-import org.junit.Test;
+import org.junit.jupiter.api.Test;
 
 public class TestMockProcessContext {
 
diff --git a/nifi-mock/src/test/java/org/apache/nifi/util/TestMockProcessSession.java b/nifi-mock/src/test/java/org/apache/nifi/util/TestMockProcessSession.java
index 8e64988..eefd4a3 100644
--- a/nifi-mock/src/test/java/org/apache/nifi/util/TestMockProcessSession.java
+++ b/nifi-mock/src/test/java/org/apache/nifi/util/TestMockProcessSession.java
@@ -26,8 +26,7 @@
 import org.apache.nifi.processor.exception.ProcessException;
 import org.apache.nifi.state.MockStateManager;
 import org.apache.nifi.stream.io.StreamUtils;
-import org.junit.Assert;
-import org.junit.Test;
+import org.junit.jupiter.api.Test;
 
 import java.io.IOException;
 import java.io.InputStream;
@@ -35,9 +34,11 @@
 import java.util.Set;
 import java.util.concurrent.atomic.AtomicLong;
 
-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;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.junit.jupiter.api.Assertions.fail;
 
 public class TestMockProcessSession {
 
@@ -54,7 +55,7 @@
 
         try {
             session.commit();
-            Assert.fail("Was able to commit session without closing InputStream");
+            fail("Was able to commit session without closing InputStream");
         } catch (final FlowFileHandlingException | IllegalStateException e) {
             System.out.println(e.toString());
         }
@@ -73,7 +74,7 @@
 
         try {
             session.commitAsync();
-            Assert.fail("Was able to commit session without closing InputStream");
+            fail("Was able to commit session without closing InputStream");
         } catch (final FlowFileHandlingException | IllegalStateException e) {
             System.out.println(e.toString());
         }
@@ -87,26 +88,26 @@
         final Relationship fakeRel = new Relationship.Builder().name("FAKE").build();
         try {
             session.transfer(ff1, fakeRel);
-            Assert.fail("Should have thrown IllegalArgumentException");
+            fail("Should have thrown IllegalArgumentException");
         } catch (final IllegalArgumentException ie) {
 
         }
         try {
             session.transfer(Collections.singleton(ff1), fakeRel);
-            Assert.fail("Should have thrown IllegalArgumentException");
+            fail("Should have thrown IllegalArgumentException");
         } catch (final IllegalArgumentException ie) {
 
         }
 
     }
 
-    @Test(expected = IllegalArgumentException.class)
+    @Test
     public void testRejectTransferNewlyCreatedFileToSelf() {
         final Processor processor = new PoorlyBehavedProcessor();
         final MockProcessSession session = new MockProcessSession(new SharedSessionState(processor, new AtomicLong(0L)), processor, new MockStateManager(processor));
         final FlowFile ff1 = session.createFlowFile("hello, world".getBytes());
         // this should throw an exception because we shouldn't allow a newly created flowfile to get routed back to self
-        session.transfer(ff1);
+        assertThrows(IllegalArgumentException.class, () -> session.transfer(ff1));
     }
 
     @Test
diff --git a/nifi-mock/src/test/java/org/apache/nifi/util/TestStandardProcessorTestRunner.java b/nifi-mock/src/test/java/org/apache/nifi/util/TestStandardProcessorTestRunner.java
index f2febb4..b7025f8 100644
--- a/nifi-mock/src/test/java/org/apache/nifi/util/TestStandardProcessorTestRunner.java
+++ b/nifi-mock/src/test/java/org/apache/nifi/util/TestStandardProcessorTestRunner.java
@@ -19,6 +19,7 @@
 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;
 
@@ -43,7 +44,7 @@
 import org.apache.nifi.processor.Relationship;
 import org.apache.nifi.processor.exception.ProcessException;
 import org.apache.nifi.reporting.InitializationException;
-import org.junit.Test;
+import org.junit.jupiter.api.Test;
 
 public class TestStandardProcessorTestRunner {
 
@@ -131,27 +132,24 @@
         });
     }
 
-    @Test(expected = AssertionError.class)
+    @Test
     public void testFailFlowFileValidator() {
         final AddAttributeProcessor proc = new AddAttributeProcessor();
         final TestRunner runner = TestRunners.newTestRunner(proc);
 
         runner.run(5, true);
-        runner.assertAllFlowFiles(new FlowFileValidator() {
-            @Override
-            public void assertFlowFile(FlowFile f) {
-                assertEquals("value", f.getAttribute(AddAttributeProcessor.KEY));
-            }
+        assertThrows(AssertionError.class, () -> {
+            runner.assertAllFlowFiles(f -> assertEquals("value", f.getAttribute(AddAttributeProcessor.KEY)));
         });
     }
 
-    @Test(expected = AssertionError.class)
+    @Test
     public void testFailAllFlowFilesContainAttribute() {
         final AddAttributeProcessor proc = new AddAttributeProcessor();
         final TestRunner runner = TestRunners.newTestRunner(proc);
 
         runner.run(5, true);
-        runner.assertAllFlowFilesContainAttribute(AddAttributeProcessor.KEY);
+        assertThrows(AssertionError.class, () -> runner.assertAllFlowFilesContainAttribute(AddAttributeProcessor.KEY));
     }
 
     @Test
diff --git a/nifi-nar-bundles/nifi-email-bundle/nifi-email-processors/pom.xml b/nifi-nar-bundles/nifi-email-bundle/nifi-email-processors/pom.xml
index cdc936b..75423b9 100644
--- a/nifi-nar-bundles/nifi-email-bundle/nifi-email-processors/pom.xml
+++ b/nifi-nar-bundles/nifi-email-bundle/nifi-email-processors/pom.xml
@@ -121,5 +121,11 @@
             <version>1.5.11</version>
             <scope>test</scope>
         </dependency>
+        <dependency>
+            <groupId>org.hamcrest</groupId>
+            <artifactId>hamcrest-core</artifactId>
+            <version>2.2</version>
+            <scope>test</scope>
+        </dependency>
     </dependencies>
 </project>
diff --git a/nifi-nar-bundles/nifi-graph-bundle/nifi-graph-processors/src/test/java/org/apache/nifi/processors/graph/ExecuteGraphQueryIT.java b/nifi-nar-bundles/nifi-graph-bundle/nifi-graph-processors/src/test/java/org/apache/nifi/processors/graph/ExecuteGraphQueryIT.java
index 7f9e2ef..769fd4a 100644
--- a/nifi-nar-bundles/nifi-graph-bundle/nifi-graph-processors/src/test/java/org/apache/nifi/processors/graph/ExecuteGraphQueryIT.java
+++ b/nifi-nar-bundles/nifi-graph-bundle/nifi-graph-processors/src/test/java/org/apache/nifi/processors/graph/ExecuteGraphQueryIT.java
@@ -22,8 +22,8 @@
 import org.apache.nifi.util.MockFlowFile;
 import org.apache.nifi.util.TestRunner;
 import org.apache.nifi.util.TestRunners;
-import org.junit.Before;
-import org.junit.Test;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
 
 import java.util.List;
 import java.util.Map;
@@ -37,7 +37,7 @@
                                         "}\n" +
                                         "g.V().hasLabel(\"test\").count().next()";
 
-    @Before
+    @BeforeEach
     public void setUp() throws Exception {
         InMemoryJanusGraphClientService service = new InMemoryJanusGraphClientService();
         runner = TestRunners.newTestRunner(ExecuteGraphQuery.class);
diff --git a/nifi-nar-bundles/nifi-graph-bundle/nifi-graph-processors/src/test/java/org/apache/nifi/processors/graph/ExecuteGraphQueryRecordTest.java b/nifi-nar-bundles/nifi-graph-bundle/nifi-graph-processors/src/test/java/org/apache/nifi/processors/graph/ExecuteGraphQueryRecordTest.java
index b832423..668da17 100644
--- a/nifi-nar-bundles/nifi-graph-bundle/nifi-graph-processors/src/test/java/org/apache/nifi/processors/graph/ExecuteGraphQueryRecordTest.java
+++ b/nifi-nar-bundles/nifi-graph-bundle/nifi-graph-processors/src/test/java/org/apache/nifi/processors/graph/ExecuteGraphQueryRecordTest.java
@@ -26,8 +26,8 @@
 import org.apache.nifi.util.TestRunners;
 import org.apache.nifi.json.JsonTreeReader;
 import org.apache.nifi.serialization.record.MockRecordWriter;
-import org.junit.Before;
-import org.junit.Test;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
 
 import java.io.IOException;
 import java.io.InputStream;
@@ -44,7 +44,7 @@
     private TestRunner runner;
     Map<String, String> enqueProperties = new HashMap<>();
 
-    @Before
+    @BeforeEach
     public void setup() throws InitializationException {
         MockRecordWriter writer = new MockRecordWriter();
         JsonTreeReader reader = new JsonTreeReader();
diff --git a/nifi-nar-bundles/nifi-graph-bundle/nifi-graph-processors/src/test/java/org/apache/nifi/processors/graph/TestExecuteGraphQuery.java b/nifi-nar-bundles/nifi-graph-bundle/nifi-graph-processors/src/test/java/org/apache/nifi/processors/graph/TestExecuteGraphQuery.java
index cdcd112..85be628 100644
--- a/nifi-nar-bundles/nifi-graph-bundle/nifi-graph-processors/src/test/java/org/apache/nifi/processors/graph/TestExecuteGraphQuery.java
+++ b/nifi-nar-bundles/nifi-graph-bundle/nifi-graph-processors/src/test/java/org/apache/nifi/processors/graph/TestExecuteGraphQuery.java
@@ -21,11 +21,8 @@
 import org.apache.nifi.util.MockFlowFile;
 import org.apache.nifi.util.TestRunner;
 import org.apache.nifi.util.TestRunners;
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-import org.mockito.junit.MockitoJUnit;
-import org.mockito.junit.MockitoRule;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
 
 import java.util.HashMap;
 import java.util.List;
@@ -41,9 +38,7 @@
 public class TestExecuteGraphQuery {
     protected TestRunner runner;
 
-    @Rule public MockitoRule mockitoRule = MockitoJUnit.rule();
-
-    @Before
+    @BeforeEach
     public void setUp() throws Exception {
         MockCypherClientService service = new MockCypherClientService();
         runner = TestRunners.newTestRunner(ExecuteGraphQuery.class);
diff --git a/nifi-nar-bundles/nifi-graph-bundle/nifi-neo4j-cypher-service/src/test/java/org/apache/nifi/graph/ITNeo4JCypherExecutor.java b/nifi-nar-bundles/nifi-graph-bundle/nifi-neo4j-cypher-service/src/test/java/org/apache/nifi/graph/ITNeo4JCypherExecutor.java
index b2fa2c9..fd3566d 100644
--- a/nifi-nar-bundles/nifi-graph-bundle/nifi-neo4j-cypher-service/src/test/java/org/apache/nifi/graph/ITNeo4JCypherExecutor.java
+++ b/nifi-nar-bundles/nifi-graph-bundle/nifi-neo4j-cypher-service/src/test/java/org/apache/nifi/graph/ITNeo4JCypherExecutor.java
@@ -18,9 +18,9 @@
 
 import org.apache.nifi.util.TestRunner;
 import org.apache.nifi.util.TestRunners;
-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.neo4j.driver.v1.AuthTokens;
 import org.neo4j.driver.v1.Driver;
 import org.neo4j.driver.v1.GraphDatabase;
@@ -47,7 +47,7 @@
     private GraphClientService clientService;
     private GraphQueryResultCallback EMPTY_CALLBACK = (record, hasMore) -> {};
 
-    @Before
+    @BeforeEach
     public void setUp() throws Exception {
         clientService = new Neo4JCypherClientService();
         runner = TestRunners.newTestRunner(MockProcessor.class);
@@ -70,7 +70,7 @@
         }
     }
 
-    @After
+    @AfterEach
     public void tearDown() {
         runner = null;
         if (driver != null) {
diff --git a/nifi-nar-bundles/nifi-graph-bundle/nifi-other-graph-services/src/test/java/org/apache/nifi/graph/OpenCypherClientServiceIT.java b/nifi-nar-bundles/nifi-graph-bundle/nifi-other-graph-services/src/test/java/org/apache/nifi/graph/OpenCypherClientServiceIT.java
index 340b81a..6397d3f 100644
--- a/nifi-nar-bundles/nifi-graph-bundle/nifi-other-graph-services/src/test/java/org/apache/nifi/graph/OpenCypherClientServiceIT.java
+++ b/nifi-nar-bundles/nifi-graph-bundle/nifi-other-graph-services/src/test/java/org/apache/nifi/graph/OpenCypherClientServiceIT.java
@@ -23,10 +23,10 @@
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
 
-import org.junit.After;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
 import org.neo4j.driver.v1.Driver;
 import org.neo4j.driver.v1.Session;
 import org.neo4j.driver.v1.StatementResult;
@@ -54,7 +54,7 @@
     GraphClientService service;
     private Driver driver;
 
-    @Before
+    @BeforeEach
     public void before() throws Exception {
         service = new OpenCypherClientService();
         runner = TestRunners.newTestRunner(MockProcessor.class);
@@ -64,7 +64,7 @@
         runner.enableControllerService(service);
         runner.assertValid();
 
-        Assert.assertEquals("gremlin://localhost:8182/gremlin", service.getTransitUrl());
+        Assertions.assertEquals("gremlin://localhost:8182/gremlin", service.getTransitUrl());
 
         driver = GremlinDatabase.driver("//localhost:8182");
         executeSession("MATCH (n) detach delete n");
@@ -75,7 +75,7 @@
                 "CREATE (rover)-[:chases]->(fido)");
     }
 
-    @After
+    @AfterEach
     public void after() {
         executeSession("MATCH (n) DETACH DELETE n");
     }
diff --git a/nifi-nar-bundles/nifi-mongodb-bundle/nifi-mongodb-processors/src/test/groovy/org/apache/nifi/processors/mongodb/GetMongoRecordIT.groovy b/nifi-nar-bundles/nifi-mongodb-bundle/nifi-mongodb-processors/src/test/groovy/org/apache/nifi/processors/mongodb/GetMongoRecordIT.groovy
index 61a99a9..510222b 100644
--- a/nifi-nar-bundles/nifi-mongodb-bundle/nifi-mongodb-processors/src/test/groovy/org/apache/nifi/processors/mongodb/GetMongoRecordIT.groovy
+++ b/nifi-nar-bundles/nifi-mongodb-bundle/nifi-mongodb-processors/src/test/groovy/org/apache/nifi/processors/mongodb/GetMongoRecordIT.groovy
@@ -31,10 +31,10 @@
 import org.apache.nifi.util.TestRunner
 import org.apache.nifi.util.TestRunners
 import org.bson.Document
-import org.junit.After
-import org.junit.Assert
-import org.junit.Before
-import org.junit.Test
+import org.junit.jupiter.api.AfterEach
+import org.junit.jupiter.api.Assertions
+import org.junit.jupiter.api.BeforeEach
+import org.junit.jupiter.api.Test
 
 import static groovy.json.JsonOutput.*
 
@@ -62,7 +62,7 @@
         [ name: "John Brown", failedLogins: 4, lastLogin: new Date(Calendar.instance.time.time - 10000) ]
     ].collect { new Document(it) }
 
-    @Before
+    @BeforeEach
     void setup() {
         runner = TestRunners.newTestRunner(GetMongoRecord.class)
         service = new MongoDBControllerService()
@@ -90,7 +90,7 @@
         service.getDatabase(DB_NAME).getCollection(COL_NAME).insertMany(SAMPLES)
     }
 
-    @After
+    @AfterEach
     void after() {
         service.getDatabase(DB_NAME).drop()
     }
@@ -99,13 +99,13 @@
     void testLookup() {
         def ffValidator = { TestRunner runner ->
             def ffs = runner.getFlowFilesForRelationship(GetMongoRecord.REL_SUCCESS)
-            Assert.assertNotNull(ffs)
-            Assert.assertTrue(ffs.size() == 1)
-            Assert.assertEquals("3", ffs[0].getAttribute("record.count"))
-            Assert.assertEquals("application/json", ffs[0].getAttribute(CoreAttributes.MIME_TYPE.key()))
-            Assert.assertEquals(COL_NAME, ffs[0].getAttribute(GetMongoRecord.COL_NAME))
-            Assert.assertEquals(DB_NAME, ffs[0].getAttribute(GetMongoRecord.DB_NAME))
-            Assert.assertEquals(Document.parse("{}"), Document.parse(ffs[0].getAttribute("executed.query")))
+            Assertions.assertNotNull(ffs)
+            Assertions.assertTrue(ffs.size() == 1)
+            Assertions.assertEquals("3", ffs[0].getAttribute("record.count"))
+            Assertions.assertEquals("application/json", ffs[0].getAttribute(CoreAttributes.MIME_TYPE.key()))
+            Assertions.assertEquals(COL_NAME, ffs[0].getAttribute(GetMongoRecord.COL_NAME))
+            Assertions.assertEquals(DB_NAME, ffs[0].getAttribute(GetMongoRecord.DB_NAME))
+            Assertions.assertEquals(Document.parse("{}"), Document.parse(ffs[0].getAttribute("executed.query")))
         }
 
         runner.setProperty(GetMongoRecord.QUERY_ATTRIBUTE, "executed.query")
@@ -141,13 +141,13 @@
         runner.run()
 
         def parsed = sharedTest()
-        Assert.assertEquals(3, parsed.size())
+        Assertions.assertEquals(3, parsed.size())
         def values = [1, 2, 4]
         int index = 0
         parsed.each {
-            Assert.assertEquals(values[index++], it["failedLogins"])
-            Assert.assertNull(it["name"])
-            Assert.assertNull(it["lastLogin"])
+            Assertions.assertEquals(values[index++], it["failedLogins"])
+            Assertions.assertNull(it["name"])
+            Assertions.assertNull(it["lastLogin"])
         }
     }
 
@@ -159,7 +159,7 @@
         def raw = runner.getContentAsByteArray(ff)
         String content = new String(raw)
         def parsed = new JsonSlurper().parseText(content)
-        Assert.assertNotNull(parsed)
+        Assertions.assertNotNull(parsed)
 
         parsed
     }
@@ -173,7 +173,7 @@
         runner.run()
 
         def parsed = sharedTest()
-        Assert.assertEquals(1, parsed.size())
+        Assertions.assertEquals(1, parsed.size())
 
     }
 }
diff --git a/nifi-nar-bundles/nifi-mongodb-bundle/nifi-mongodb-processors/src/test/java/org/apache/nifi/processors/mongodb/AbstractMongoProcessorTest.java b/nifi-nar-bundles/nifi-mongodb-bundle/nifi-mongodb-processors/src/test/java/org/apache/nifi/processors/mongodb/AbstractMongoProcessorTest.java
index ee4a4ec..32b7899 100644
--- a/nifi-nar-bundles/nifi-mongodb-bundle/nifi-mongodb-processors/src/test/java/org/apache/nifi/processors/mongodb/AbstractMongoProcessorTest.java
+++ b/nifi-nar-bundles/nifi-mongodb-bundle/nifi-mongodb-processors/src/test/java/org/apache/nifi/processors/mongodb/AbstractMongoProcessorTest.java
@@ -25,8 +25,8 @@
 import org.apache.nifi.ssl.SSLContextService;
 import org.apache.nifi.util.TestRunner;
 import org.apache.nifi.util.TestRunners;
-import org.junit.Before;
-import org.junit.Test;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
 
 import javax.net.ssl.SSLContext;
 
@@ -41,7 +41,7 @@
     MockAbstractMongoProcessor processor;
     private TestRunner testRunner;
 
-    @Before
+    @BeforeEach
     public void setUp() throws Exception {
         processor = new MockAbstractMongoProcessor();
         testRunner = TestRunners.newTestRunner(processor);
diff --git a/nifi-nar-bundles/nifi-mongodb-bundle/nifi-mongodb-processors/src/test/java/org/apache/nifi/processors/mongodb/DeleteMongoIT.java b/nifi-nar-bundles/nifi-mongodb-bundle/nifi-mongodb-processors/src/test/java/org/apache/nifi/processors/mongodb/DeleteMongoIT.java
index 9f3c016..9cd6add 100644
--- a/nifi-nar-bundles/nifi-mongodb-bundle/nifi-mongodb-processors/src/test/java/org/apache/nifi/processors/mongodb/DeleteMongoIT.java
+++ b/nifi-nar-bundles/nifi-mongodb-bundle/nifi-mongodb-processors/src/test/java/org/apache/nifi/processors/mongodb/DeleteMongoIT.java
@@ -23,22 +23,22 @@
 import org.apache.nifi.mongodb.MongoDBControllerService;
 import org.apache.nifi.util.TestRunner;
 import org.bson.Document;
-import org.junit.After;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
 
 import java.util.HashMap;
 import java.util.Map;
 
 public class DeleteMongoIT extends MongoWriteTestBase {
-    @Before
+    @BeforeEach
     public void setup() {
         super.setup(DeleteMongo.class);
         collection.insertMany(DOCUMENTS);
     }
 
-    @After
+    @AfterEach
     public void teardown() {
         super.teardown();
     }
@@ -49,8 +49,8 @@
         runner.assertTransferCount(DeleteMongo.REL_FAILURE, 0);
         runner.assertTransferCount(DeleteMongo.REL_SUCCESS, 1);
 
-        Assert.assertEquals("Found a document that should have been deleted.",
-                0, collection.count(Document.parse(query)));
+        Assertions.assertEquals(0, collection.count(Document.parse(query)),
+                "Found a document that should have been deleted.");
     }
 
     @Test
@@ -73,10 +73,8 @@
         runner.assertTransferCount(DeleteMongo.REL_FAILURE, 0);
         runner.assertTransferCount(DeleteMongo.REL_SUCCESS, 1);
 
-        Assert.assertEquals("Found a document that should have been deleted.",
-                0, collection.count(Document.parse(query)));
-        Assert.assertEquals("One document should have been left.",
-                1, collection.count(Document.parse("{}")));
+        Assertions.assertEquals(0, collection.count(Document.parse(query)), "Found a document that should have been deleted.");
+        Assertions.assertEquals(1, collection.count(Document.parse("{}")), "One document should have been left.");
     }
 
     @Test
@@ -108,7 +106,7 @@
         runner.assertTransferCount(DeleteMongo.REL_FAILURE, 1);
         runner.assertTransferCount(DeleteMongo.REL_SUCCESS, 0);
 
-        Assert.assertEquals("A document was deleted", 3, collection.count(Document.parse("{}")));
+        Assertions.assertEquals(3, collection.count(Document.parse("{}")), "A document was deleted");
 
         runner.setProperty(DeleteMongo.FAIL_ON_NO_DELETE, DeleteMongo.NO_FAIL);
         runner.clearTransferState();
@@ -119,7 +117,7 @@
         runner.assertTransferCount(DeleteMongo.REL_FAILURE, 0);
         runner.assertTransferCount(DeleteMongo.REL_SUCCESS, 1);
 
-        Assert.assertEquals("A document was deleted", 3, collection.count(Document.parse("{}")));
+        Assertions.assertEquals(3, collection.count(Document.parse("{}")), "A document was deleted");
     }
 
     @Test
@@ -139,6 +137,6 @@
         runner.assertTransferCount(DeleteMongo.REL_SUCCESS, 1);
         runner.assertTransferCount(DeleteMongo.REL_FAILURE, 0);
 
-        Assert.assertEquals(0, collection.count());
+        Assertions.assertEquals(0, collection.count());
     }
 }
diff --git a/nifi-nar-bundles/nifi-mongodb-bundle/nifi-mongodb-processors/src/test/java/org/apache/nifi/processors/mongodb/GetMongoIT.java b/nifi-nar-bundles/nifi-mongodb-bundle/nifi-mongodb-processors/src/test/java/org/apache/nifi/processors/mongodb/GetMongoIT.java
index 7ec724c..a304f5a 100644
--- a/nifi-nar-bundles/nifi-mongodb-bundle/nifi-mongodb-processors/src/test/java/org/apache/nifi/processors/mongodb/GetMongoIT.java
+++ b/nifi-nar-bundles/nifi-mongodb-bundle/nifi-mongodb-processors/src/test/java/org/apache/nifi/processors/mongodb/GetMongoIT.java
@@ -35,10 +35,10 @@
 import org.apache.nifi.util.TestRunner;
 import org.apache.nifi.util.TestRunners;
 import org.bson.Document;
-import org.junit.After;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
 
 import java.text.SimpleDateFormat;
 import java.util.Calendar;
@@ -70,7 +70,7 @@
     private TestRunner runner;
     private MongoClient mongoClient;
 
-    @Before
+    @BeforeEach
     public void setup() {
         runner = TestRunners.newTestRunner(GetMongo.class);
         runner.setVariable("uri", MONGO_URI);
@@ -88,7 +88,7 @@
         collection.insertMany(DOCUMENTS);
     }
 
-    @After
+    @AfterEach
     public void teardown() {
         runner = null;
 
@@ -109,10 +109,10 @@
         if (pc instanceof MockProcessContext) {
             results = ((MockProcessContext) pc).validate();
         }
-        Assert.assertEquals(2, results.size());
+        Assertions.assertEquals(2, results.size());
         Iterator<ValidationResult> it = results.iterator();
-        Assert.assertTrue(it.next().toString().contains("is invalid because Mongo Database Name is required"));
-        Assert.assertTrue(it.next().toString().contains("is invalid because Mongo Collection Name is required"));
+        Assertions.assertTrue(it.next().toString().contains("is invalid because Mongo Database Name is required"));
+        Assertions.assertTrue(it.next().toString().contains("is invalid because Mongo Collection Name is required"));
 
         // missing query - is ok
         runner.setProperty(AbstractMongoProcessor.URI, MONGO_URI);
@@ -124,7 +124,7 @@
         if (pc instanceof MockProcessContext) {
             results = ((MockProcessContext) pc).validate();
         }
-        Assert.assertEquals(0, results.size());
+        Assertions.assertEquals(0, results.size());
 
         // invalid query
         runner.setProperty(GetMongo.QUERY, "{a: x,y,z}");
@@ -134,8 +134,8 @@
         if (pc instanceof MockProcessContext) {
             results = ((MockProcessContext) pc).validate();
         }
-        Assert.assertEquals(1, results.size());
-        Assert.assertTrue(results.iterator().next().toString().contains("is invalid because"));
+        Assertions.assertEquals(1, results.size());
+        Assertions.assertTrue(results.iterator().next().toString().contains("is invalid because"));
 
         // invalid projection
         runner.setVariable("projection", "{a: x,y,z}");
@@ -147,8 +147,8 @@
         if (pc instanceof MockProcessContext) {
             results = ((MockProcessContext) pc).validate();
         }
-        Assert.assertEquals(1, results.size());
-        Assert.assertTrue(results.iterator().next().toString().contains("is invalid"));
+        Assertions.assertEquals(1, results.size());
+        Assertions.assertTrue(results.iterator().next().toString().contains("is invalid"));
 
         // invalid sort
         runner.removeProperty(GetMongo.PROJECTION);
@@ -159,8 +159,8 @@
         if (pc instanceof MockProcessContext) {
             results = ((MockProcessContext) pc).validate();
         }
-        Assert.assertEquals(1, results.size());
-        Assert.assertTrue(results.iterator().next().toString().contains("is invalid"));
+        Assertions.assertEquals(1, results.size());
+        Assertions.assertTrue(results.iterator().next().toString().contains("is invalid"));
     }
 
     @Test
@@ -177,8 +177,8 @@
         Map<String, Object> parsed = mapper.readValue(raw, Map.class);
         SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
 
-        Assert.assertTrue(parsed.get("date_field").getClass() == String.class);
-        Assert.assertTrue(((String)parsed.get("date_field")).startsWith(format.format(CAL.getTime())));
+        Assertions.assertTrue(parsed.get("date_field").getClass() == String.class);
+        Assertions.assertTrue(((String)parsed.get("date_field")).startsWith(format.format(CAL.getTime())));
     }
 
     @Test
@@ -252,8 +252,8 @@
         runner.assertTransferCount(GetMongo.REL_SUCCESS, 2);
         runner.assertTransferCount(GetMongo.REL_ORIGINAL, 1);
         List<MockFlowFile> results = runner.getFlowFilesForRelationship(GetMongo.REL_SUCCESS);
-        Assert.assertTrue("Flowfile was empty", results.get(0).getSize() > 0);
-        Assert.assertEquals("Wrong mime type", results.get(0).getAttribute(CoreAttributes.MIME_TYPE.key()), "application/json");
+        Assertions.assertTrue(results.get(0).getSize() > 0, "Flowfile was empty");
+        Assertions.assertEquals(results.get(0).getAttribute(CoreAttributes.MIME_TYPE.key()), "application/json", "Wrong mime type");
     }
 
     @Test
@@ -267,8 +267,8 @@
         runner.assertTransferCount(GetMongo.REL_SUCCESS, 2);
         runner.assertTransferCount(GetMongo.REL_ORIGINAL, 1);
         List<MockFlowFile> results = runner.getFlowFilesForRelationship(GetMongo.REL_SUCCESS);
-        Assert.assertTrue("Flowfile was empty", results.get(0).getSize() > 0);
-        Assert.assertEquals("Wrong mime type", results.get(0).getAttribute(CoreAttributes.MIME_TYPE.key()), "application/json");
+        Assertions.assertTrue(results.get(0).getSize() > 0, "Flowfile was empty");
+        Assertions.assertEquals(results.get(0).getAttribute(CoreAttributes.MIME_TYPE.key()), "application/json", "Wrong mime type");
     }
 
     @Test
@@ -283,7 +283,7 @@
         List<MockFlowFile> flowFiles = runner.getFlowFilesForRelationship(GetMongo.REL_SUCCESS);
         byte[] raw = runner.getContentAsByteArray(flowFiles.get(0));
         String json = new String(raw);
-        Assert.assertTrue("JSON did not have new lines.", json.contains("\n"));
+        Assertions.assertTrue(json.contains("\n"), "JSON did not have new lines.");
         runner.clearTransferState();
         runner.setProperty(GetMongo.USE_PRETTY_PRINTING, GetMongo.NO_PP);
         runner.enqueue("{}");
@@ -293,15 +293,15 @@
         flowFiles = runner.getFlowFilesForRelationship(GetMongo.REL_SUCCESS);
         raw = runner.getContentAsByteArray(flowFiles.get(0));
         json = new String(raw);
-        Assert.assertFalse("New lines detected", json.contains("\n"));
+        Assertions.assertFalse(json.contains("\n"), "New lines detected");
     }
 
     private void testQueryAttribute(String attr, String expected) {
         List<MockFlowFile> flowFiles = runner.getFlowFilesForRelationship(GetMongo.REL_SUCCESS);
         for (MockFlowFile mff : flowFiles) {
             String val = mff.getAttribute(attr);
-            Assert.assertNotNull("Missing query attribute", val);
-            Assert.assertEquals("Value was wrong", expected, val);
+            Assertions.assertNotNull(val, "Missing query attribute");
+            Assertions.assertEquals(expected, val, "Value was wrong");
         }
     }
 
@@ -426,7 +426,7 @@
             ex = pe;
         }
 
-        Assert.assertNull("An exception was thrown!", ex);
+        Assertions.assertNull(ex, "An exception was thrown!");
         runner.assertTransferCount(GetMongo.REL_FAILURE, 0);
         runner.assertTransferCount(GetMongo.REL_ORIGINAL, 0);
         runner.assertTransferCount(GetMongo.REL_SUCCESS, 3);
@@ -467,7 +467,7 @@
         runner.assertTransferCount(GetMongo.REL_SUCCESS, 1);
 
         MockFlowFile flowFile = runner.getFlowFilesForRelationship(GetMongo.REL_SUCCESS).get(0);
-        Assert.assertTrue(flowFile.getAttributes().containsKey("property.1"));
+        Assertions.assertTrue(flowFile.getAttributes().containsKey("property.1"));
         flowFile.assertAttributeEquals("property.1", "value-1");
     }
     /*
@@ -536,8 +536,8 @@
                 tmpRunner.run();
             } catch (Throwable ex) {
                 Throwable cause = ex.getCause();
-                Assert.assertTrue(cause instanceof ProcessException);
-                Assert.assertTrue(entry.getKey(), ex.getMessage().contains(entry.getKey()));
+                Assertions.assertTrue(cause instanceof ProcessException);
+                Assertions.assertTrue(ex.getMessage().contains(entry.getKey()), entry.getKey());
             }
             tmpRunner.clearTransferState();
 
@@ -553,10 +553,10 @@
         for (MockFlowFile ff : ffs) {
             String db = ff.getAttribute(GetMongo.DB_NAME);
             String col = ff.getAttribute(GetMongo.COL_NAME);
-            Assert.assertNotNull(db);
-            Assert.assertNotNull(col);
-            Assert.assertEquals(DB_NAME, db);
-            Assert.assertEquals(COLLECTION_NAME, col);
+            Assertions.assertNotNull(db);
+            Assertions.assertNotNull(col);
+            Assertions.assertEquals(DB_NAME, db);
+            Assertions.assertEquals(COLLECTION_NAME, col);
         }
     }
 
@@ -578,8 +578,8 @@
 
         Pattern format = Pattern.compile("([\\d]{4})-([\\d]{2})-([\\d]{2})");
 
-        Assert.assertTrue(result.containsKey("date_field"));
-        Assert.assertTrue(format.matcher((String) result.get("date_field")).matches());
+        Assertions.assertTrue(result.containsKey("date_field"));
+        Assertions.assertTrue(format.matcher((String) result.get("date_field")).matches());
     }
 
     @Test
@@ -667,6 +667,6 @@
 
         List<MockFlowFile> flowFiles = runner.getFlowFilesForRelationship(GetMongo.REL_SUCCESS);
         MockFlowFile flowFile = flowFiles.get(0);
-        Assert.assertEquals(0, flowFile.getSize());
+        Assertions.assertEquals(0, flowFile.getSize());
     }
 }
diff --git a/nifi-nar-bundles/nifi-mongodb-bundle/nifi-mongodb-processors/src/test/java/org/apache/nifi/processors/mongodb/PutMongoIT.java b/nifi-nar-bundles/nifi-mongodb-bundle/nifi-mongodb-processors/src/test/java/org/apache/nifi/processors/mongodb/PutMongoIT.java
index cb78f97..1666a4e 100644
--- a/nifi-nar-bundles/nifi-mongodb-bundle/nifi-mongodb-processors/src/test/java/org/apache/nifi/processors/mongodb/PutMongoIT.java
+++ b/nifi-nar-bundles/nifi-mongodb-bundle/nifi-mongodb-processors/src/test/java/org/apache/nifi/processors/mongodb/PutMongoIT.java
@@ -27,10 +27,10 @@
 import org.apache.nifi.util.TestRunners;
 import org.bson.Document;
 import org.bson.types.ObjectId;
-import org.junit.After;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
 
 import java.nio.charset.StandardCharsets;
 import java.util.Collection;
@@ -40,16 +40,16 @@
 import java.util.List;
 import java.util.Map;
 
-import static org.junit.Assert.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertEquals;
 
 public class PutMongoIT extends MongoWriteTestBase {
-    @Before
+    @BeforeEach
     public void setup() {
         super.setup(PutMongo.class);
     }
 
     @Override
-    @After
+    @AfterEach
     public void teardown() {
         super.teardown();
     }
@@ -71,10 +71,10 @@
         if (pc instanceof MockProcessContext) {
             results = ((MockProcessContext) pc).validate();
         }
-        Assert.assertEquals(2, results.size());
+        assertEquals(2, results.size());
         Iterator<ValidationResult> it = results.iterator();
-        Assert.assertTrue(it.next().toString().contains("is invalid because Mongo Database Name is required"));
-        Assert.assertTrue(it.next().toString().contains("is invalid because Mongo Collection Name is required"));
+        Assertions.assertTrue(it.next().toString().contains("is invalid because Mongo Database Name is required"));
+        Assertions.assertTrue(it.next().toString().contains("is invalid because Mongo Collection Name is required"));
 
         // invalid write concern
         runner.setProperty(AbstractMongoProcessor.URI, MONGO_URI);
@@ -88,8 +88,8 @@
         if (pc instanceof MockProcessContext) {
             results = ((MockProcessContext) pc).validate();
         }
-        Assert.assertEquals(1, results.size());
-        Assert.assertTrue(results.iterator().next().toString().matches("'Write Concern' .* is invalid because Given value not found in allowed set .*"));
+        assertEquals(1, results.size());
+        Assertions.assertTrue(results.iterator().next().toString().matches("'Write Concern' .* is invalid because Given value not found in allowed set .*"));
 
         // valid write concern
         runner.setProperty(PutMongo.WRITE_CONCERN, PutMongo.WRITE_CONCERN_UNACKNOWLEDGED);
@@ -99,7 +99,7 @@
         if (pc instanceof MockProcessContext) {
             results = ((MockProcessContext) pc).validate();
         }
-        Assert.assertEquals(0, results.size());
+        assertEquals(0, results.size());
     }
 
     @Test
@@ -218,14 +218,14 @@
 
         MongoCursor<Document> cursor = collection.find(document).iterator();
         Document found = cursor.next();
-        Assert.assertEquals(found.get("name"), document.get("name"));
-        Assert.assertEquals(found.get("department"), document.get("department"));
+        assertEquals(found.get("name"), document.get("name"));
+        assertEquals(found.get("department"), document.get("department"));
         Document contacts = (Document)found.get("contacts");
-        Assert.assertNotNull(contacts);
-        Assert.assertEquals(contacts.get("twitter"), "@JohnSmith");
-        Assert.assertEquals(contacts.get("email"), "john.smith@test.com");
-        Assert.assertEquals(contacts.get("phone"), "555-555-5555");
-        Assert.assertEquals(collection.count(document), 1);
+        Assertions.assertNotNull(contacts);
+        assertEquals(contacts.get("twitter"), "@JohnSmith");
+        assertEquals(contacts.get("email"), "john.smith@test.com");
+        assertEquals(contacts.get("phone"), "555-555-5555");
+        assertEquals(collection.count(document), 1);
     }
 
     @Test
@@ -257,12 +257,12 @@
         runner.assertTransferCount(PutMongo.REL_SUCCESS, 1);
 
         MongoCursor<Document> iterator = collection.find(new Document("name", "John Smith")).iterator();
-        Assert.assertTrue("Document did not come back.", iterator.hasNext());
+        Assertions.assertTrue(iterator.hasNext(), "Document did not come back.");
         Document val = iterator.next();
         Map contacts = (Map)val.get("contacts");
-        Assert.assertNotNull(contacts);
-        Assert.assertTrue(contacts.containsKey("twitter") && contacts.get("twitter").equals("@JohnSmith"));
-        Assert.assertTrue(val.containsKey("writes") && val.get("writes").equals(1));
+        Assertions.assertNotNull(contacts);
+        Assertions.assertTrue(contacts.containsKey("twitter") && contacts.get("twitter").equals("@JohnSmith"));
+        Assertions.assertTrue(val.containsKey("writes") && val.get("writes").equals(1));
     }
 
     private void updateTests(TestRunner runner, Document document) {
@@ -271,11 +271,11 @@
         runner.assertTransferCount(PutMongo.REL_SUCCESS, 1);
 
         MongoCursor<Document> iterator = collection.find(document).iterator();
-        Assert.assertTrue("Document did not come back.", iterator.hasNext());
+        Assertions.assertTrue(iterator.hasNext(), "Document did not come back.");
         Document val = iterator.next();
-        Assert.assertTrue(val.containsKey("email") && val.get("email").equals("john.smith@test.com"));
-        Assert.assertTrue(val.containsKey("grade") && val.get("grade").equals("Sr. Principle Eng."));
-        Assert.assertTrue(val.containsKey("writes") && val.get("writes").equals(1));
+        Assertions.assertTrue(val.containsKey("email") && val.get("email").equals("john.smith@test.com"));
+        Assertions.assertTrue(val.containsKey("grade") && val.get("grade").equals("Sr. Principle Eng."));
+        Assertions.assertTrue(val.containsKey("writes") && val.get("writes").equals(1));
     }
 
     @Test
@@ -462,13 +462,13 @@
         Document query = new Document("_id", "Test");
         Document result = collection.find(query).first();
         List array = (List)result.get("testArr");
-        Assert.assertNotNull("Array was empty", array);
-        Assert.assertEquals("Wrong size", array.size(), 3);
+        Assertions.assertNotNull(array, "Array was empty");
+        assertEquals(3, array.size(), "Wrong size");
         for (int index = 0; index < array.size(); index++) {
             Document doc = (Document)array.get(index);
             String msg = doc.getString("msg");
-            Assert.assertNotNull("Msg was null", msg);
-            Assert.assertEquals("Msg had wrong value", msg, "Hi");
+            Assertions.assertNotNull("Msg was null", msg);
+            assertEquals(msg, "Hi", "Msg had wrong value");
         }
     }
 
@@ -517,8 +517,8 @@
 
             Document query = new Document(updateKeyProps[index], updateKeys[index]);
             Document result = collection.find(query).first();
-            Assert.assertNotNull("Result was null", result);
-            Assert.assertEquals("Count was wrong", 1, collection.count(query));
+            Assertions.assertNotNull(result, "Result was null");
+            assertEquals(1, collection.count(query), "Count was wrong");
             runner.clearTransferState();
             index++;
         }
diff --git a/nifi-nar-bundles/nifi-mongodb-bundle/nifi-mongodb-processors/src/test/java/org/apache/nifi/processors/mongodb/PutMongoRecordIT.java b/nifi-nar-bundles/nifi-mongodb-bundle/nifi-mongodb-processors/src/test/java/org/apache/nifi/processors/mongodb/PutMongoRecordIT.java
index 371f38c..a8e3319 100644
--- a/nifi-nar-bundles/nifi-mongodb-bundle/nifi-mongodb-processors/src/test/java/org/apache/nifi/processors/mongodb/PutMongoRecordIT.java
+++ b/nifi-nar-bundles/nifi-mongodb-bundle/nifi-mongodb-processors/src/test/java/org/apache/nifi/processors/mongodb/PutMongoRecordIT.java
@@ -38,10 +38,10 @@
 import org.apache.nifi.util.TestRunner;
 import org.apache.nifi.util.TestRunners;
 import org.bson.Document;
-import org.junit.After;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
 
 import java.nio.charset.StandardCharsets;
 import java.util.ArrayList;
@@ -52,19 +52,19 @@
 import java.util.List;
 import java.util.Map;
 
-import static org.junit.Assert.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertEquals;
 
 public class PutMongoRecordIT extends MongoWriteTestBase {
 
     private MockRecordParser recordReader;
 
-    @Before
+    @BeforeEach
     public void setup() throws Exception {
         super.setup(PutMongoRecord.class);
         recordReader = new MockRecordParser();
     }
 
-    @After
+    @AfterEach
     public void teardown() {
         super.teardown();
     }
@@ -96,11 +96,11 @@
         if (pc instanceof MockProcessContext) {
             results = ((MockProcessContext) pc).validate();
         }
-        Assert.assertEquals(3, results.size());
+        assertEquals(3, results.size());
         Iterator<ValidationResult> it = results.iterator();
-        Assert.assertTrue(it.next().toString().contains("is invalid because Mongo Database Name is required"));
-        Assert.assertTrue(it.next().toString().contains("is invalid because Mongo Collection Name is required"));
-        Assert.assertTrue(it.next().toString().contains("is invalid because Record Reader is required"));
+        Assertions.assertTrue(it.next().toString().contains("is invalid because Mongo Database Name is required"));
+        Assertions.assertTrue(it.next().toString().contains("is invalid because Mongo Collection Name is required"));
+        Assertions.assertTrue(it.next().toString().contains("is invalid because Record Reader is required"));
 
         // invalid write concern
         runner.setProperty(AbstractMongoProcessor.URI, MONGO_URI);
@@ -114,8 +114,8 @@
         if (pc instanceof MockProcessContext) {
             results = ((MockProcessContext) pc).validate();
         }
-        Assert.assertEquals(1, results.size());
-        Assert.assertTrue(results.iterator().next().toString().matches("'Write Concern' .* is invalid because Given value not found in allowed set .*"));
+        assertEquals(1, results.size());
+        Assertions.assertTrue(results.iterator().next().toString().matches("'Write Concern' .* is invalid because Given value not found in allowed set .*"));
 
         // valid write concern
         runner.setProperty(PutMongoRecord.WRITE_CONCERN, PutMongoRecord.WRITE_CONCERN_UNACKNOWLEDGED);
@@ -125,7 +125,7 @@
         if (pc instanceof MockProcessContext) {
             results = ((MockProcessContext) pc).validate();
         }
-        Assert.assertEquals(0, results.size());
+        assertEquals(0, results.size());
     }
 
     @Test
diff --git a/nifi-nar-bundles/nifi-mongodb-bundle/nifi-mongodb-processors/src/test/java/org/apache/nifi/processors/mongodb/PutMongoTest.java b/nifi-nar-bundles/nifi-mongodb-bundle/nifi-mongodb-processors/src/test/java/org/apache/nifi/processors/mongodb/PutMongoTest.java
index 10e2922..a878d5f 100644
--- a/nifi-nar-bundles/nifi-mongodb-bundle/nifi-mongodb-processors/src/test/java/org/apache/nifi/processors/mongodb/PutMongoTest.java
+++ b/nifi-nar-bundles/nifi-mongodb-bundle/nifi-mongodb-processors/src/test/java/org/apache/nifi/processors/mongodb/PutMongoTest.java
@@ -21,8 +21,8 @@
 import org.apache.nifi.util.MockProcessContext;
 import org.apache.nifi.util.TestRunner;
 import org.apache.nifi.util.TestRunners;
-import org.junit.Assert;
-import org.junit.Test;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
 
 import java.util.Collection;
 import java.util.Iterator;
@@ -50,10 +50,10 @@
         if (runner.getProcessContext() instanceof MockProcessContext) {
             results = ((MockProcessContext) runner.getProcessContext()).validate();
         }
-        Assert.assertNotNull(results);
-        Assert.assertEquals(1, results.size());
+        Assertions.assertNotNull(results);
+        Assertions.assertEquals(1, results.size());
         Iterator<ValidationResult> it = results.iterator();
-        Assert.assertTrue(it.next().toString().endsWith("Both update query key and update query cannot be set at the same time."));
+        Assertions.assertTrue(it.next().toString().endsWith("Both update query key and update query cannot be set at the same time."));
 
         runner.removeProperty(PutMongo.UPDATE_QUERY);
         runner.removeProperty(PutMongo.UPDATE_QUERY_KEY);
@@ -65,9 +65,9 @@
             results = ((MockProcessContext) runner.getProcessContext()).validate();
         }
 
-        Assert.assertNotNull(results);
-        Assert.assertEquals(1, results.size());
+        Assertions.assertNotNull(results);
+        Assertions.assertEquals(1, results.size());
         it = results.iterator();
-        Assert.assertTrue(it.next().toString().endsWith("Either the update query key or the update query field must be set."));
+        Assertions.assertTrue(it.next().toString().endsWith("Either the update query key or the update query field must be set."));
     }
 }
diff --git a/nifi-nar-bundles/nifi-mongodb-bundle/nifi-mongodb-processors/src/test/java/org/apache/nifi/processors/mongodb/RunMongoAggregationIT.java b/nifi-nar-bundles/nifi-mongodb-bundle/nifi-mongodb-processors/src/test/java/org/apache/nifi/processors/mongodb/RunMongoAggregationIT.java
index 24c130f..9da6395 100644
--- a/nifi-nar-bundles/nifi-mongodb-bundle/nifi-mongodb-processors/src/test/java/org/apache/nifi/processors/mongodb/RunMongoAggregationIT.java
+++ b/nifi-nar-bundles/nifi-mongodb-bundle/nifi-mongodb-processors/src/test/java/org/apache/nifi/processors/mongodb/RunMongoAggregationIT.java
@@ -29,10 +29,10 @@
 import org.apache.nifi.util.TestRunner;
 import org.apache.nifi.util.TestRunners;
 import org.bson.Document;
-import org.junit.After;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
 
 import java.io.IOException;
 import java.text.SimpleDateFormat;
@@ -54,7 +54,7 @@
     private Map<String, Integer> mappings;
     private Calendar now = Calendar.getInstance();
 
-    @Before
+    @BeforeEach
     public void setup() {
         runner = TestRunners.newTestRunner(RunMongoAggregation.class);
         runner.setVariable("uri", MONGO_URI);
@@ -80,7 +80,7 @@
         }
     }
 
-    @After
+    @AfterEach
     public void teardown() {
         runner = null;
         mongoClient.getDatabase(DB_NAME).drop();
@@ -120,8 +120,8 @@
         List<MockFlowFile> flowFiles = runner.getFlowFilesForRelationship(RunMongoAggregation.REL_RESULTS);
         for (MockFlowFile mff : flowFiles) {
             String val = mff.getAttribute(AGG_ATTR);
-            Assert.assertNotNull("Missing query attribute", val);
-            Assert.assertEquals("Value was wrong", val, queryInput);
+            Assertions.assertNotNull("Missing query attribute", val);
+            Assertions.assertEquals(val, queryInput, "Value was wrong");
         }
     }
 
@@ -182,7 +182,7 @@
         for (MockFlowFile mockFlowFile : flowFiles) {
             byte[] raw = runner.getContentAsByteArray(mockFlowFile);
             Map<String, List<String>> read = mapper.readValue(raw, Map.class);
-            Assert.assertTrue(read.get("myArray").get(1).equalsIgnoreCase( format.format(now.getTime())));
+            Assertions.assertTrue(read.get("myArray").get(1).equalsIgnoreCase( format.format(now.getTime())));
         }
 
         runner.clearTransferState();
@@ -195,7 +195,7 @@
         for (MockFlowFile mockFlowFile : flowFiles) {
             byte[] raw = runner.getContentAsByteArray(mockFlowFile);
             Map<String, List<Long>> read = mapper.readValue(raw, Map.class);
-            Assert.assertTrue(read.get("myArray").get(1) == now.getTimeInMillis());
+            Assertions.assertTrue(read.get("myArray").get(1) == now.getTimeInMillis());
         }
     }
 
@@ -207,12 +207,12 @@
         for (MockFlowFile mockFlowFile : flowFiles) {
             byte[] raw = runner.getContentAsByteArray(mockFlowFile);
             Map read = mapper.readValue(raw, Map.class);
-            Assert.assertTrue("Value was not found", mappings.containsKey(read.get("_id")));
+            Assertions.assertTrue(mappings.containsKey(read.get("_id")), "Value was not found");
 
             String queryAttr = mockFlowFile.getAttribute(AGG_ATTR);
-            Assert.assertNotNull("Query attribute was null.", queryAttr);
-            Assert.assertTrue("Missing $project", queryAttr.contains("$project"));
-            Assert.assertTrue("Missing $group", queryAttr.contains("$group"));
+            Assertions.assertNotNull("Query attribute was null.", queryAttr);
+            Assertions.assertTrue(queryAttr.contains("$project"), "Missing $project");
+            Assertions.assertTrue(queryAttr.contains("$group"), "Missing $group");
         }
     }
 
diff --git a/nifi-nar-bundles/nifi-mongodb-bundle/nifi-mongodb-processors/src/test/java/org/apache/nifi/processors/mongodb/gridfs/DeleteGridFSIT.java b/nifi-nar-bundles/nifi-mongodb-bundle/nifi-mongodb-processors/src/test/java/org/apache/nifi/processors/mongodb/gridfs/DeleteGridFSIT.java
index e006ecb..2a7d01d 100644
--- a/nifi-nar-bundles/nifi-mongodb-bundle/nifi-mongodb-processors/src/test/java/org/apache/nifi/processors/mongodb/gridfs/DeleteGridFSIT.java
+++ b/nifi-nar-bundles/nifi-mongodb-bundle/nifi-mongodb-processors/src/test/java/org/apache/nifi/processors/mongodb/gridfs/DeleteGridFSIT.java
@@ -25,10 +25,10 @@
 import org.apache.nifi.util.TestRunner;
 import org.apache.nifi.util.TestRunners;
 import org.bson.types.ObjectId;
-import org.junit.After;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
 
 import java.util.HashMap;
 import java.util.List;
@@ -38,13 +38,13 @@
     private TestRunner runner;
     private static final String BUCKET = "delete_test_bucket";
 
-    @Before
+    @BeforeEach
     public void setup() throws Exception {
         runner = TestRunners.newTestRunner(DeleteGridFS.class);
         super.setup(runner, BUCKET, false);
     }
 
-    @After
+    @AfterEach
     public void tearDown() {
         super.tearDown();
     }
@@ -83,13 +83,13 @@
     private void testForQueryAttribute(String mustContain, String attrName) {
         List<MockFlowFile> flowFiles = runner.getFlowFilesForRelationship(DeleteGridFS.REL_SUCCESS);
         String attribute = flowFiles.get(0).getAttribute(attrName);
-        Assert.assertTrue(attribute.contains(mustContain));
+        Assertions.assertTrue(attribute.contains(mustContain));
     }
 
     private String setupTestFile() {
         String fileName = "simple-delete-test.txt";
         ObjectId id = writeTestFile(fileName, "Hello, world!", BUCKET, new HashMap<>());
-        Assert.assertNotNull(id);
+        Assertions.assertNotNull(id);
 
         return fileName;
     }
@@ -105,6 +105,6 @@
         runner.assertTransferCount(DeleteGridFS.REL_FAILURE, 0);
         runner.assertTransferCount(DeleteGridFS.REL_SUCCESS, 1);
 
-        Assert.assertFalse(String.format("File %s still exists.", fileName), fileExists(fileName, BUCKET));
+        Assertions.assertFalse(fileExists(fileName, BUCKET), String.format("File %s still exists.", fileName));
     }
 }
diff --git a/nifi-nar-bundles/nifi-mongodb-bundle/nifi-mongodb-processors/src/test/java/org/apache/nifi/processors/mongodb/gridfs/FetchGridFSIT.java b/nifi-nar-bundles/nifi-mongodb-bundle/nifi-mongodb-processors/src/test/java/org/apache/nifi/processors/mongodb/gridfs/FetchGridFSIT.java
index 5ce4ff3..8e285f0 100644
--- a/nifi-nar-bundles/nifi-mongodb-bundle/nifi-mongodb-processors/src/test/java/org/apache/nifi/processors/mongodb/gridfs/FetchGridFSIT.java
+++ b/nifi-nar-bundles/nifi-mongodb-bundle/nifi-mongodb-processors/src/test/java/org/apache/nifi/processors/mongodb/gridfs/FetchGridFSIT.java
@@ -26,10 +26,10 @@
 import org.apache.nifi.util.TestRunner;
 import org.apache.nifi.util.TestRunners;
 import org.bson.types.ObjectId;
-import org.junit.After;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
 
 import java.util.HashMap;
 import java.util.List;
@@ -40,13 +40,13 @@
 
     static final String BUCKET = "get_test_bucket";
 
-    @Before
+    @BeforeEach
     public void setup() throws Exception {
         runner = TestRunners.newTestRunner(FetchGridFS.class);
         super.setup(runner, BUCKET, false);
     }
 
-    @After
+    @AfterEach
     public void tearDown() {
         super.tearDown();
     }
@@ -56,7 +56,7 @@
         final String fileName = "get_by_name.txt";
         final String content  = "Hello, world";
         ObjectId id = writeTestFile(fileName, content, BUCKET, new HashMap<>());
-        Assert.assertNotNull(id);
+        Assertions.assertNotNull(id);
 
         String query = String.format("{\"filename\": \"%s\"}", fileName);
         runner.enqueue(query);
@@ -66,7 +66,7 @@
         runner.assertTransferCount(FetchGridFS.REL_SUCCESS, 1);
         List<MockFlowFile> flowFiles = runner.getFlowFilesForRelationship(FetchGridFS.REL_SUCCESS);
         byte[] rawData = runner.getContentAsByteArray(flowFiles.get(0));
-        Assert.assertEquals("Data did not match for the file", new String(rawData), content);
+        Assertions.assertEquals(new String(rawData), content, "Data did not match for the file");
 
         runner.clearTransferState();
         runner.setProperty(FetchGridFS.QUERY, query);
@@ -78,7 +78,7 @@
         runner.assertTransferCount(FetchGridFS.REL_SUCCESS, 1);
         flowFiles = runner.getFlowFilesForRelationship(FetchGridFS.REL_SUCCESS);
         rawData = runner.getContentAsByteArray(flowFiles.get(0));
-        Assert.assertEquals("Data did not match for the file", new String(rawData), content);
+        Assertions.assertEquals(new String(rawData), content, "Data did not match for the file");
     }
 
     @Test
@@ -87,7 +87,7 @@
         String content  = "Hello, world take %d";
         for (int index = 0; index < 5; index++) {
             ObjectId id = writeTestFile(String.format(baseName, index), String.format(content, index), BUCKET, new HashMap<>());
-            Assert.assertNotNull(id);
+            Assertions.assertNotNull(id);
         }
 
         AllowableValue[] values = new AllowableValue[] { QueryHelper.MODE_MANY_COMMITS, QueryHelper.MODE_ONE_COMMIT };
@@ -110,7 +110,7 @@
         final String fileName = "get_by_name.txt";
         final String content  = "Hello, world";
         ObjectId id = writeTestFile(fileName, content, BUCKET, new HashMap<>());
-        Assert.assertNotNull(id);
+        Assertions.assertNotNull(id);
 
         final String queryAttr = "gridfs.query.used";
         final Map<String, String> attrs = new HashMap<>();
@@ -125,15 +125,15 @@
         runner.assertTransferCount(FetchGridFS.REL_SUCCESS, 1);
         MockFlowFile mff = runner.getFlowFilesForRelationship(FetchGridFS.REL_SUCCESS).get(0);
         String attr = mff.getAttribute(queryAttr);
-        Assert.assertNotNull("Query attribute was null.", attr);
-        Assert.assertTrue("Wrong content.", attr.contains("filename"));
+        Assertions.assertNotNull("Query attribute was null.", attr);
+        Assertions.assertTrue(attr.contains("filename"), "Wrong content.");
 
         runner.clearTransferState();
 
         id = writeTestFile(fileName, content, BUCKET, new HashMap<String, Object>(){{
             put("lookupKey", "xyz");
         }});
-        Assert.assertNotNull(id);
+        Assertions.assertNotNull(id);
 
         String query = "{ \"metadata\": { \"lookupKey\": \"xyz\" }}";
 
@@ -146,8 +146,8 @@
         runner.assertTransferCount(FetchGridFS.REL_SUCCESS, 1);
         mff = runner.getFlowFilesForRelationship(FetchGridFS.REL_SUCCESS).get(0);
         attr = mff.getAttribute(queryAttr);
-        Assert.assertNotNull("Query attribute was null.", attr);
-        Assert.assertTrue("Wrong content.", attr.contains("metadata"));
+        Assertions.assertNotNull("Query attribute was null.", attr);
+        Assertions.assertTrue(attr.contains("metadata"), "Wrong content.");
     }
 
     @Test
@@ -176,7 +176,7 @@
         final String fileName = "get_by_name.txt";
         final String content  = "Hello, world";
         ObjectId id = writeTestFile(fileName, content, BUCKET, new HashMap<>());
-        Assert.assertNotNull(id);
+        Assertions.assertNotNull(id);
 
         runner.run();
         runner.assertTransferCount(FetchGridFS.REL_FAILURE, failure);
diff --git a/nifi-nar-bundles/nifi-mongodb-bundle/nifi-mongodb-processors/src/test/java/org/apache/nifi/processors/mongodb/gridfs/PutGridFSIT.java b/nifi-nar-bundles/nifi-mongodb-bundle/nifi-mongodb-processors/src/test/java/org/apache/nifi/processors/mongodb/gridfs/PutGridFSIT.java
index dfd7ae0..40a95f4 100644
--- a/nifi-nar-bundles/nifi-mongodb-bundle/nifi-mongodb-processors/src/test/java/org/apache/nifi/processors/mongodb/gridfs/PutGridFSIT.java
+++ b/nifi-nar-bundles/nifi-mongodb-bundle/nifi-mongodb-processors/src/test/java/org/apache/nifi/processors/mongodb/gridfs/PutGridFSIT.java
@@ -26,10 +26,10 @@
 import org.apache.nifi.util.TestRunner;
 import org.apache.nifi.util.TestRunners;
 import org.bson.Document;
-import org.junit.After;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
 
 import java.util.HashMap;
 import java.util.Map;
@@ -39,14 +39,14 @@
 
     static final String BUCKET = "put_test_bucket";
 
-    @Before
+    @BeforeEach
     public void setup() throws Exception {
         runner = TestRunners.newTestRunner(PutGridFS.class);
         runner.setProperty(PutGridFS.FILE_NAME, String.format("${%s}", CoreAttributes.FILENAME.key()));
         super.setup(runner, BUCKET);
     }
 
-    @After
+    @AfterEach
     public void tearDown() {
         super.tearDown();
     }
@@ -61,7 +61,7 @@
         runner.run();
         runner.assertAllFlowFilesTransferred(PutGridFS.REL_SUCCESS);
 
-        Assert.assertTrue("File does not exist", fileExists(fileName, BUCKET));
+        Assertions.assertTrue(fileExists(fileName, BUCKET), "File does not exist");
     }
 
     @Test
@@ -86,8 +86,8 @@
             put("department", "Accounting");
         }};
 
-        Assert.assertTrue("File does not exist", fileExists(fileName, BUCKET));
-        Assert.assertTrue("File is missing PARENT_PROPERTIES", fileHasProperties(fileName, BUCKET, attrs));
+        Assertions.assertTrue(fileExists(fileName, BUCKET), "File does not exist");
+        Assertions.assertTrue(fileHasProperties(fileName, BUCKET, attrs), "File is missing PARENT_PROPERTIES");
     }
 
     @Test
@@ -107,7 +107,7 @@
         MongoCollection files = client.getDatabase(DB).getCollection(bucketName);
         Document query = Document.parse(String.format("{\"filename\": \"%s\"}", fileName));
         long count = files.count(query);
-        Assert.assertTrue("Wrong count", count == 10);
+        Assertions.assertTrue(count == 10, "Wrong count");
     }
 
     @Test
diff --git a/nifi-nar-bundles/nifi-mongodb-bundle/nifi-mongodb-services/src/main/java/org/apache/nifi/mongodb/MongoDBLookupService.java b/nifi-nar-bundles/nifi-mongodb-bundle/nifi-mongodb-services/src/main/java/org/apache/nifi/mongodb/MongoDBLookupService.java
index be8aa89..d97c5de 100644
--- a/nifi-nar-bundles/nifi-mongodb-bundle/nifi-mongodb-services/src/main/java/org/apache/nifi/mongodb/MongoDBLookupService.java
+++ b/nifi-nar-bundles/nifi-mongodb-bundle/nifi-mongodb-services/src/main/java/org/apache/nifi/mongodb/MongoDBLookupService.java
@@ -31,7 +31,6 @@
 import org.apache.nifi.lookup.LookupService;
 import org.apache.nifi.processor.util.JsonValidator;
 import org.apache.nifi.processor.util.StandardValidators;
-import org.apache.nifi.schema.access.SchemaAccessUtils;
 import org.apache.nifi.serialization.JsonInferenceSchemaRegistryService;
 import org.apache.nifi.serialization.record.MapRecord;
 import org.apache.nifi.serialization.record.Record;
@@ -67,6 +66,10 @@
     "then the entire MongoDB result document minus the _id field will be returned as a record."
 )
 public class MongoDBLookupService extends JsonInferenceSchemaRegistryService implements LookupService<Object> {
+    public static final PropertyDescriptor LOCAL_SCHEMA_NAME = new PropertyDescriptor.Builder()
+            .fromPropertyDescriptor(SCHEMA_NAME)
+            .expressionLanguageSupported(ExpressionLanguageScope.VARIABLE_REGISTRY)
+            .build();
     private volatile String databaseName;
     private volatile String collection;
 
@@ -169,7 +172,7 @@
         this.lookupValueField = context.getProperty(LOOKUP_VALUE_FIELD).getValue();
         this.controllerService = context.getProperty(CONTROLLER_SERVICE).asControllerService(MongoDBClientService.class);
 
-        this.schemaNameProperty = context.getProperty(SchemaAccessUtils.SCHEMA_NAME).getValue();
+        this.schemaNameProperty = context.getProperty(LOCAL_SCHEMA_NAME).evaluateAttributeExpressions().getValue();
 
         this.databaseName = context.getProperty(DATABASE_NAME).evaluateAttributeExpressions().getValue();
         this.collection   = context.getProperty(COLLECTION_NAME).evaluateAttributeExpressions().getValue();
@@ -207,7 +210,7 @@
                 .build());
 
         _temp.add(SCHEMA_REGISTRY);
-        _temp.add(SCHEMA_NAME);
+        _temp.add(LOCAL_SCHEMA_NAME);
         _temp.add(SCHEMA_VERSION);
         _temp.add(SCHEMA_BRANCH_NAME);
         _temp.add(SCHEMA_TEXT);
diff --git a/nifi-nar-bundles/nifi-mongodb-bundle/nifi-mongodb-services/src/test/java/org/apache/nifi/mongodb/MongoDBControllerServiceIT.java b/nifi-nar-bundles/nifi-mongodb-bundle/nifi-mongodb-services/src/test/java/org/apache/nifi/mongodb/MongoDBControllerServiceIT.java
index cd306f9..32d4e86 100644
--- a/nifi-nar-bundles/nifi-mongodb-bundle/nifi-mongodb-services/src/test/java/org/apache/nifi/mongodb/MongoDBControllerServiceIT.java
+++ b/nifi-nar-bundles/nifi-mongodb-bundle/nifi-mongodb-services/src/test/java/org/apache/nifi/mongodb/MongoDBControllerServiceIT.java
@@ -19,9 +19,9 @@
 
 import org.apache.nifi.util.TestRunner;
 import org.apache.nifi.util.TestRunners;
-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 java.util.Calendar;
 
@@ -32,7 +32,7 @@
     private TestRunner runner;
     private MongoDBControllerService service;
 
-    @Before
+    @BeforeEach
     public void before() throws Exception {
         runner = TestRunners.newTestRunner(TestControllerServiceProcessor.class);
         service = new MongoDBControllerService();
@@ -41,7 +41,7 @@
         runner.enableControllerService(service);
     }
 
-    @After
+    @AfterEach
     public void after() throws Exception {
         service.onDisable();
     }
diff --git a/nifi-nar-bundles/nifi-mongodb-bundle/nifi-mongodb-services/src/test/java/org/apache/nifi/mongodb/MongoDBLookupServiceIT.java b/nifi-nar-bundles/nifi-mongodb-bundle/nifi-mongodb-services/src/test/java/org/apache/nifi/mongodb/MongoDBLookupServiceIT.java
index c3ae905..0944061 100644
--- a/nifi-nar-bundles/nifi-mongodb-bundle/nifi-mongodb-services/src/test/java/org/apache/nifi/mongodb/MongoDBLookupServiceIT.java
+++ b/nifi-nar-bundles/nifi-mongodb-bundle/nifi-mongodb-services/src/test/java/org/apache/nifi/mongodb/MongoDBLookupServiceIT.java
@@ -30,10 +30,10 @@
 import org.apache.nifi.util.TestRunner;
 import org.apache.nifi.util.TestRunners;
 import org.bson.Document;
-import org.junit.After;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
 
 import java.sql.Timestamp;
 import java.util.Arrays;
@@ -44,6 +44,9 @@
 import java.util.Map;
 import java.util.Optional;
 
+import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+
 public class MongoDBLookupServiceIT {
     private static final String DB_NAME = String.format("nifi_test-%d", Calendar.getInstance().getTimeInMillis());
     private static final String COL_NAME = String.format("nifi_test-%d", Calendar.getInstance().getTimeInMillis());
@@ -54,7 +57,7 @@
     private MongoDatabase db;
     private MongoCollection col;
 
-    @Before
+    @BeforeEach
     public void before() throws Exception {
         runner = TestRunners.newTestRunner(TestLookupServiceProcessor.class);
         service = new MongoDBLookupService();
@@ -79,7 +82,7 @@
         col = db.getCollection(COL_NAME);
     }
 
-    @After
+    @AfterEach
     public void after() {
         db.drop();
         controllerService.onDisable();
@@ -103,8 +106,8 @@
         criteria.put("uuid", "x-y-z");
         Optional result = service.lookup(criteria);
 
-        Assert.assertNotNull("The value was null.", result.get());
-        Assert.assertEquals("The value was wrong.", "Hello, world", result.get());
+        Assertions.assertNotNull(result.get(), "The value was null.");
+        Assertions.assertEquals("Hello, world", result.get(), "The value was wrong.");
 
         Map<String, Object> clean = new HashMap<>();
         clean.putAll(criteria);
@@ -113,10 +116,10 @@
         try {
             result = service.lookup(criteria);
         } catch (LookupFailureException ex) {
-            Assert.fail();
+            Assertions.fail();
         }
 
-        Assert.assertTrue(!result.isPresent());
+        Assertions.assertTrue(!result.isPresent());
     }
 
     @Test
@@ -133,23 +136,23 @@
         Map<String, String> context = new HashMap<>();
         context.put("schema.name", "user");
         Optional result = service.lookup(criteria, context);
-        Assert.assertTrue(result.isPresent());
-        Assert.assertNotNull(result.get());
+        Assertions.assertTrue(result.isPresent());
+        Assertions.assertNotNull(result.get());
         MapRecord record = (MapRecord)result.get();
 
-        Assert.assertEquals("john.smith", record.getAsString("username"));
-        Assert.assertEquals("testing1234", record.getAsString("password"));
+        Assertions.assertEquals("john.smith", record.getAsString("username"));
+        Assertions.assertEquals("testing1234", record.getAsString("password"));
 
         /*
          * Test falling back on schema detection if a user doesn't specify the context argument
          */
         result = service.lookup(criteria);
-        Assert.assertTrue(result.isPresent());
-        Assert.assertNotNull(result.get());
+        Assertions.assertTrue(result.isPresent());
+        Assertions.assertNotNull(result.get());
         record = (MapRecord)result.get();
 
-        Assert.assertEquals("john.smith", record.getAsString("username"));
-        Assert.assertEquals("testing1234", record.getAsString("password"));
+        Assertions.assertEquals("john.smith", record.getAsString("username"));
+        Assertions.assertEquals("testing1234", record.getAsString("password"));
     }
 
     @Test
@@ -172,8 +175,8 @@
         attrs.put("schema.text", new String(contents));
 
         Optional results = service.lookup(criteria, attrs);
-        Assert.assertNotNull(results);
-        Assert.assertTrue(results.isPresent());
+        Assertions.assertNotNull(results);
+        Assertions.assertTrue(results.isPresent());
     }
 
     @Test
@@ -204,23 +207,23 @@
         criteria.put("uuid", "x-y-z");
         Optional result = service.lookup(criteria);
 
-        Assert.assertNotNull("The value was null.", result.get());
-        Assert.assertTrue("The value was wrong.", result.get() instanceof MapRecord);
+        Assertions.assertNotNull(result.get(), "The value was null.");
+        Assertions.assertTrue(result.get() instanceof MapRecord, "The value was wrong.");
         MapRecord record = (MapRecord)result.get();
         RecordSchema subSchema = ((RecordDataType)record.getSchema().getField("subrecordField").get().getDataType()).getChildSchema();
 
-        Assert.assertEquals("The value was wrong.", "Hello, world", record.getValue("stringField"));
-        Assert.assertEquals("The value was wrong.", "x-y-z", record.getValue("uuid"));
-        Assert.assertEquals(new Long(10000), record.getValue("longField"));
-        Assert.assertEquals((Double.MAX_VALUE / 2.0), record.getValue("decimalField"));
-        Assert.assertEquals(d, record.getValue("dateField"));
-        Assert.assertEquals(ts.getTime(), ((Date)record.getValue("timestampField")).getTime());
+        Assertions.assertEquals("Hello, world", record.getValue("stringField"), "The value was wrong.");
+        Assertions.assertEquals("x-y-z", record.getValue("uuid"), "The value was wrong.");
+        Assertions.assertEquals(new Long(10000), record.getValue("longField"));
+        Assertions.assertEquals((Double.MAX_VALUE / 2.0), record.getValue("decimalField"));
+        Assertions.assertEquals(d, record.getValue("dateField"));
+        Assertions.assertEquals(ts.getTime(), ((Date)record.getValue("timestampField")).getTime());
 
         Record subRecord = record.getAsRecord("subrecordField", subSchema);
-        Assert.assertNotNull(subRecord);
-        Assert.assertEquals("test", subRecord.getValue("nestedString"));
-        Assert.assertEquals(new Long(1000), subRecord.getValue("nestedLong"));
-        Assert.assertEquals(list, record.getValue("arrayField"));
+        Assertions.assertNotNull(subRecord);
+        Assertions.assertEquals("test", subRecord.getValue("nestedString"));
+        Assertions.assertEquals(new Long(1000), subRecord.getValue("nestedLong"));
+        Assertions.assertEquals(list, record.getValue("arrayField"));
 
         Map<String, Object> clean = new HashMap<>();
         clean.putAll(criteria);
@@ -229,10 +232,10 @@
         try {
             result = service.lookup(criteria);
         } catch (LookupFailureException ex) {
-            Assert.fail();
+            Assertions.fail();
         }
 
-        Assert.assertTrue(!result.isPresent());
+        Assertions.assertTrue(!result.isPresent());
     }
 
     @Test
@@ -243,23 +246,8 @@
         Map<String, Object> criteria = new HashMap<>();
         criteria.put("uuid", "x-y-z");
 
-        boolean error = false;
-        try {
-            service.lookup(criteria);
-        } catch(Exception ex) {
-            error = true;
-        }
+        assertDoesNotThrow(() -> service.lookup(criteria));
 
-        Assert.assertFalse("An error was thrown when no error should have been thrown.", error);
-        error = false;
-
-        try {
-            service.lookup(new HashMap());
-        } catch (Exception ex) {
-            error = true;
-            Assert.assertTrue("The exception was the wrong type", ex instanceof LookupFailureException);
-        }
-
-        Assert.assertTrue("An error was not thrown when the input was empty", error);
+        assertThrows(LookupFailureException.class, () -> service.lookup(new HashMap<>()));
     }
 }
diff --git a/nifi-registry/nifi-registry-core/nifi-registry-test/pom.xml b/nifi-registry/nifi-registry-core/nifi-registry-test/pom.xml
index e5b1878..4ff4bc5 100644
--- a/nifi-registry/nifi-registry-core/nifi-registry-test/pom.xml
+++ b/nifi-registry/nifi-registry-core/nifi-registry-test/pom.xml
@@ -83,6 +83,7 @@
             <groupId>junit</groupId>
             <artifactId>junit</artifactId>
             <version>4.13.1</version>
+            <scope>compile</scope>
         </dependency>
     </dependencies>
 
diff --git a/nifi-registry/pom.xml b/nifi-registry/pom.xml
index 255286a..fdf9a12 100644
--- a/nifi-registry/pom.xml
+++ b/nifi-registry/pom.xml
@@ -43,7 +43,7 @@
         <flyway.version>6.5.7</flyway.version>
         <flyway.tests.version>6.4.0</flyway.tests.version>
         <swagger.ui.version>3.12.0</swagger.ui.version>
-        <testcontainers.version>1.15.1</testcontainers.version>
+        <testcontainers.version>1.16.0</testcontainers.version>
 	    <h2.version>1.4.199</h2.version>
         <groovy.eclipse.compiler.version>3.4.0-01</groovy.eclipse.compiler.version>
         <jaxb.version>2.3.2</jaxb.version>
diff --git a/pom.xml b/pom.xml
index 95df3fc..17dc60e 100644
--- a/pom.xml
+++ b/pom.xml
@@ -268,9 +268,17 @@
 
             <!-- These junit/mockito/groovy/spock/hamcrest dependencies are here to encourage consistent unit test library usage -->
             <dependency>
+                <groupId>org.junit</groupId>
+                <artifactId>junit-bom</artifactId>
+                <version>5.7.2</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+            <dependency>
                 <groupId>junit</groupId>
                 <artifactId>junit</artifactId>
                 <version>4.13.2</version>
+                <scope>test</scope>
             </dependency>
             <dependency>
                 <groupId>org.mockito</groupId>
@@ -455,8 +463,18 @@
 
     <dependencies>
         <dependency>
-            <groupId>junit</groupId>
-            <artifactId>junit</artifactId>
+            <groupId>org.junit.jupiter</groupId>
+            <artifactId>junit-jupiter-api</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.junit.jupiter</groupId>
+            <artifactId>junit-jupiter-engine</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.junit.vintage</groupId>
+            <artifactId>junit-vintage-engine</artifactId>
             <scope>test</scope>
         </dependency>
         <dependency>
@@ -525,14 +543,6 @@
                             -Duser.timezone=${user.timezone}
                             -Dfile.encoding=UTF-8</argLine>
                     </configuration>
-                    <dependencies>
-                        <dependency>
-                            <!-- Force surefire to use JUnit -->
-                            <groupId>org.apache.maven.surefire</groupId>
-                            <artifactId>surefire-junit4</artifactId>
-                            <version>${surefire.version}</version>
-                        </dependency>
-                    </dependencies>
                 </plugin>
                 <plugin>
                     <groupId>org.apache.maven.plugins</groupId>
