diff --git a/oas-core/src/test/java/com/apigee/security/oas/extendedvalidator/ContactTraversalTest.java b/oas-core/src/test/java/com/apigee/security/oas/extendedvalidator/ContactTraversalTest.java
new file mode 100644
index 0000000..f6319bd
--- /dev/null
+++ b/oas-core/src/test/java/com/apigee/security/oas/extendedvalidator/ContactTraversalTest.java
@@ -0,0 +1,53 @@
+package com.apigee.security.oas.extendedvalidator;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Mockito.when;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.google.common.collect.ImmutableList;
+import java.util.Map;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.mockito.Mock;
+import org.mockito.junit.MockitoJUnit;
+import org.mockito.junit.MockitoRule;
+import org.mockito.quality.Strictness;
+import org.openapi4j.parser.model.v3.Contact;
+
+public class ContactTraversalTest {
+
+  @Rule public final MockitoRule rule = MockitoJUnit.rule().strictness(Strictness.STRICT_STUBS);
+
+  @Mock private TraversalHelperFactory traversalHelperFactory;
+  @Mock private ExtensionFactory extensionFactory;
+  @Mock private Extension extension;
+  @Mock private Contact contact;
+
+  private ContactTraversal contactTraversal;
+
+  /** Sets up live and mocked instances for testing. */
+  @Before
+  public void setup() {
+    contactTraversal =
+        new ContactTraversal(traversalHelperFactory, extensionFactory, ImmutableList.of(), contact);
+  }
+
+  @Test
+  public void traverse_withExtensions_returnsGeneratedExtensions() {
+    when(contact.getExtensions()).thenReturn(Map.of("x-contact", ""));
+    when(extensionFactory.create(anyString(), any(JsonNode.class), any(ImmutableList.class)))
+        .thenReturn(extension);
+
+    assertThat(contactTraversal.traverse()).hasSize(1).containsOnlyOnce(extension);
+  }
+
+  @Test
+  public void traverse_withoutExtensions_returnsEmptyExtensionsImmutableList() {
+    when(contact.getExtensions()).thenReturn(Map.of());
+
+    assertThat(contactTraversal.traverse()).isEmpty();
+  }
+}
diff --git a/oas-core/src/test/java/com/apigee/security/oas/extendedvalidator/ExternalDocsTraversalTest.java b/oas-core/src/test/java/com/apigee/security/oas/extendedvalidator/ExternalDocsTraversalTest.java
new file mode 100644
index 0000000..03cdba7
--- /dev/null
+++ b/oas-core/src/test/java/com/apigee/security/oas/extendedvalidator/ExternalDocsTraversalTest.java
@@ -0,0 +1,54 @@
+package com.apigee.security.oas.extendedvalidator;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Mockito.when;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.google.common.collect.ImmutableList;
+import java.util.Map;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.mockito.Mock;
+import org.mockito.junit.MockitoJUnit;
+import org.mockito.junit.MockitoRule;
+import org.mockito.quality.Strictness;
+import org.openapi4j.parser.model.v3.ExternalDocs;
+
+public class ExternalDocsTraversalTest {
+
+  @Rule public final MockitoRule rule = MockitoJUnit.rule().strictness(Strictness.STRICT_STUBS);
+
+  @Mock private TraversalHelperFactory traversalHelperFactory;
+  @Mock private ExtensionFactory extensionFactory;
+  @Mock private Extension extension;
+  @Mock private ExternalDocs externalDocs;
+
+  private ExternalDocsTraversal externalDocsTraversal;
+
+  /** Sets up live and mocked instances for testing. */
+  @Before
+  public void setup() {
+    externalDocsTraversal =
+        new ExternalDocsTraversal(
+            traversalHelperFactory, extensionFactory, externalDocs, ImmutableList.of());
+  }
+
+  @Test
+  public void traverse_withExtensions_returnsGeneratedExtensions() {
+    when(externalDocs.getExtensions()).thenReturn(Map.of("x-external-docs", ""));
+    when(extensionFactory.create(anyString(), any(JsonNode.class), any(ImmutableList.class)))
+        .thenReturn(extension);
+
+    assertThat(externalDocsTraversal.traverse()).hasSize(1).containsOnlyOnce(extension);
+  }
+
+  @Test
+  public void traverse_withoutExtensions_returnsEmptyExtensionsImmutableList() {
+    when(externalDocs.getExtensions()).thenReturn(Map.of());
+
+    assertThat(externalDocsTraversal.traverse()).isEmpty();
+  }
+}
diff --git a/oas-core/src/test/java/com/apigee/security/oas/extendedvalidator/LicenseTraversalTest.java b/oas-core/src/test/java/com/apigee/security/oas/extendedvalidator/LicenseTraversalTest.java
new file mode 100644
index 0000000..62db0c2
--- /dev/null
+++ b/oas-core/src/test/java/com/apigee/security/oas/extendedvalidator/LicenseTraversalTest.java
@@ -0,0 +1,53 @@
+package com.apigee.security.oas.extendedvalidator;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Mockito.when;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.google.common.collect.ImmutableList;
+import java.util.Map;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.mockito.Mock;
+import org.mockito.junit.MockitoJUnit;
+import org.mockito.junit.MockitoRule;
+import org.mockito.quality.Strictness;
+import org.openapi4j.parser.model.v3.License;
+
+public class LicenseTraversalTest {
+
+  @Rule public final MockitoRule rule = MockitoJUnit.rule().strictness(Strictness.STRICT_STUBS);
+
+  @Mock private TraversalHelperFactory traversalHelperFactory;
+  @Mock private ExtensionFactory extensionFactory;
+  @Mock private Extension extension;
+  @Mock private License license;
+
+  private LicenseTraversal licenseTraversal;
+
+  /** Sets up live and mocked instances for testing. */
+  @Before
+  public void setup() {
+    licenseTraversal =
+        new LicenseTraversal(traversalHelperFactory, extensionFactory, ImmutableList.of(), license);
+  }
+
+  @Test
+  public void traverse_withExtensions_returnsGeneratedExtensions() {
+    when(license.getExtensions()).thenReturn(Map.of("x-license", ""));
+    when(extensionFactory.create(anyString(), any(JsonNode.class), any(ImmutableList.class)))
+        .thenReturn(extension);
+
+    assertThat(licenseTraversal.traverse()).hasSize(1).containsOnlyOnce(extension);
+  }
+
+  @Test
+  public void traverse_withoutExtensions_returnsEmptyExtensionsImmutableList() {
+    when(license.getExtensions()).thenReturn(Map.of());
+
+    assertThat(licenseTraversal.traverse()).isEmpty();
+  }
+}
diff --git a/oas-core/src/test/java/com/apigee/security/oas/extendedvalidator/ParameterTraversalTest.java b/oas-core/src/test/java/com/apigee/security/oas/extendedvalidator/ParameterTraversalTest.java
new file mode 100644
index 0000000..c9bed83
--- /dev/null
+++ b/oas-core/src/test/java/com/apigee/security/oas/extendedvalidator/ParameterTraversalTest.java
@@ -0,0 +1,54 @@
+package com.apigee.security.oas.extendedvalidator;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Mockito.when;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.google.common.collect.ImmutableList;
+import java.util.Map;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.mockito.Mock;
+import org.mockito.junit.MockitoJUnit;
+import org.mockito.junit.MockitoRule;
+import org.mockito.quality.Strictness;
+import org.openapi4j.parser.model.v3.Parameter;
+
+public class ParameterTraversalTest {
+
+  @Rule public final MockitoRule rule = MockitoJUnit.rule().strictness(Strictness.STRICT_STUBS);
+
+  @Mock private TraversalHelperFactory traversalHelperFactory;
+  @Mock private ExtensionFactory extensionFactory;
+  @Mock private Extension extension;
+  @Mock private Parameter parameter;
+
+  private ParameterTraversal parameterTraversal;
+
+  /** Sets up live and mocked instances for testing. */
+  @Before
+  public void setup() {
+    parameterTraversal =
+        new ParameterTraversal(
+            traversalHelperFactory, extensionFactory, ImmutableList.of(), parameter);
+  }
+
+  @Test
+  public void traverse_withExtensions_returnsGeneratedExtensions() {
+    when(parameter.getExtensions()).thenReturn(Map.of("x-parameter", ""));
+    when(extensionFactory.create(anyString(), any(JsonNode.class), any(ImmutableList.class)))
+        .thenReturn(extension);
+
+    assertThat(parameterTraversal.traverse()).hasSize(1).containsOnlyOnce(extension);
+  }
+
+  @Test
+  public void traverse_withoutExtensions_returnsEmptyExtensionsImmutableList() {
+    when(parameter.getExtensions()).thenReturn(Map.of());
+
+    assertThat(parameterTraversal.traverse()).isEmpty();
+  }
+}
diff --git a/oas-core/src/test/java/com/apigee/security/oas/extendedvalidator/ResponseTraversalTest.java b/oas-core/src/test/java/com/apigee/security/oas/extendedvalidator/ResponseTraversalTest.java
new file mode 100644
index 0000000..1369c4d
--- /dev/null
+++ b/oas-core/src/test/java/com/apigee/security/oas/extendedvalidator/ResponseTraversalTest.java
@@ -0,0 +1,54 @@
+package com.apigee.security.oas.extendedvalidator;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Mockito.when;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.google.common.collect.ImmutableList;
+import java.util.Map;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.mockito.Mock;
+import org.mockito.junit.MockitoJUnit;
+import org.mockito.junit.MockitoRule;
+import org.mockito.quality.Strictness;
+import org.openapi4j.parser.model.v3.Response;
+
+public class ResponseTraversalTest {
+
+  @Rule public final MockitoRule rule = MockitoJUnit.rule().strictness(Strictness.STRICT_STUBS);
+
+  @Mock private TraversalHelperFactory traversalHelperFactory;
+  @Mock private ExtensionFactory extensionFactory;
+  @Mock private Extension extension;
+  @Mock private Response response;
+
+  private ResponseTraversal responseTraversal;
+
+  /** Sets up live and mocked instances for testing. */
+  @Before
+  public void setup() {
+    responseTraversal =
+        new ResponseTraversal(
+            traversalHelperFactory, extensionFactory, ImmutableList.of(), response, "");
+  }
+
+  @Test
+  public void traverse_withExtensions_returnsGeneratedExtensions() {
+    when(response.getExtensions()).thenReturn(Map.of("x-response", ""));
+    when(extensionFactory.create(anyString(), any(JsonNode.class), any(ImmutableList.class)))
+        .thenReturn(extension);
+
+    assertThat(responseTraversal.traverse()).hasSize(1).containsOnlyOnce(extension);
+  }
+
+  @Test
+  public void traverse_withoutExtensions_returnsEmptyExtensionsImmutableList() {
+    when(response.getExtensions()).thenReturn(Map.of());
+
+    assertThat(responseTraversal.traverse()).isEmpty();
+  }
+}
diff --git a/oas-core/src/test/java/com/apigee/security/oas/extendedvalidator/SecurityRequirementTraversalTest.java b/oas-core/src/test/java/com/apigee/security/oas/extendedvalidator/SecurityRequirementTraversalTest.java
new file mode 100644
index 0000000..86fc6ef
--- /dev/null
+++ b/oas-core/src/test/java/com/apigee/security/oas/extendedvalidator/SecurityRequirementTraversalTest.java
@@ -0,0 +1,22 @@
+package com.apigee.security.oas.extendedvalidator;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import org.junit.Rule;
+import org.junit.Test;
+import org.mockito.InjectMocks;
+import org.mockito.junit.MockitoJUnit;
+import org.mockito.junit.MockitoRule;
+import org.mockito.quality.Strictness;
+
+public class SecurityRequirementTraversalTest {
+
+  @Rule public final MockitoRule rule = MockitoJUnit.rule().strictness(Strictness.STRICT_STUBS);
+
+  @InjectMocks private SecurityRequirementTraversal securityRequirementTraversal;
+
+  @Test
+  public void traverse_returnsEmptyExtensionsImmutableList() {
+    assertThat(securityRequirementTraversal.traverse()).isEmpty();
+  }
+}
diff --git a/oas-core/src/test/java/com/apigee/security/oas/extendedvalidator/ServerVariableTraversalTest.java b/oas-core/src/test/java/com/apigee/security/oas/extendedvalidator/ServerVariableTraversalTest.java
new file mode 100644
index 0000000..4bd05b6
--- /dev/null
+++ b/oas-core/src/test/java/com/apigee/security/oas/extendedvalidator/ServerVariableTraversalTest.java
@@ -0,0 +1,54 @@
+package com.apigee.security.oas.extendedvalidator;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Mockito.when;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.google.common.collect.ImmutableList;
+import java.util.Map;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.mockito.Mock;
+import org.mockito.junit.MockitoJUnit;
+import org.mockito.junit.MockitoRule;
+import org.mockito.quality.Strictness;
+import org.openapi4j.parser.model.v3.ServerVariable;
+
+public class ServerVariableTraversalTest {
+
+  @Rule public final MockitoRule rule = MockitoJUnit.rule().strictness(Strictness.STRICT_STUBS);
+
+  @Mock private TraversalHelperFactory traversalHelperFactory;
+  @Mock private ExtensionFactory extensionFactory;
+  @Mock private Extension extension;
+  @Mock private ServerVariable serverVariable;
+
+  private ServerVariableTraversal serverVariableTraversal;
+
+  /** Sets up live and mocked instances for testing. */
+  @Before
+  public void setup() {
+    serverVariableTraversal =
+        new ServerVariableTraversal(
+            traversalHelperFactory, extensionFactory, ImmutableList.of(), serverVariable, "");
+  }
+
+  @Test
+  public void traverse_withExtensions_returnsGeneratedExtensions() {
+    when(serverVariable.getExtensions()).thenReturn(Map.of("x-serverVariable", ""));
+    when(extensionFactory.create(anyString(), any(JsonNode.class), any(ImmutableList.class)))
+        .thenReturn(extension);
+
+    assertThat(serverVariableTraversal.traverse()).hasSize(1).containsOnlyOnce(extension);
+  }
+
+  @Test
+  public void traverse_withoutExtensions_returnsEmptyExtensionsImmutableList() {
+    when(serverVariable.getExtensions()).thenReturn(Map.of());
+
+    assertThat(serverVariableTraversal.traverse()).isEmpty();
+  }
+}
