[java-idp-plugin-duo] 11/15: Switch the majority of tests to TestNG over JUnit.

Phil Smart philip.smart at jisc.ac.uk
Tue Jul 14 14:29:07 UTC 2020


This is an automated email from the git hooks/post-receive script.

philsmart pushed a commit to branch master
in repository java-idp-plugin-duo.

View the commit online:
http://git.shibboleth.net/view/?p=java-idp-plugin-duo.git;a=commit;h=d970aac960b70cab43988e5509c5ac7a31e4cba2

commit d970aac960b70cab43988e5509c5ac7a31e4cba2
Author: Phil Smart <philip.smart at jisc.ac.uk>
AuthorDate: Mon Jul 13 19:24:36 2020 +0100

    Switch the majority of tests to TestNG over JUnit.
---
 .../AbstractDuoClientAuthenticationActionTest.java | 28 +++++------
 .../idp/plugin/authn/duo/DuoOIDCPrincipalTest.java | 10 ++--
 .../authn/duo/impl/HealthCheckDuoOIDCAuthAPI.java  |  2 +-
 .../impl/AbstractAuthnXmlFlowExecutionTests.java   | 47 +++++++++---------
 .../authn/duo/impl/AbstractDuoActionTest.java      | 21 +++++---
 .../duo/impl/DefaultDuoOIDCClientRegistryTest.java | 39 ++++++++-------
 .../authn/duo/impl/DualDuoIntegrationStrategy.java |  4 +-
 .../plugin/authn/duo/impl/DuoAuthnFlowTest.java    | 56 +++++++++------------
 .../authn/duo/impl/DuoOIDCAuthnControllerTest.java | 57 +++++++++++++---------
 .../duo/impl/ExchangeCodeForDuoTokenTest.java      | 20 ++++----
 .../duo/impl/HealthCheckDuoOIDCAuthAPITest.java    | 20 +++-----
 .../impl/PopulateDuoAuthenticationContextTest.java | 18 +++----
 .../duo/impl/ValidateDuoResponseStateTest.java     | 24 +++++----
 .../duo/impl/ValidateDuoTokenAudienceTest.java     | 16 +++---
 .../ValidateDuoTokenAuthenticationResultTest.java  | 25 +++++-----
 .../ValidateDuoTokenAuthenticationTimeTest.java    | 53 ++++++++++++++------
 .../impl/ValidateDuoTokenExpirationTimeTest.java   | 38 ++++++++++-----
 .../duo/impl/ValidateDuoTokenIssuedAtTest.java     | 33 +++++++++----
 .../duo/impl/ValidateDuoTokenSubjectTest.java      | 26 +++++++---
 .../duo/sdk/impl/DuoSDKClientFactoryTest.java      | 18 ++++---
 pom.xml                                            | 44 ++++++++---------
 21 files changed, 331 insertions(+), 268 deletions(-)

diff --git a/idp-duo-api/src/test/java/net/shbboleth/idp/plugin/authn/duo/AbstractDuoClientAuthenticationActionTest.java b/idp-duo-api/src/test/java/net/shbboleth/idp/plugin/authn/duo/AbstractDuoClientAuthenticationActionTest.java
index 02becbd..3515e1d 100644
--- a/idp-duo-api/src/test/java/net/shbboleth/idp/plugin/authn/duo/AbstractDuoClientAuthenticationActionTest.java
+++ b/idp-duo-api/src/test/java/net/shbboleth/idp/plugin/authn/duo/AbstractDuoClientAuthenticationActionTest.java
@@ -16,20 +16,19 @@
  */
 package net.shbboleth.idp.plugin.authn.duo;
 
-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.Assert.assertEquals;
+import static org.testng.Assert.assertFalse;
+import static org.testng.Assert.assertThrows;
+import static org.testng.Assert.assertTrue;
 
 import javax.annotation.Nonnull;
 
-import org.junit.jupiter.api.Assertions;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.DisplayName;
-import org.junit.jupiter.api.Test;
 import org.mockito.Mockito;
 import org.opensaml.profile.context.EventContext;
 import org.opensaml.profile.context.ProfileRequestContext;
 import org.springframework.webflow.execution.RequestContext;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
 
 import net.shbboleth.idp.plugin.authn.duo.context.DuoOIDCAuthenticationContext;
 import net.shibboleth.idp.authn.AuthnEventIds;
@@ -64,7 +63,7 @@ public class AbstractDuoClientAuthenticationActionTest {
      * 
      * @throws ComponentInitializationException on error.
      */
-    @BeforeEach public void setup() throws ComponentInitializationException {
+    @BeforeMethod public void setup() throws ComponentInitializationException {
         action = new MockAbstractDuoAuthenticationAction();
         final DuoOIDCClientRegistry registry = Mockito.mock(DuoOIDCClientRegistry.class);
         action.setClientRegistry(registry);    
@@ -107,20 +106,19 @@ public class AbstractDuoClientAuthenticationActionTest {
 
     /** Test setting a null client registry.*/
     @Test 
-    @DisplayName("Test setting a null client registry") 
     public void testSetNullClientRegistry() {               
-        Assertions.assertThrows(ConstraintViolationException.class,() -> action.setClientRegistry(null));
+        assertThrows(ConstraintViolationException.class,() -> action.setClientRegistry(null));
     }
 
     /** Test setting a null duo context.*/
-    @Test @DisplayName("Test setting a null duo context")  
+    @Test 
     public void publictestSetNullDuoContextLookupStrategy() {     
-        Assertions.assertThrows(ConstraintViolationException.class,() -> 
+        assertThrows(ConstraintViolationException.class,() -> 
             action.setDuoContextLookupStrategy(null));
     }
     
     /** Test doPreExecute returns true, no failures.*/
-    @Test @DisplayName("Test doPreExecute returns true, no failures") 
+    @Test  
     public void testDoPreExecuteSuccess() throws ComponentInitializationException {
         addDuoContext();
         addDuoIntegration();
@@ -135,7 +133,7 @@ public class AbstractDuoClientAuthenticationActionTest {
      *  
      * @throws ComponentInitializationException on error.
      */
-    @Test @DisplayName("Test pre-execute without a duo context") 
+    @Test 
     public void testDoPreExecuteWithNoDuoContext() throws ComponentInitializationException {
         action.setDuoContextLookupStrategy(prc -> dc);
         action.initialize();
@@ -148,7 +146,7 @@ public class AbstractDuoClientAuthenticationActionTest {
      * 
      * @throws ComponentInitializationException
      */
-    @Test @DisplayName("Test pre-execute without a duo integration") 
+    @Test 
     public void testDoPreExecuteWithNoDuoIntegration() throws ComponentInitializationException {
         addDuoContext();
         action.setDuoContextLookupStrategy(prc -> dc);
diff --git a/idp-duo-api/src/test/java/net/shbboleth/idp/plugin/authn/duo/DuoOIDCPrincipalTest.java b/idp-duo-api/src/test/java/net/shbboleth/idp/plugin/authn/duo/DuoOIDCPrincipalTest.java
index 753f8af..4906920 100644
--- a/idp-duo-api/src/test/java/net/shbboleth/idp/plugin/authn/duo/DuoOIDCPrincipalTest.java
+++ b/idp-duo-api/src/test/java/net/shbboleth/idp/plugin/authn/duo/DuoOIDCPrincipalTest.java
@@ -1,9 +1,9 @@
 package net.shbboleth.idp.plugin.authn.duo;
 
-import static org.junit.jupiter.api.Assertions.*;
 
-import org.junit.jupiter.api.DisplayName;
-import org.junit.jupiter.api.Test;
+import static org.testng.Assert.assertEquals;
+
+import org.testng.annotations.Test;
 
 import net.shbboleth.idp.plugin.authn.duo.principal.DuoOIDCPrincipal;
 
@@ -17,7 +17,7 @@ public class DuoOIDCPrincipalTest {
      * 
      * @throws CloneNotSupportedException on error
      */
-    @Test @DisplayName("Test principal cloning")
+    @Test 
     public void testClone() throws CloneNotSupportedException {
         final String name = "jdoe";
         final DuoOIDCPrincipal principal = new DuoOIDCPrincipal(name);
@@ -30,7 +30,7 @@ public class DuoOIDCPrincipalTest {
      * 
      * @throws CloneNotSupportedException on error
      */
-    @Test @DisplayName("Test name is not mutable")
+    @Test 
     public void testImmutable() throws CloneNotSupportedException {
         final String name = "jdoe";
         final DuoOIDCPrincipal principal = new DuoOIDCPrincipal(name);
diff --git a/idp-duo-impl/src/main/java/net/shibboleth/idp/plugin/authn/duo/impl/HealthCheckDuoOIDCAuthAPI.java b/idp-duo-impl/src/main/java/net/shibboleth/idp/plugin/authn/duo/impl/HealthCheckDuoOIDCAuthAPI.java
index a0c27e1..450b449 100644
--- a/idp-duo-impl/src/main/java/net/shibboleth/idp/plugin/authn/duo/impl/HealthCheckDuoOIDCAuthAPI.java
+++ b/idp-duo-impl/src/main/java/net/shibboleth/idp/plugin/authn/duo/impl/HealthCheckDuoOIDCAuthAPI.java
@@ -85,7 +85,7 @@ public class HealthCheckDuoOIDCAuthAPI extends AbstractDuoClientAuthenticationAc
                         + "code '{}', message '{}', message detail '{}'",getLogPrefix(),
                         healthCheckResponse.getStatus(),healthCheckResponse.getCode(),
                         healthCheckResponse.getMessage(),healthCheckResponse.getMessageDetail());
-                throw new DuoClientException("Duo 2FA health check responded with a failure status"+
+                throw new DuoClientException("Duo 2FA health check responded with a failure status "+
                         healthCheckResponse.getMessage());
             
             } else {
diff --git a/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/AbstractAuthnXmlFlowExecutionTests.java b/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/AbstractAuthnXmlFlowExecutionTests.java
index 3ef6819..90da26d 100644
--- a/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/AbstractAuthnXmlFlowExecutionTests.java
+++ b/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/AbstractAuthnXmlFlowExecutionTests.java
@@ -21,12 +21,10 @@ import java.util.Base64;
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
-import java.util.Map.Entry;
 
 import javax.annotation.Nonnull;
 
-import org.junit.jupiter.api.Assertions;
-import org.junit.jupiter.api.BeforeEach;
+import org.junit.Before;
 import org.mockito.Mockito;
 import org.opensaml.core.config.ConfigurationService;
 import org.opensaml.core.metrics.FilteredMetricRegistry;
@@ -58,7 +56,6 @@ import com.codahale.metrics.MetricRegistry;
 import com.google.common.net.HttpHeaders;
 
 import net.shbboleth.idp.plugin.authn.duo.DuoOIDCClientFactory;
-import net.shbboleth.idp.plugin.authn.duo.DuoOIDCClientRegistry;
 import net.shibboleth.idp.authn.AuthenticationFlowDescriptor;
 import net.shibboleth.idp.authn.context.AuthenticationContext;
 import net.shibboleth.idp.authn.context.SubjectCanonicalizationContext;
@@ -82,6 +79,8 @@ import net.shibboleth.utilities.java.support.security.impl.SecureRandomIdentifie
  * the {@link ApplicationContext} created by {@link ContextConfiguration}  annotation processors. As a 
  * result, those bean configurations and environment variables need to be injected
  * inside {@link #configureFlowBuilderContext(MockFlowBuilderContext)}</p>
+ * 
+ * <p>Note, these test use JUnit, and work with the TestNG to JUnit bridge</p>
  */
 public abstract class AbstractAuthnXmlFlowExecutionTests extends AbstractXmlFlowExecutionTests{
     
@@ -130,7 +129,7 @@ public abstract class AbstractAuthnXmlFlowExecutionTests extends AbstractXmlFlow
      * @param testFlowModelResources the parent flows.
      */
     public void setFlowModelResources(@Nonnull final Map<String,String> testFlowModelResources) {
-        Assertions.assertNotNull(testFlowModelResources);        
+        assertNotNull(testFlowModelResources);        
         flowModelResources = testFlowModelResources;
     }
     
@@ -140,7 +139,7 @@ public abstract class AbstractAuthnXmlFlowExecutionTests extends AbstractXmlFlow
      * @param factory the Duo client factory.
      */
     public void setClientFactory(@Nonnull final DuoOIDCClientFactory factory) {
-        Assertions.assertNotNull(factory);
+        assertNotNull(factory);
         clientFactory = factory;
     }
     
@@ -150,7 +149,7 @@ public abstract class AbstractAuthnXmlFlowExecutionTests extends AbstractXmlFlow
      * @param testFlowPath the path to the file to test.
      */
     public void setFlowPath(@Nonnull @NotEmpty final String testFlowPath) {
-        Assertions.assertNotNull(testFlowPath);
+        assertNotNull(testFlowPath);
         flowPath = testFlowPath;
     }
     
@@ -160,7 +159,7 @@ public abstract class AbstractAuthnXmlFlowExecutionTests extends AbstractXmlFlow
      * @param properties
      */
     public void setMockProperties(@Nonnull final Map<String,String> properties) {
-        Assertions.assertNotNull(properties);
+        assertNotNull(properties);
         mockProperties = properties;
     }
     
@@ -170,7 +169,7 @@ public abstract class AbstractAuthnXmlFlowExecutionTests extends AbstractXmlFlow
      * @param mockSubflows the mock subflows.
      */
     public void setSubflows(@Nonnull @NonnullElements final List<Flow> mockSubflows) {
-        Assertions.assertNotNull(mockSubflows);
+        assertNotNull(mockSubflows);
         subflows = mockSubflows;
     }
     
@@ -182,8 +181,8 @@ public abstract class AbstractAuthnXmlFlowExecutionTests extends AbstractXmlFlow
      * @param password the password
      */
     public void addHttpBasicAuthHeader(@Nonnull final String username, @Nonnull final String password) {
-        Assertions.assertNotNull(username);
-        Assertions.assertNotNull(password);
+        assertNotNull(username);
+        assertNotNull(password);
         mockRequest.addHeader(HttpHeaders.AUTHORIZATION, "Basic "+ 
                 Base64.getEncoder().encodeToString((username+":"+password).getBytes()));        
     }
@@ -191,9 +190,7 @@ public abstract class AbstractAuthnXmlFlowExecutionTests extends AbstractXmlFlow
     /**
      * Setup the mock objects before each method.
      */
-    //TODO: should this be initialised once, or once before test?
-    @BeforeEach public void initializeMocks() {
-        log.info("Mocks are being created");
+    @Override public void setUp() {
         mockRequest = new MockHttpServletRequest();        
         mockResponse = new MockHttpServletResponse();
         externalContext = new MockExternalContext();
@@ -235,7 +232,7 @@ public abstract class AbstractAuthnXmlFlowExecutionTests extends AbstractXmlFlow
      * @param builderContext the builder context to register the subflows with.
      */
     private void registerMockSubflows(@Nonnull final MockFlowBuilderContext builderContext) {        
-        Assertions.assertNotNull(builderContext);       
+        assertNotNull(builderContext);       
         
         subflows.forEach(flow -> builderContext.registerSubflow(flow));        
     }
@@ -285,15 +282,15 @@ public abstract class AbstractAuthnXmlFlowExecutionTests extends AbstractXmlFlow
     private void addBeanDefinition(@Nonnull final MockFlowBuilderContext builderContext, 
             @Nonnull final String beanName, @Nonnull final BeanDefinition bean) {
         
-        Assertions.assertNotNull(builderContext);
-        Assertions.assertNotNull(beanName);
-        Assertions.assertNotNull(bean);
-        Assertions.assertTrue( builderContext.getApplicationContext() instanceof ConfigurableApplicationContext);
+        assertNotNull(builderContext);
+        assertNotNull(beanName);
+        assertNotNull(bean);
+        assertTrue( builderContext.getApplicationContext() instanceof ConfigurableApplicationContext);
         
         BeanFactory factory = ((ConfigurableApplicationContext) builderContext.getApplicationContext()).getBeanFactory();
         
-        Assertions.assertNotNull(factory);
-        Assertions.assertTrue(factory instanceof DefaultListableBeanFactory);
+        assertNotNull(factory);
+        assertTrue(factory instanceof DefaultListableBeanFactory);
         
         ((DefaultListableBeanFactory)factory).registerBeanDefinition(beanName, bean);;
         
@@ -307,10 +304,10 @@ public abstract class AbstractAuthnXmlFlowExecutionTests extends AbstractXmlFlow
      */
     private void registerMockPropertySource(@Nonnull final MockFlowBuilderContext builderContext) {
         
-        Assertions.assertNotNull(builderContext);
-        Assertions.assertNotNull(builderContext.getApplicationContext());
-        Assertions.assertNotNull(builderContext.getApplicationContext().getEnvironment());
-        Assertions.assertTrue(builderContext.getApplicationContext().getEnvironment() instanceof StandardEnvironment);
+        assertNotNull(builderContext);
+        assertNotNull(builderContext.getApplicationContext());
+        assertNotNull(builderContext.getApplicationContext().getEnvironment());
+        assertTrue(builderContext.getApplicationContext().getEnvironment() instanceof StandardEnvironment);
         
         final MockPropertySource mock = new MockPropertySource();
         
diff --git a/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/AbstractDuoActionTest.java b/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/AbstractDuoActionTest.java
index 517551c..cd17f97 100644
--- a/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/AbstractDuoActionTest.java
+++ b/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/AbstractDuoActionTest.java
@@ -19,6 +19,12 @@ package net.shibboleth.idp.plugin.authn.duo.impl;
 
 
 
+import org.testng.AssertJUnit;
+
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNotNull;
+import static org.testng.Assert.assertTrue;
+
 import java.time.Instant;
 
 import javax.annotation.Nonnull;
@@ -33,7 +39,6 @@ import org.springframework.webflow.execution.RequestContext;
 
 import com.codahale.metrics.MetricRegistry;
 
-import org.junit.jupiter.api.Assertions;
 
 import net.shbboleth.idp.plugin.authn.duo.DefaultDuoOIDCIntegration;
 import net.shbboleth.idp.plugin.authn.duo.context.DuoOIDCAuthenticationContext;
@@ -150,7 +155,7 @@ public abstract class AbstractDuoActionTest {
      * @param flowId the flow ID.
      */
     protected void addAttemptedFlow(@Nonnull final String flowId) {
-        Assertions.assertNotNull(flowId);
+        assertNotNull(flowId);
         final AuthenticationFlowDescriptor afd = new AuthenticationFlowDescriptor();
         afd.setId(flowId);
         ac.setAttemptedFlow(afd);
@@ -164,9 +169,9 @@ public abstract class AbstractDuoActionTest {
      */
     protected void assertEventIdFromProfileRequestContext(@Nonnull final String eventId) {
         final Object event = prc.getSubcontext(EventContext.class, true).getEvent();
-        Assertions.assertNotNull(event);
-        Assertions.assertTrue(event instanceof String,"Event is not a string is: "+event.getClass());
-        Assertions.assertEquals(eventId, (String)event);
+        assertNotNull(event);
+        assertTrue(event instanceof String,"Event is not a string is: "+event.getClass());
+        assertEquals(eventId, (String)event);
 
     }
     
@@ -177,8 +182,8 @@ public abstract class AbstractDuoActionTest {
      * @param eventId the ID to match.
      */
     protected void assertEventId(@Nullable final Event event, @Nonnull final String eventId) {
-        Assertions.assertNotNull(event);
-        Assertions.assertEquals(eventId, event.getId());  
+        assertNotNull(event);
+        assertEquals(eventId, event.getId());  
     }
     
     /** Add the Duo authentication context to the authentication context.*/
@@ -189,7 +194,7 @@ public abstract class AbstractDuoActionTest {
     
     /** Add fabricated duo integration to the duo context.*/
     protected void addDuoIntegrationToContext() {    
-        Assertions.assertNotNull(dc,"try addDuoContext() before adding the duo integration");
+        assertNotNull(dc,"try addDuoContext() before adding the duo integration");
         dc.setIntegration(createDummyDuoIntegration());
     }
     
diff --git a/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/DefaultDuoOIDCClientRegistryTest.java b/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/DefaultDuoOIDCClientRegistryTest.java
index 68c1d82..cae9c06 100644
--- a/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/DefaultDuoOIDCClientRegistryTest.java
+++ b/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/DefaultDuoOIDCClientRegistryTest.java
@@ -17,7 +17,10 @@
 
 package net.shibboleth.idp.plugin.authn.duo.impl;
 
-import static org.junit.jupiter.api.Assertions.*;
+
+
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNotSame;
 
 import java.util.ArrayList;
 import java.util.Collection;
@@ -26,11 +29,8 @@ import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 import java.util.concurrent.Future;
 
-import org.junit.jupiter.api.Assertions;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.DisplayName;
-import org.junit.jupiter.api.Test;
-import org.mockito.Mockito;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
 
 import net.shbboleth.idp.plugin.authn.duo.DefaultDuoOIDCIntegration;
 import net.shbboleth.idp.plugin.authn.duo.DuoOIDCClient;
@@ -47,14 +47,19 @@ public class DefaultDuoOIDCClientRegistryTest {
     /** The registry to test. */
     private DefaultDuoOIDCClientRegistry registry;
 
-    @BeforeEach
+    @BeforeMethod
     public void setUp() throws Exception {
         registry = new DefaultDuoOIDCClientRegistry();
         registry.setId("Test registry");
     }
 
+    /**
+     * Correct registration and caching of client integrations.
+     * 
+     * @throws DuoRegistryException on error
+     * @throws ComponentInitializationException on error.
+     */
     @Test
-    @DisplayName("Correct registration and caching of client integrations")
     public final void testCaching() throws DuoRegistryException, ComponentInitializationException {
 
         // needs a real mock to test proper caching.
@@ -72,7 +77,7 @@ public class DefaultDuoOIDCClientRegistryTest {
         final DuoOIDCClient client = registry.getIntegrationClientOrCreate(integ);
         final DuoOIDCClient clientTwo = registry.getIntegrationClientOrCreate(integ);
 
-        Assertions.assertEquals(client, clientTwo);
+        assertEquals(client, clientTwo);
 
         // set to a different value
         integ.setClientId("DIU6GEFWG5LIUBVV2M3B");
@@ -80,16 +85,16 @@ public class DefaultDuoOIDCClientRegistryTest {
         final DuoOIDCClient clientThree = registry.getIntegrationClientOrCreate(integ);
 
         System.out.println("Client: " + client + " Client2: " + clientTwo + " Client3: " + clientThree);
-        Assertions.assertNotSame(client, clientThree);
+        assertNotSame(client, clientThree);
     }
 
     /* Manually step debugging of the registry thread safety, works fine.*/
     //@Test
-    @DisplayName("Correct registration and caching of client integrations, thread safe")
-    public final void testThreadSafetyCaching() throws DuoRegistryException, ComponentInitializationException, InterruptedException, ExecutionException {
+    public final void testThreadSafetyCaching() throws DuoRegistryException, 
+            ComponentInitializationException, InterruptedException, ExecutionException {
 
         // needs a real mock to test proper caching.
-        MockDuoOIDCClientFactory_OK_Client factory = new MockDuoOIDCClientFactory_OK_Client();
+        final MockDuoOIDCClientFactory_OK_Client factory = new MockDuoOIDCClientFactory_OK_Client();
 
         registry.setClientFactory(factory);
         registry.initialize();
@@ -100,14 +105,14 @@ public class DefaultDuoOIDCClientRegistryTest {
         integ.setRedirectURI("http://localhost/");
         integ.setSecretKey("rFvDfPul27v3Wew2zb6xRPzAJewJ34MP2w8UitPh");
 
-        ExecutorService service = Executors.newFixedThreadPool(2);
-        Collection<Future<DuoOIDCClient>> futures = new ArrayList<>(2);
+        final ExecutorService service = Executors.newFixedThreadPool(2);
+        final Collection<Future<DuoOIDCClient>> futures = new ArrayList<>(2);
         for (int t = 0; t < 2; ++t) {
             
             futures.add(service.submit(()->registry.getIntegrationClientOrCreate(integ)));
         }
-        for (Future<DuoOIDCClient> f : futures) {
-            DuoOIDCClient client = f.get();
+        for (final Future<DuoOIDCClient> f : futures) {
+            final DuoOIDCClient client = f.get();
             System.out.println("client:"+client);
           }
      
diff --git a/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/DualDuoIntegrationStrategy.java b/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/DualDuoIntegrationStrategy.java
index e3663b4..1802130 100644
--- a/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/DualDuoIntegrationStrategy.java
+++ b/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/DualDuoIntegrationStrategy.java
@@ -17,9 +17,9 @@
 
 package net.shibboleth.idp.plugin.authn.duo.impl;
 
+import org.testng.Assert;
 import java.util.function.Function;
 
-import org.junit.jupiter.api.Assertions;
 import org.opensaml.profile.context.ProfileRequestContext;
 
 import net.shbboleth.idp.plugin.authn.duo.DefaultDuoOIDCIntegration;
@@ -54,7 +54,7 @@ public class DualDuoIntegrationStrategy implements Function<ProfileRequestContex
             return int2;
         }
         //fail if none chosen.
-        Assertions.fail();
+        Assert.fail();
         return null;
     }
 
diff --git a/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/DuoAuthnFlowTest.java b/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/DuoAuthnFlowTest.java
index ff60e29..22158fa 100644
--- a/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/DuoAuthnFlowTest.java
+++ b/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/DuoAuthnFlowTest.java
@@ -21,29 +21,20 @@ package net.shibboleth.idp.plugin.authn.duo.impl;
 import java.util.List;
 import java.util.Map;
 
-
 import javax.annotation.Nonnull;
 
-import org.junit.jupiter.api.Assertions;
-import org.junit.jupiter.api.DisplayName;
-import org.junit.jupiter.api.Test;
-import org.mockito.Mockito;
+import org.junit.Before;
+import org.junit.Test;
 import org.opensaml.profile.context.ProfileRequestContext;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.context.ConfigurableApplicationContext;
 import org.springframework.webflow.core.collection.LocalAttributeMap;
 import org.springframework.webflow.engine.Flow;
 import org.springframework.webflow.engine.impl.FlowExecutionImpl;
 import org.springframework.webflow.execution.FlowExecution;
 
 import net.shbboleth.idp.plugin.authn.duo.DefaultDuoOIDCIntegration;
-import net.shbboleth.idp.plugin.authn.duo.DuoClientException;
-import net.shbboleth.idp.plugin.authn.duo.DuoOIDCClient;
-import net.shbboleth.idp.plugin.authn.duo.DuoOIDCIntegration;
 import net.shbboleth.idp.plugin.authn.duo.context.DuoOIDCAuthenticationContext;
-import net.shbboleth.idp.plugin.authn.duo.model.DuoAuthToken;
-import net.shbboleth.idp.plugin.authn.duo.model.DuoHealthCheck;
 import net.shibboleth.idp.authn.context.AuthenticationContext;
 import net.shibboleth.idp.authn.context.SubjectCanonicalizationContext;
 import net.shibboleth.idp.plugin.authn.mock.MockDuoOIDCClientFactory_FAIL_Client;
@@ -52,10 +43,11 @@ import net.shibboleth.idp.plugin.authn.mock.MockFlowBuilder;
 import net.shibboleth.idp.profile.context.RelyingPartyContext;
 import net.shibboleth.utilities.java.support.annotation.constraint.NonnullElements;
 import net.shibboleth.utilities.java.support.annotation.constraint.Unmodifiable;
-import net.shibboleth.utilities.java.support.component.ComponentInitializationException;
 
 /**
  * Test the Duo 2FA flow using SWF flow testing.
+ * 
+ * <p>Note, these test use JUnit, and work with the TestNG to JUnit bridge</p>
  */
 public class DuoAuthnFlowTest extends AbstractAuthnXmlFlowExecutionTests {
     
@@ -99,10 +91,10 @@ public class DuoAuthnFlowTest extends AbstractAuthnXmlFlowExecutionTests {
             "/flows/authn/conditions/conditions-flow.xml","authn/conditions");
 
 
+
     /** Test the Duo flow when the health check returns unhealthy.*/
-    @Test @DisplayName("Test Duo 2FA flow where the Duo 2FA endpoint is unhealthy") 
+    @Test
     public void testDuoAuthnFlowDuoEndpointUnhealthy() {
-        
         setFlowPath(FLOW);
         setFlowModelResources(flowResources);
         setSubflows(subflows);
@@ -129,7 +121,7 @@ public class DuoAuthnFlowTest extends AbstractAuthnXmlFlowExecutionTests {
     }
     
     /** Test the Duo flow up to the external authorization request.*/
-    @Test @DisplayName("Test Duo 2FA flow up to the Duo 2FA authorization request") 
+    @Test
     public void testDuoAuthnFlowToAuthorizationRequest() {
         
         setFlowPath(FLOW);
@@ -160,8 +152,7 @@ public class DuoAuthnFlowTest extends AbstractAuthnXmlFlowExecutionTests {
     
     /** Test the Duo flow up to the external authorization request using the dynamically selected
      * first Duo integration.*/
-    @Test @DisplayName("Test Duo 2FA flow up to the Duo 2FA authorization "
-            + "request with multiple integrations, first") 
+    @Test
     public void testDuoAuthnFlowToAuthorizationRequestMultipleDuoIntegrationsFirst() {
         
         setFlowPath(FLOW);
@@ -192,20 +183,19 @@ public class DuoAuthnFlowTest extends AbstractAuthnXmlFlowExecutionTests {
         assertFlowExecutionActive();
         assertCurrentStateEquals("Duo2FAAuthorizationRequest");
         
-        Assertions.assertNotNull(prcOne.getSubcontext(AuthenticationContext.class));
-        Assertions.assertNotNull(prcOne.getSubcontext(AuthenticationContext.class).getSubcontext(
+        assertNotNull(prcOne.getSubcontext(AuthenticationContext.class));
+        assertNotNull(prcOne.getSubcontext(AuthenticationContext.class).getSubcontext(
                 DuoOIDCAuthenticationContext.class));
-        Assertions.assertNotNull(prcOne.getSubcontext(AuthenticationContext.class).getSubcontext(
+        assertNotNull(prcOne.getSubcontext(AuthenticationContext.class).getSubcontext(
                 DuoOIDCAuthenticationContext.class).getIntegration());
-        Assertions.assertEquals(FIRST_INTEGRATION_CLIENT_ID,prcOne.getSubcontext(AuthenticationContext.class)
+        assertEquals(FIRST_INTEGRATION_CLIENT_ID,prcOne.getSubcontext(AuthenticationContext.class)
                 .getSubcontext(DuoOIDCAuthenticationContext.class).getIntegration().getClientId());
 
     }
     
     /** Test the Duo flow up to the external authorization request using the dynamically selected
      * second Duo integration.*/
-    @Test @DisplayName("Test Duo 2FA flow up to the Duo 2FA authorization "
-            + "request with multiple integrations, second") 
+    @Test
     public void testDuoAuthnFlowToAuthorizationRequestMultipleDuoIntegrationsSecond() {
         
         setFlowPath(FLOW);
@@ -236,19 +226,19 @@ public class DuoAuthnFlowTest extends AbstractAuthnXmlFlowExecutionTests {
         assertFlowExecutionActive();
         assertCurrentStateEquals("Duo2FAAuthorizationRequest");
         
-        Assertions.assertNotNull(prcOne.getSubcontext(AuthenticationContext.class));
-        Assertions.assertNotNull(prcOne.getSubcontext(AuthenticationContext.class).getSubcontext(
+        assertNotNull(prcOne.getSubcontext(AuthenticationContext.class));
+        assertNotNull(prcOne.getSubcontext(AuthenticationContext.class).getSubcontext(
                 DuoOIDCAuthenticationContext.class));
-        Assertions.assertNotNull(prcOne.getSubcontext(AuthenticationContext.class).getSubcontext(
+        assertNotNull(prcOne.getSubcontext(AuthenticationContext.class).getSubcontext(
                 DuoOIDCAuthenticationContext.class).getIntegration());
-        Assertions.assertEquals(SECOND_INTEGRATION_CLIENT_ID,prcOne.getSubcontext(AuthenticationContext.class)
+        assertEquals(SECOND_INTEGRATION_CLIENT_ID,prcOne.getSubcontext(AuthenticationContext.class)
                 .getSubcontext(DuoOIDCAuthenticationContext.class).getIntegration().getClientId());
 
     }
     
    
     /** Test the Duo flow from the external authorization request to the end of the flow.*/
-    @Test @DisplayName("Test Duo 2FA flow from (not including) authorization callback") 
+    @Test 
     public void testDuoAuthnFlowFromAuthorizationCallback() {
         
         setFlowPath(FLOW);
@@ -289,14 +279,14 @@ public class DuoAuthnFlowTest extends AbstractAuthnXmlFlowExecutionTests {
         
         //assert success conditions
         assertFlowExecutionEnded();
-        Assertions.assertNotNull(prc.getSubcontext(AuthenticationContext.class));
-        Assertions.assertNotNull(prc.getSubcontext(AuthenticationContext.class).
+        assertNotNull(prc.getSubcontext(AuthenticationContext.class));
+        assertNotNull(prc.getSubcontext(AuthenticationContext.class).
                 getSubcontext(DuoOIDCAuthenticationContext.class));
         final DuoOIDCAuthenticationContext contextFromPrc = prc.getSubcontext(AuthenticationContext.class).
                 getSubcontext(DuoOIDCAuthenticationContext.class);
-        Assertions.assertNotNull(contextFromPrc.getAuthToken());
-        Assertions.assertNotNull(prc.getSubcontext(SubjectCanonicalizationContext.class));
-        Assertions.assertEquals(prc.getSubcontext(SubjectCanonicalizationContext.class).getPrincipalName(),"jdoe");
+        assertNotNull(contextFromPrc.getAuthToken());
+        assertNotNull(prc.getSubcontext(SubjectCanonicalizationContext.class));
+        assertEquals(prc.getSubcontext(SubjectCanonicalizationContext.class).getPrincipalName(),"jdoe");
         
     }
     
diff --git a/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/DuoOIDCAuthnControllerTest.java b/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/DuoOIDCAuthnControllerTest.java
index 037bd5c..be460f7 100644
--- a/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/DuoOIDCAuthnControllerTest.java
+++ b/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/DuoOIDCAuthnControllerTest.java
@@ -20,14 +20,14 @@ package net.shibboleth.idp.plugin.authn.duo.impl;
 import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
 import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
 import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNotNull;
+import static org.testng.Assert.assertThrows;
+import static org.testng.Assert.assertTrue;
 
 import javax.annotation.Nonnull;
 import javax.servlet.ServletContext;
 
-import org.junit.jupiter.api.Assertions;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.ExtendWith;
 import org.mockito.Mockito;
 import org.opensaml.profile.action.EventIds;
 import org.opensaml.profile.context.ProfileRequestContext;
@@ -38,12 +38,14 @@ import org.springframework.mock.web.MockHttpSession;
 import org.springframework.test.context.ContextConfiguration;
 import org.springframework.test.context.TestPropertySource;
 import org.springframework.test.context.junit.jupiter.SpringExtension;
+import org.springframework.test.context.testng.AbstractTestNGSpringContextTests;
 import org.springframework.test.context.web.WebAppConfiguration;
 import org.springframework.test.web.servlet.MockMvc;
 import org.springframework.test.web.servlet.MvcResult;
 import org.springframework.test.web.servlet.setup.MockMvcBuilders;
 import org.springframework.web.context.WebApplicationContext;
 import org.springframework.web.context.support.ServletContextAttributeExporter;
+import org.springframework.web.servlet.config.annotation.EnableWebMvc;
 import org.springframework.web.util.NestedServletException;
 import org.springframework.webflow.core.collection.LocalAttributeMap;
 import org.springframework.webflow.core.collection.MutableAttributeMap;
@@ -51,6 +53,8 @@ import org.springframework.webflow.execution.FlowExecution;
 import org.springframework.webflow.execution.repository.FlowExecutionRepository;
 import org.springframework.webflow.execution.repository.support.CompositeFlowExecutionKey;
 import org.springframework.webflow.executor.FlowExecutorImpl;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
 
 import net.shbboleth.idp.plugin.authn.duo.DefaultDuoOIDCIntegration;
 import net.shbboleth.idp.plugin.authn.duo.context.DuoOIDCAuthenticationContext;
@@ -70,11 +74,10 @@ import net.shibboleth.idp.ui.context.RelyingPartyUIContext;
 /**
  * Tests for the {@link DuoOIDCAuthnController}.
  */
- at ExtendWith(SpringExtension.class)
 @ContextConfiguration(classes = {DuoOIDCAuthnController.class, IdPPropertyConfigurer.class})
 @WebAppConfiguration
 @TestPropertySource(properties = {"idp.authn.duo.OIDC.externalAuthnPath=/Authn/Duo/2FA",})
-public class DuoOIDCAuthnControllerTest {
+public class DuoOIDCAuthnControllerTest extends AbstractTestNGSpringContextTests{
 
     /** Class logger. */
     @Nonnull private final Logger log = LoggerFactory.getLogger(DuoOIDCAuthnControllerTest.class);
@@ -96,12 +99,12 @@ public class DuoOIDCAuthnControllerTest {
      * 
      * @throws Exception on error.
      */
-    @BeforeEach
+    @BeforeMethod
     public void setUp() throws Exception {
         
         // check controller is instantiated.
         final DuoOIDCAuthnController controller = webApplicationContext.getBean(DuoOIDCAuthnController.class);        
-        Assertions.assertNotNull(controller);
+        assertNotNull(controller);
 
         // add a Duo client registry
         final DefaultDuoOIDCClientRegistry registry = new DefaultDuoOIDCClientRegistry();
@@ -128,7 +131,7 @@ public class DuoOIDCAuthnControllerTest {
         mockMvc.perform(get("/Authn/Duo/2FA/authorize").session(session).param("conversation", "e1s1")).andDo(print())
                 .andExpect(status().is3xxRedirection());
         //assert the key is in the session
-        Assertions.assertNotNull(session.getAttribute(DuoOIDCAuthnController.KEY_SESSION_ATTRIBUTE));
+        assertNotNull(session.getAttribute(DuoOIDCAuthnController.KEY_SESSION_ATTRIBUTE));
 
     }
 
@@ -154,8 +157,8 @@ public class DuoOIDCAuthnControllerTest {
         //check the duo context is populated correctly.
        
         DuoOIDCAuthenticationContext duoContext = extractDuoContext();
-        Assertions.assertEquals("db87f45083db5aea16eb45b7ace685c8",duoContext.getAuthorizationCode());
-        Assertions.assertEquals("8821febf7b3237fc3974f76a75f37e8c", duoContext.getResponseState());
+        assertEquals("db87f45083db5aea16eb45b7ace685c8",duoContext.getAuthorizationCode());
+        assertEquals("8821febf7b3237fc3974f76a75f37e8c", duoContext.getResponseState());
 
     }
     
@@ -181,9 +184,9 @@ public class DuoOIDCAuthnControllerTest {
                 andReturn();
         final Object extAuthErrorObject = result.getRequest().getAttribute(
                 ExternalAuthentication.AUTHENTICATION_ERROR_KEY);
-        Assertions.assertNotNull(extAuthErrorObject);
-        Assertions.assertTrue(extAuthErrorObject instanceof String);
-        Assertions.assertEquals(EventIds.INVALID_PROFILE_CTX, (String)extAuthErrorObject);
+        assertNotNull(extAuthErrorObject);
+        assertTrue(extAuthErrorObject instanceof String);
+        assertEquals(EventIds.INVALID_PROFILE_CTX, (String)extAuthErrorObject);
         
         
        
@@ -196,11 +199,14 @@ public class DuoOIDCAuthnControllerTest {
      */
     @Test
     public void testCallbackNoCode() throws Exception {
-        final Exception exception = Assertions.assertThrows(NestedServletException.class, () -> {
+       
+         try {   
             mockMvc.perform(get("/Authn/Duo/2FA/duo-callback").param("state",
                     "8821febf7b3237fc3974f76a75f37e8c")).andDo(print());
-        });
-        Assertions.assertTrue(exception.getCause() instanceof ExternalAuthenticationException); 
+         }  catch (final NestedServletException e) {
+             assertTrue(e.getCause() instanceof ExternalAuthenticationException);
+         }    
+        
     }
     
     /**
@@ -210,12 +216,15 @@ public class DuoOIDCAuthnControllerTest {
      */
     @Test
     public void testCallbackNoState() throws Exception {
-        final Exception exception = Assertions.assertThrows(NestedServletException.class, () -> {
+        try {            
             mockMvc.perform(get("/Authn/Duo/2FA/duo-callback").
                     param("code", "db87f45083db5aea16eb45b7ace685c8")).
             andDo(print());
-        });
-        Assertions.assertTrue(exception.getCause() instanceof ExternalAuthenticationException); 
+           
+        } catch (final NestedServletException e) {
+            assertTrue(e.getCause() instanceof ExternalAuthenticationException); 
+        }
+        
     }
 
     /**
@@ -293,7 +302,7 @@ public class DuoOIDCAuthnControllerTest {
      */
     private void removeDuoContext() {
         final Object flowExecutorObject = servletContext.getAttribute(ExternalAuthentication.SWF_KEY);
-        Assertions.assertTrue(flowExecutorObject instanceof FlowExecutorImpl);
+        assertTrue(flowExecutorObject instanceof FlowExecutorImpl);
         
         final Object prcObject = ((FlowExecutorImpl)flowExecutorObject).getExecutionRepository().
                 getFlowExecution(new CompositeFlowExecutionKey("1", "1")).
@@ -313,16 +322,16 @@ public class DuoOIDCAuthnControllerTest {
      */
     @Nonnull private DuoOIDCAuthenticationContext extractDuoContext() {
         final Object flowExecutorObject = servletContext.getAttribute(ExternalAuthentication.SWF_KEY);
-        Assertions.assertTrue(flowExecutorObject instanceof FlowExecutorImpl);
+        assertTrue(flowExecutorObject instanceof FlowExecutorImpl);
         
         final Object prcObject = ((FlowExecutorImpl)flowExecutorObject).getExecutionRepository().
                 getFlowExecution(new CompositeFlowExecutionKey("1", "1")).
                 getConversationScope().get(ProfileRequestContext.BINDING_KEY);
-        Assertions.assertTrue(prcObject instanceof ProfileRequestContext);
+        assertTrue(prcObject instanceof ProfileRequestContext);
        
         final DuoOIDCAuthenticationContext duoContext = ((ProfileRequestContext)prcObject).
                 getSubcontext(AuthenticationContext.class).getSubcontext(DuoOIDCAuthenticationContext.class);
-        Assertions.assertNotNull(duoContext);
+        assertNotNull(duoContext);
         
         return duoContext;
     }
diff --git a/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/ExchangeCodeForDuoTokenTest.java b/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/ExchangeCodeForDuoTokenTest.java
index c66501a..160f2c1 100644
--- a/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/ExchangeCodeForDuoTokenTest.java
+++ b/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/ExchangeCodeForDuoTokenTest.java
@@ -17,12 +17,10 @@
 
 package net.shibboleth.idp.plugin.authn.duo.impl;
 
-import static org.junit.jupiter.api.Assertions.*;
+import org.testng.annotations.Test;
+import org.testng.annotations.BeforeMethod;
+import org.testng.AssertJUnit;
 
-import org.junit.jupiter.api.Assertions;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.DisplayName;
-import org.junit.jupiter.api.Test;
 import org.mockito.Mockito;
 import org.springframework.webflow.execution.Event;
 
@@ -41,15 +39,15 @@ public class ExchangeCodeForDuoTokenTest extends AbstractDuoActionTest {
     /** The action to test. */
     private ExchangeCodeForDuoToken action;
 
-    @BeforeEach
+    @BeforeMethod
     public void setUp() throws Exception {
         super.setup();
         action = new ExchangeCodeForDuoToken();
 
     }
 
-    @Test
-    @DisplayName("Test ExchangeCodeForDuoToken executes succesfully")
+    /** Test ExchangeCodeForDuoToken executes successfully.*/
+    @Test    
     public void testExecuteSuccess() throws ComponentInitializationException, DuoRegistryException, DuoClientException {
         addDuoContext();
         addDuoIntegrationToContext();
@@ -63,11 +61,11 @@ public class ExchangeCodeForDuoTokenTest extends AbstractDuoActionTest {
         action.initialize();
         final Event event = action.execute(src);
         // success here is a null event
-        Assertions.assertNull(event);
+        AssertJUnit.assertNull(event);
     }
 
-    @Test
-    @DisplayName("Test ExchangeCodeForDuoToken with no authorization code")
+    /** Test ExchangeCodeForDuoToken with no authorization code.*/
+    @Test    
     public void testExecuteNoAuthCode()
             throws ComponentInitializationException, DuoRegistryException, DuoClientException {
         
diff --git a/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/HealthCheckDuoOIDCAuthAPITest.java b/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/HealthCheckDuoOIDCAuthAPITest.java
index 82210c8..3025f02 100644
--- a/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/HealthCheckDuoOIDCAuthAPITest.java
+++ b/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/HealthCheckDuoOIDCAuthAPITest.java
@@ -17,16 +17,12 @@
 
 package net.shibboleth.idp.plugin.authn.duo.impl;
 
-import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
+import static org.testng.Assert.assertNull;
 
-import org.junit.jupiter.api.Assertions;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.DisplayName;
-import org.junit.jupiter.api.Test;
 import org.mockito.Mockito;
-import org.opensaml.profile.action.EventIds;
 import org.springframework.webflow.execution.Event;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
 
 import net.shbboleth.idp.plugin.authn.duo.DuoClientException;
 import net.shbboleth.idp.plugin.authn.duo.DuoOIDCClientRegistry;
@@ -42,7 +38,7 @@ class HealthCheckDuoOIDCAuthAPITest extends AbstractDuoActionTest {
     /** The action to test. */
     private HealthCheckDuoOIDCAuthAPI healthCheckAction;
 
-    @BeforeEach
+    @BeforeMethod
     public void setUp() throws Exception {
         super.setup();
         healthCheckAction = new HealthCheckDuoOIDCAuthAPI();
@@ -50,7 +46,7 @@ class HealthCheckDuoOIDCAuthAPITest extends AbstractDuoActionTest {
     }
 
     /* Test for a healthy endpoint. */
-    @Test @DisplayName("Test for an OK health check")
+    @Test
     void testDoExecuteHealthy() throws DuoRegistryException, ComponentInitializationException, DuoClientException {
         addDuoContext();
         addDuoIntegrationToContext();
@@ -63,12 +59,12 @@ class HealthCheckDuoOIDCAuthAPITest extends AbstractDuoActionTest {
         healthCheckAction.initialize();
         final Event event = healthCheckAction.execute(src);
         // success here is a null event
-        Assertions.assertNull(event);
+        assertNull(event);
 
     }
 
     /* Test for an unhealthy endpoint. */
-    @Test @DisplayName("Test for an unhealthy/failed health check")
+    @Test
     void testDoExecuteUnHealthy() throws DuoRegistryException, ComponentInitializationException, DuoClientException {
         addDuoContext();
         addDuoIntegrationToContext();
@@ -86,7 +82,7 @@ class HealthCheckDuoOIDCAuthAPITest extends AbstractDuoActionTest {
     }
     
     /* Test for an unknown response from the health endpoint. */
-    @Test @DisplayName("Test for an unknown health check response")
+    @Test
     void testDoExecuteUnknown() throws DuoRegistryException, ComponentInitializationException, DuoClientException {
         addDuoContext();
         addDuoIntegrationToContext();
diff --git a/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/PopulateDuoAuthenticationContextTest.java b/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/PopulateDuoAuthenticationContextTest.java
index 8bd7f36..0a84012 100644
--- a/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/PopulateDuoAuthenticationContextTest.java
+++ b/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/PopulateDuoAuthenticationContextTest.java
@@ -17,12 +17,12 @@
 
 package net.shibboleth.idp.plugin.authn.duo.impl;
 
-import org.junit.jupiter.api.Assertions;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.DisplayName;
-import org.junit.jupiter.api.Test;
+import static org.testng.Assert.assertNull;
+
 import org.opensaml.profile.action.EventIds;
 import org.springframework.webflow.execution.Event;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
 
 import net.shbboleth.idp.plugin.authn.duo.DefaultDuoOIDCIntegration;
 import net.shibboleth.idp.authn.AuthnEventIds;
@@ -41,7 +41,7 @@ public class PopulateDuoAuthenticationContextTest extends AbstractDuoActionTest{
      * 
      * @throws Exception on exception.
      */
-    @BeforeEach public void setUp() throws Exception {
+    @BeforeMethod public void setUp() throws Exception {
         super.setup();
         action = new PopulateDuoAuthenticationContext();
 
@@ -52,7 +52,7 @@ public class PopulateDuoAuthenticationContextTest extends AbstractDuoActionTest{
      * 
      * @throws ComponentInitializationException on error.
      */
-    @Test @DisplayName("Test populate duo context execution, success")
+    @Test
     public void testExecuteSuccess() throws ComponentInitializationException {
         final DefaultDuoOIDCIntegration integ = createDummyDuoIntegration();
         //set the duo integration strategy to lookup this 
@@ -62,7 +62,7 @@ public class PopulateDuoAuthenticationContextTest extends AbstractDuoActionTest{
         action.initialize();
         final Event event = action.execute(src);
         //success here is a null event
-        Assertions.assertNull(event);
+        assertNull(event);
     }
     
     /**
@@ -70,7 +70,7 @@ public class PopulateDuoAuthenticationContextTest extends AbstractDuoActionTest{
      * 
      * @throws ComponentInitializationException on error.
      */
-    @Test @DisplayName("Test populate duo context, no Duo integration")
+    @Test
     public void testExecuteNoDuoIntegration() throws ComponentInitializationException {
         
         action.initialize();
@@ -84,7 +84,7 @@ public class PopulateDuoAuthenticationContextTest extends AbstractDuoActionTest{
      * 
      * @throws ComponentInitializationException on error.
      */
-    @Test @DisplayName("Test populate duo context, null username")
+    @Test
     public void testExecuteNullUsername() throws ComponentInitializationException {
         final DefaultDuoOIDCIntegration integ = createDummyDuoIntegration();
         //set the duo integration strategy to lookup this 
diff --git a/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/ValidateDuoResponseStateTest.java b/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/ValidateDuoResponseStateTest.java
index d6448a5..23a28f9 100644
--- a/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/ValidateDuoResponseStateTest.java
+++ b/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/ValidateDuoResponseStateTest.java
@@ -17,11 +17,11 @@
 
 package net.shibboleth.idp.plugin.authn.duo.impl;
 
-import org.junit.jupiter.api.Assertions;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.DisplayName;
-import org.junit.jupiter.api.Test;
+import static org.testng.Assert.assertNull;
+
 import org.springframework.webflow.execution.Event;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
 
 import net.shibboleth.idp.authn.AuthnEventIds;
 import net.shibboleth.utilities.java.support.component.ComponentInitializationException;
@@ -34,14 +34,15 @@ public class ValidateDuoResponseStateTest extends AbstractDuoActionTest{
     /** The action to test. */
     private ValidateDuoResponseState action;
 
-    @BeforeEach
+    @BeforeMethod
     public void setUp() throws Exception {
         super.setup();
         action = new ValidateDuoResponseState();
 
     }
 
-    @Test @DisplayName("Test Duo 2FA response validation, success.")
+    /** Test Duo 2FA response validation, success.*/
+    @Test 
     public void testExecuteSuccess() throws ComponentInitializationException {
         addDuoContext();
         addDuoIntegrationToContext();
@@ -52,10 +53,11 @@ public class ValidateDuoResponseStateTest extends AbstractDuoActionTest{
         action.initialize();
         final Event event = action.execute(src);
         //null event is success.
-        Assertions.assertNull(event);
+        assertNull(event);
     }
     
-    @Test @DisplayName("Test Duo 2FA response validation, no state in either request or response.")
+    /** Test Duo 2FA response validation, no state in either request or response.*/
+    @Test 
     public void testExecuteNoStateInRequestOrResponse() throws ComponentInitializationException {
         addDuoContext();
         addDuoIntegrationToContext();
@@ -65,7 +67,8 @@ public class ValidateDuoResponseStateTest extends AbstractDuoActionTest{
         assertEventId(event,AuthnEventIds.AUTHN_EXCEPTION);
     }
     
-    @Test @DisplayName("Test Duo 2FA response validation, no state in response.")
+    /** Test Duo 2FA response validation, no state in response. */
+    @Test 
     public void testExecuteNoStateInResponse() throws ComponentInitializationException {
         addDuoContext();
         addDuoIntegrationToContext();
@@ -76,7 +79,8 @@ public class ValidateDuoResponseStateTest extends AbstractDuoActionTest{
         assertEventId(event,AuthnEventIds.AUTHN_EXCEPTION);
     }
     
-    @Test @DisplayName("Test Duo 2FA response validation, no state in request.")
+    /** Test Duo 2FA response validation, no state in request.*/
+    @Test 
     public void testExecuteNoStateInRequest() throws ComponentInitializationException {
         addDuoContext();
         addDuoIntegrationToContext();
diff --git a/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/ValidateDuoTokenAudienceTest.java b/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/ValidateDuoTokenAudienceTest.java
index 8071fd4..90a6885 100644
--- a/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/ValidateDuoTokenAudienceTest.java
+++ b/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/ValidateDuoTokenAudienceTest.java
@@ -17,14 +17,14 @@
 
 package net.shibboleth.idp.plugin.authn.duo.impl;
 
+import static org.testng.Assert.assertNull;
+
 import java.time.Instant;
 import java.time.temporal.ChronoUnit;
 
-import org.junit.jupiter.api.Assertions;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.DisplayName;
-import org.junit.jupiter.api.Test;
 import org.springframework.webflow.execution.Event;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
 
 import net.shbboleth.idp.plugin.authn.duo.DuoOIDCAuthAPI;
 import net.shibboleth.idp.authn.AuthnEventIds;
@@ -38,15 +38,15 @@ public class ValidateDuoTokenAudienceTest extends AbstractDuoActionTest {
     /** The action to test. */
     private ValidateDuoTokenAudience action;
 
-    @BeforeEach
+    @BeforeMethod
     public void setUp() throws Exception {
         super.setup();
         action = new ValidateDuoTokenAudience();
 
     }
 
+    /** Test Duo 2FA token response audience validation, success.*/
     @Test
-    @DisplayName("Test Duo 2FA token response audience validation, success.")
     public final void testDoExecuteSuccess() throws ComponentInitializationException {
         addDuoContext();
         addDuoIntegrationToContext();
@@ -56,12 +56,12 @@ public class ValidateDuoTokenAudienceTest extends AbstractDuoActionTest {
         action.initialize();
         final Event event = action.execute(src);
         // null event is success.
-        Assertions.assertNull(event);
+        assertNull(event);
 
     }
     
+    /** Test Duo 2FA token response audience validation, wrong audience.*/
     @Test
-    @DisplayName("Test Duo 2FA token response audience validation, wrong audience.")
     public final void testDoExecuteWrongAudience() throws ComponentInitializationException {
         addDuoContext();
         addDuoIntegrationToContext();
diff --git a/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/ValidateDuoTokenAuthenticationResultTest.java b/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/ValidateDuoTokenAuthenticationResultTest.java
index eca9d9e..e725765 100644
--- a/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/ValidateDuoTokenAuthenticationResultTest.java
+++ b/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/ValidateDuoTokenAuthenticationResultTest.java
@@ -17,6 +17,8 @@
 
 package net.shibboleth.idp.plugin.authn.duo.impl;
 
+import static org.testng.Assert.assertNull;
+
 import java.time.Instant;
 import java.time.temporal.ChronoUnit;
 import java.util.Arrays;
@@ -24,11 +26,9 @@ import java.util.Collection;
 import java.util.HashMap;
 import java.util.Map;
 
-import org.junit.jupiter.api.Assertions;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.DisplayName;
-import org.junit.jupiter.api.Test;
 import org.springframework.webflow.execution.Event;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
 
 import net.shbboleth.idp.plugin.authn.duo.DuoOIDCAuthAPI;
 import net.shibboleth.idp.authn.AuthnEventIds;
@@ -42,7 +42,7 @@ public class ValidateDuoTokenAuthenticationResultTest extends AbstractDuoActionT
     /** The action to test. */
     private ValidateDuoTokenAuthenticationResult action;
 
-    @BeforeEach
+    @BeforeMethod
     public void setUp() throws Exception {
         super.setup();
         action = new ValidateDuoTokenAuthenticationResult();
@@ -56,7 +56,6 @@ public class ValidateDuoTokenAuthenticationResultTest extends AbstractDuoActionT
      * @throws ComponentInitializationException on error.
      */
     @Test
-    @DisplayName("Test validation of Duo 2FA token execution, success")
     public void testExecuteSuccess() throws ComponentInitializationException {
         addDuoContext();
         addDuoIntegrationToContext();
@@ -68,7 +67,7 @@ public class ValidateDuoTokenAuthenticationResultTest extends AbstractDuoActionT
         
         final Event event = action.execute(src);
         // success here is a null event
-        Assertions.assertNull(event);
+        assertNull(event);
     }
     
     /**
@@ -76,7 +75,7 @@ public class ValidateDuoTokenAuthenticationResultTest extends AbstractDuoActionT
      * 
      * @throws ComponentInitializationException on error.
      */
-    @Test @DisplayName("Test validation, no Duo Context")
+    @Test
     public void testNoDuoContext() throws ComponentInitializationException {
         addAttemptedFlow("authn/DuoOIDC");
         action.initialize();
@@ -86,11 +85,11 @@ public class ValidateDuoTokenAuthenticationResultTest extends AbstractDuoActionT
     }
     
     /**
-     * Test validation of a token whoes 2FA request was denied.
+     * Test validation of a token who's 2FA request was denied.
      * 
      * @throws ComponentInitializationException on error.
      */
-    @Test @DisplayName("Test validation of Duo 2FA token with classifed message, request denied")
+    @Test
     public void testExecuteRequestDenied() throws ComponentInitializationException {
         addDuoContext();
         addDuoIntegrationToContext();
@@ -115,7 +114,6 @@ public class ValidateDuoTokenAuthenticationResultTest extends AbstractDuoActionT
      * @throws ComponentInitializationException on error.
      */
     @Test
-    @DisplayName("Test validation of Duo 2FA token when the token is null")
     public void testExecuteNoDuoAuthToken() throws ComponentInitializationException {
         addDuoContext();
         addDuoIntegrationToContext();
@@ -130,13 +128,12 @@ public class ValidateDuoTokenAuthenticationResultTest extends AbstractDuoActionT
     
     /**
      * Test unsuccessful execution when the token specifies a 2FA failure. Note,
-     * this is unlikely to ever happen in practice, as failure is not reported back 
-     * to the IdP. 
+     * this is unlikely to ever happen in practice if using the native Duo client,
+     *  as failure is not reported back to the IdP. 
      * 
      * @throws ComponentInitializationException on error.
      */
     @Test
-    @DisplayName("Test validation of Duo 2FA token which has failed 2FA")
     public void testExecuteFailedToken() throws ComponentInitializationException {
         addDuoContext();
         addDuoIntegrationToContext();
diff --git a/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/ValidateDuoTokenAuthenticationTimeTest.java b/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/ValidateDuoTokenAuthenticationTimeTest.java
index 6a4738a..0af98a7 100644
--- a/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/ValidateDuoTokenAuthenticationTimeTest.java
+++ b/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/ValidateDuoTokenAuthenticationTimeTest.java
@@ -1,16 +1,16 @@
 package net.shibboleth.idp.plugin.authn.duo.impl;
 
-import static org.junit.jupiter.api.Assertions.*;
+
+import static org.testng.Assert.assertNull;
 
 import java.time.Duration;
 import java.time.Instant;
 import java.time.temporal.ChronoUnit;
 
-import org.junit.jupiter.api.Assertions;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.DisplayName;
-import org.junit.jupiter.api.Test;
+
 import org.springframework.webflow.execution.Event;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
 
 import net.shbboleth.idp.plugin.authn.duo.DuoOIDCAuthAPI;
 import net.shibboleth.idp.authn.AuthnEventIds;
@@ -24,15 +24,24 @@ public class ValidateDuoTokenAuthenticationTimeTest extends AbstractDuoActionTes
     /** The action to test. */
     private ValidateDuoTokenAuthenticationTime action;
 
-    @BeforeEach
+    /**
+     * Setup 
+     * 
+     * @throws Exception on error.
+     */
+    @BeforeMethod
     public void setUp() throws Exception {
         super.setup();
         action = new ValidateDuoTokenAuthenticationTime();
 
     }
 
+    /**
+     * Test Duo 2FA token response authentication time validation, success.
+     * 
+     * @throws ComponentInitializationException on error.
+     */
     @Test
-    @DisplayName("Test Duo 2FA token response authentication time validation, success.")
     public final void testDoExecuteSuccess() throws ComponentInitializationException {
         addDuoContext();
         addDuoIntegrationToContext();
@@ -45,12 +54,16 @@ public class ValidateDuoTokenAuthenticationTimeTest extends AbstractDuoActionTes
         action.initialize();
         final Event event = action.execute(src);
         // null event is success.
-        Assertions.assertNull(event);
+        assertNull(event);
 
     }
     
+    /**
+     * Test Duo 2FA token response authentication time validation, not forced auth. 
+     * 
+     * @throws ComponentInitializationException on error.
+     */
     @Test
-    @DisplayName("Test Duo 2FA token response authentication time validation, not forced auth.")
     public final void testDoExecuteSuccessNotForcedAuth() throws ComponentInitializationException {
         addDuoContext();
         addDuoIntegrationToContext();
@@ -63,12 +76,16 @@ public class ValidateDuoTokenAuthenticationTimeTest extends AbstractDuoActionTes
         action.initialize();
         final Event event = action.execute(src);
         // null event is success.
-        Assertions.assertNull(event);
+        assertNull(event);
 
     }
     
+    /** 
+     * Test Duo 2FA token response authentication time validation, outside window but not force authn.
+     * 
+     * @throws ComponentInitializationException on error.
+     */
     @Test
-    @DisplayName("Test Duo 2FA token response authentication time validation, outside window but not force authn.")
     public final void testDoExecuteSuccessOutsideLifetimeNotForcedAuthn() throws ComponentInitializationException {
         addDuoContext();
         addDuoIntegrationToContext();
@@ -81,12 +98,16 @@ public class ValidateDuoTokenAuthenticationTimeTest extends AbstractDuoActionTes
         action.initialize();
         final Event event = action.execute(src);
         // null event is success.
-        Assertions.assertNull(event);
+        assertNull(event);
 
     }
     
+    /**
+     * Test Duo 2FA token response authentication time validation, outside lifetime window.
+     * 
+     * @throws ComponentInitializationException on error.
+     */
     @Test
-    @DisplayName("Test Duo 2FA token response authentication time validation, outside lifetime window.")
     public final void testDoExecuteOutsideLifetime() throws ComponentInitializationException {
         addDuoContext();
         addDuoIntegrationToContext();
@@ -102,8 +123,12 @@ public class ValidateDuoTokenAuthenticationTimeTest extends AbstractDuoActionTes
 
     }
     
+    /**
+     * Test Duo 2FA token response authentication time validation, in the future.
+     * 
+     * @throws ComponentInitializationException on error.
+     */
     @Test
-    @DisplayName("Test Duo 2FA token response authentication time validation, in the future.")
     public final void testDoExecuteInTheFuture() throws ComponentInitializationException {
         addDuoContext();
         addDuoIntegrationToContext();
diff --git a/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/ValidateDuoTokenExpirationTimeTest.java b/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/ValidateDuoTokenExpirationTimeTest.java
index 111747e..4d54bcb 100644
--- a/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/ValidateDuoTokenExpirationTimeTest.java
+++ b/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/ValidateDuoTokenExpirationTimeTest.java
@@ -17,17 +17,15 @@
 
 package net.shibboleth.idp.plugin.authn.duo.impl;
 
-import static org.junit.jupiter.api.Assertions.*;
+import static org.testng.Assert.assertNull;
 
 import java.time.Duration;
 import java.time.Instant;
 import java.time.temporal.ChronoUnit;
 
-import org.junit.jupiter.api.Assertions;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.DisplayName;
-import org.junit.jupiter.api.Test;
 import org.springframework.webflow.execution.Event;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
 
 import net.shbboleth.idp.plugin.authn.duo.DuoOIDCAuthAPI;
 import net.shibboleth.idp.authn.AuthnEventIds;
@@ -39,7 +37,7 @@ public class ValidateDuoTokenExpirationTimeTest extends AbstractDuoActionTest {
     /** The action to test. */
     private ValidateDuoTokenExpirationTime action;
 
-    @BeforeEach
+    @BeforeMethod
     public void setUp() throws Exception {
         super.setup();
         action = new ValidateDuoTokenExpirationTime();
@@ -47,8 +45,12 @@ public class ValidateDuoTokenExpirationTimeTest extends AbstractDuoActionTest {
     }
 
 
+    /**
+     * Test Duo 2FA token response expiration time validation, success.
+     *  
+     * @throws ComponentInitializationException on error.
+     */
     @Test
-    @DisplayName("Test Duo 2FA token response expiration time validation, success.")
     public final void testDoExecuteSuccess() throws ComponentInitializationException {
         addDuoContext();
         addDuoIntegrationToContext();
@@ -58,12 +60,16 @@ public class ValidateDuoTokenExpirationTimeTest extends AbstractDuoActionTest {
         action.initialize();
         final Event event = action.execute(src);
         // null event is success.
-        Assertions.assertNull(event);
+        assertNull(event);
 
     }
     
+    /**
+     *  Test Duo 2FA token response expiration time validation, expired token.
+     *  
+     * @throws ComponentInitializationException on error.
+     */
     @Test
-    @DisplayName("Test Duo 2FA token response expiration time validation, expired token.")
     public final void testDoExecuteExpiredToken() throws ComponentInitializationException {
         addDuoContext();
         addDuoIntegrationToContext();
@@ -77,8 +83,12 @@ public class ValidateDuoTokenExpirationTimeTest extends AbstractDuoActionTest {
 
     }
     
+    /**
+     * Test Duo 2FA token response expiration time validation, within clock skew, success.
+     * 
+     * @throws ComponentInitializationException on error.
+     */
     @Test
-    @DisplayName("Test Duo 2FA token response expiration time validation, within clock skew, success.")
     public final void testDoExecuteWithinClockSkewSuccess() throws ComponentInitializationException {
         addDuoContext();
         addDuoIntegrationToContext();
@@ -92,12 +102,16 @@ public class ValidateDuoTokenExpirationTimeTest extends AbstractDuoActionTest {
         action.initialize();
         final Event event = action.execute(src);
         // null event is success.
-        Assertions.assertNull(event);
+        assertNull(event);
 
     }
     
+    /**
+     * Test Duo 2FA token response expiration time validation, set zero clock skew expired token.
+     * 
+     * @throws ComponentInitializationException on error.
+     */
     @Test
-    @DisplayName("Test Duo 2FA token response expiration time validation, set zero clock skew expired token.")
     public final void testDoExecuteSetZeroClockSkewExpiredToken() throws ComponentInitializationException {
         addDuoContext();
         addDuoIntegrationToContext();
diff --git a/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/ValidateDuoTokenIssuedAtTest.java b/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/ValidateDuoTokenIssuedAtTest.java
index af62bb0..9ab7f3d 100644
--- a/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/ValidateDuoTokenIssuedAtTest.java
+++ b/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/ValidateDuoTokenIssuedAtTest.java
@@ -16,17 +16,18 @@
  */
 package net.shibboleth.idp.plugin.authn.duo.impl;
 
-import static org.junit.jupiter.api.Assertions.*;
+
+
+import static org.testng.Assert.assertNull;
 
 import java.time.Duration;
 import java.time.Instant;
 import java.time.temporal.ChronoUnit;
 
-import org.junit.jupiter.api.Assertions;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.DisplayName;
-import org.junit.jupiter.api.Test;
+
 import org.springframework.webflow.execution.Event;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
 
 import net.shbboleth.idp.plugin.authn.duo.DuoOIDCAuthAPI;
 import net.shibboleth.idp.authn.AuthnEventIds;
@@ -41,15 +42,19 @@ public class ValidateDuoTokenIssuedAtTest extends AbstractDuoActionTest {
     /** The action to test. */
     private ValidateDuoTokenIssuedAt action;
 
-    @BeforeEach
+    @BeforeMethod
     public void setUp() throws Exception {
         super.setup();
         action = new ValidateDuoTokenIssuedAt();
 
     }
 
+    /**
+     * Test Duo 2FA token response token lifetime (issuedAt) validation, success.
+     * 
+     * @throws ComponentInitializationException on error.
+     */
     @Test
-    @DisplayName("Test Duo 2FA token response token lifetime (issuedAt) validation, success.")
     public final void testDoExecuteSuccess() throws ComponentInitializationException {
         addDuoContext();
         addDuoIntegrationToContext();
@@ -59,12 +64,16 @@ public class ValidateDuoTokenIssuedAtTest extends AbstractDuoActionTest {
         action.initialize();
         final Event event = action.execute(src);
         // null event is success.
-        Assertions.assertNull(event);
+        assertNull(event);
 
     }
     
+    /**
+     * Test Duo 2FA token response token lifetime (issuedAt) validation, to far in the past.
+     * 
+     * @throws ComponentInitializationException on error.
+     */
     @Test
-    @DisplayName("Test Duo 2FA token response token lifetime (issuedAt) validation, to far in the past.")
     public final void testDoExecuteToFarInThePast() throws ComponentInitializationException {
         addDuoContext();
         addDuoIntegrationToContext();
@@ -79,8 +88,12 @@ public class ValidateDuoTokenIssuedAtTest extends AbstractDuoActionTest {
 
     }
     
+    /** 
+     * Test Duo 2FA token response token lifetime (issuedAt) validation, to far in the future.
+     * 
+     * @throws ComponentInitializationException on error.
+     */
     @Test
-    @DisplayName("Test Duo 2FA token response token lifetime (issuedAt) validation, to far in the future.")
     public final void testDoExecuteToFarInTheFuture() throws ComponentInitializationException {
         addDuoContext();
         addDuoIntegrationToContext();
diff --git a/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/ValidateDuoTokenSubjectTest.java b/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/ValidateDuoTokenSubjectTest.java
index 7477391..0ae9b1b 100644
--- a/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/ValidateDuoTokenSubjectTest.java
+++ b/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/ValidateDuoTokenSubjectTest.java
@@ -17,14 +17,14 @@
 
 package net.shibboleth.idp.plugin.authn.duo.impl;
 
+import static org.testng.Assert.assertNull;
+
 import java.time.Instant;
 import java.time.temporal.ChronoUnit;
 
-import org.junit.jupiter.api.Assertions;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.DisplayName;
-import org.junit.jupiter.api.Test;
 import org.springframework.webflow.execution.Event;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
 
 import net.shbboleth.idp.plugin.authn.duo.DuoOIDCAuthAPI;
 import net.shibboleth.idp.authn.AuthnEventIds;
@@ -35,14 +35,19 @@ class ValidateDuoTokenSubjectTest extends AbstractDuoActionTest {
     /** The action to test. */
     private ValidateDuoTokenSubject action;
 
-    @BeforeEach
+    @BeforeMethod
     public void setUp() throws Exception {
         super.setup();
         action = new ValidateDuoTokenSubject();
 
     }
 
-    @Test @DisplayName("Test Duo 2FA token subject validation, success")
+    /** 
+     * Test Duo 2FA token subject validation, success.
+     * 
+     * @throws ComponentInitializationException on error.
+     */
+    @Test
     public final void testExecuteSuccesful() throws ComponentInitializationException {
         addDuoContext();
         addDuoIntegrationToContext();
@@ -53,10 +58,15 @@ class ValidateDuoTokenSubjectTest extends AbstractDuoActionTest {
         action.initialize();
         final Event event = action.execute(src);
         // null event is success.
-        Assertions.assertNull(event);
+        assertNull(event);
     }
     
-    @Test @DisplayName("Test Duo 2FA token subject validation, failure")
+    /** 
+     * Test Duo 2FA token subject validation, failure.
+     * 
+     * @throws ComponentInitializationException on error.
+     */
+    @Test
     public final void testExecuteInvalidSubject() throws ComponentInitializationException {
         addDuoContext();
         addDuoIntegrationToContext();
diff --git a/idp-duo-native-client-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/sdk/impl/DuoSDKClientFactoryTest.java b/idp-duo-native-client-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/sdk/impl/DuoSDKClientFactoryTest.java
index cd6eb84..8a3dd1b 100644
--- a/idp-duo-native-client-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/sdk/impl/DuoSDKClientFactoryTest.java
+++ b/idp-duo-native-client-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/sdk/impl/DuoSDKClientFactoryTest.java
@@ -1,12 +1,12 @@
 package net.shibboleth.idp.plugin.authn.duo.sdk.impl;
 
+import static org.testng.Assert.assertNotNull;
+
 import java.util.ArrayList;
 import java.util.List;
 
-import org.junit.jupiter.api.Assertions;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.DisplayName;
-import org.junit.jupiter.api.Test;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
 
 import net.shbboleth.idp.plugin.authn.duo.DefaultDuoOIDCIntegration;
 import net.shbboleth.idp.plugin.authn.duo.DuoClientException;
@@ -16,18 +16,20 @@ public class DuoSDKClientFactoryTest {
     
     private DuoSDKClientFactory factory;
 
-    @BeforeEach
+    @BeforeMethod
     public void setUp() throws Exception {
         factory = new DuoSDKClientFactory();
         
     }
 
-    @Test @DisplayName("Test succesful set of null CA certs")
+    /** Test succesful set of null CA certs.*/
+    @Test
     public final void testSetNullCaCerts() {
         factory.setCaCerts(null);
     }
     
-    @Test @DisplayName("Test succesful set of CA certs")
+    /** Test succesful set of CA certs.*/
+    @Test
     public final void testSetCaCerts() {
         final List<String> certs = new ArrayList<>();
         certs.add("sha256/I/Lt/z7ekCWanjD0Cvj5EqXls2lOaThEA0H2Bg4BT/o=");
@@ -44,7 +46,7 @@ public class DuoSDKClientFactoryTest {
         integ.setRedirectURI("http://localhost/");
         integ.setSecretKey("rFvDfPul27v3Wew2zb6xRPzAJewJ34MP2w8UitPh");
         DuoOIDCClient client = factory.createInstance(integ);
-        Assertions.assertNotNull(client);
+        assertNotNull(client);
     }
 
 }
diff --git a/pom.xml b/pom.xml
index 708eb74..f5561f5 100644
--- a/pom.xml
+++ b/pom.xml
@@ -15,6 +15,7 @@
         <maven.compiler.target>11</maven.compiler.target>
         <maven.compiler.release>11</maven.compiler.release>
         <shib.idp.version>4.1.0-SNAPSHOT</shib.idp.version>
+        <maven-jar-plugin.version>3.2.0</maven-jar-plugin.version>
         <opensaml.version>4.0.0</opensaml.version>
         <opensaml.groupId>org.opensaml</opensaml.groupId>
         <idp.groupId>net.shibboleth.idp</idp.groupId>
@@ -23,13 +24,14 @@
         <slf4j.groupId>org.slf4j</slf4j.groupId>
         <slf4j.version>1.7.30</slf4j.version>
         <spring.groupId>org.springframework</spring.groupId>
+        <maven-compiler-plugin.version>3.8.1</maven-compiler-plugin.version>
         <java-support.version>8.1.0-SNAPSHOT</java-support.version>
         <spring-webflow.groupId>org.springframework.webflow</spring-webflow.groupId>
         <spring-webflow.version>2.5.1.RELEASE</spring-webflow.version>
         <checkstyle.configLocation>${project.basedir}/../resources/checkstyle.xml</checkstyle.configLocation>
     </properties>
 
-    <!-- required for general project properties -->
+    <!-- required for general project properties. REMOVED THE PARENT because of surefire-testng conflict -->
 
     <parent>
         <groupId>net.shibboleth.idp</groupId>
@@ -173,13 +175,23 @@
             <artifactId>spring-test</artifactId>
         </dependency>
 
+        <!-- FIXME: change SWF to testng? -->
+        <!-- For compatibility with SWF flow tests -->
         <dependency>
-            <groupId>org.junit.jupiter</groupId>
-            <artifactId>junit-jupiter</artifactId>
-            <version>${junit.jupitar.version}</version>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <version>4.12</version>
             <scope>test</scope>
         </dependency>
 
+        <!-- Inline with the inherited IdP testNG for all tests
+        other than the flows tests  -->
+        <dependency>
+            <groupId>org.testng</groupId>
+            <artifactId>testng</artifactId>
+            <version>7.1.0</version>
+            <scope>test</scope>
+        </dependency>
 
         <dependency>
             <groupId>org.mockito</groupId>
@@ -188,9 +200,10 @@
         </dependency>
     </dependencies>
 
+
+
     <dependencyManagement>
         <dependencies>
-            <!-- REMOVE THESE -->
             <!-- IdP BOM when importing IdP deps TODO: this inherits properties from java-parent as well -->
             <dependency>
                 <groupId>net.shibboleth.idp</groupId>
@@ -210,6 +223,7 @@
             </dependency>
 
 
+
             <!-- Duo dependencies -->
             <dependency>
                 <groupId>com.duosecurity</groupId>
@@ -242,31 +256,17 @@
         </dependencies>
     </dependencyManagement>
 
+
     <build>
         <plugins>
             <plugin>
-                <!-- FIXME: Exclude testng tests, include junit -->
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-surefire-plugin</artifactId>
-                <configuration>
-                <properties>
-                    <property>
-                        <!-- stop the inherited testng surefire plugin
-                        from running junit tests and failing. -->
-                        <name>junit</name>
-                        <value>false</value>
-                    </property>
-                </properties>
-                </configuration>
-             
-            </plugin>
-            <plugin>
-                <groupId>org.codehaus.mojo</groupId>
-                <artifactId>license-maven-plugin</artifactId>
-                <version>2.0.0</version>
             </plugin>
 
         </plugins>
     </build>
 
+
+
 </project>

-- 
To stop receiving notification emails like this one, please contact
the administrator of this repository.


More information about the commits mailing list