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

jamesbognar pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/juneau.git


The following commit(s) were added to refs/heads/master by this push:
     new 6bf6091e97 test: SonarCloud phase-6 test-quality cleanup 
(S8714/S5778/S2699 fixes + by-design suppressions); harden PetstoreJetty 
cold-start (flaky CI timeout); fix Web:S6827 empty Javadoc anchors
6bf6091e97 is described below

commit 6bf6091e9748361a267522e7da9d6c7a00d2929e
Author: James Bognar <[email protected]>
AuthorDate: Thu Jun 11 14:43:35 2026 -0400

    test: SonarCloud phase-6 test-quality cleanup (S8714/S5778/S2699 fixes + 
by-design suppressions); harden PetstoreJetty cold-start (flaky CI timeout); 
fix Web:S6827 empty Javadoc anchors
---
 .../java/org/apache/juneau/bean/atom/package.html  | 18 ++++--------
 .../org/apache/juneau/bean/html5/package2.html     | 12 +++-----
 .../juneau/assertions/ListAssertion_Test.java      |  6 +++-
 .../juneau/commons/bean/BeanMap_Coverage_Test.java | 18 ++++++++----
 .../commons/bean/BeanMeta_Coverage_Test.java       |  3 ++
 .../bean/BeanPropertyMeta_Coverage_Test.java       |  3 ++
 .../apache/juneau/commons/lang/Version_Test.java   | 11 ++------
 .../commons/utils/ResourceBundleUtils_Test.java    |  6 ++--
 .../juneau/commons/utils/StringUtils_Test.java     | 24 ++++++----------
 .../juneau/collections/MarshalledList_Test.java    | 10 ++++---
 .../juneau/collections/MarshalledMap_Test.java     |  3 +-
 .../juneau/http/remote/RrpcInterface_Test.java     | 13 ++-------
 .../rest/server/auth/oauth/OAuthFilter_Test.java   | 14 ++++------
 .../convention/BasicConvention_Builders_Test.java  |  6 +---
 ...iDocs_Springboot_MultiOpenApiProvider_Test.java |  9 ++----
 .../rest/server/mcp/McpHandlerDefaults_Test.java   | 12 +++-----
 .../rest/server/rrpc/RrpcRestOpSession_Test.java   | 12 +++-----
 .../resources/LogsResource_Action_Test.java        |  6 ++--
 .../juneau/petstore/service/PetStore_Test.java     |  4 +--
 .../juneau/petstore/jetty/PetstoreJetty_Test.java  | 32 ++++++++++++++++++++++
 .../apache/juneau/http/classic/BasicPart_Test.java |  6 +++-
 .../http/classic/resource/BasicResource_Test.java  |  6 ++--
 .../juneau/rest/mock/MockRestClient_Test.java      | 10 +++----
 .../rest/server/auth/oauth/OAuthFilter_Test.java   | 14 ++++------
 .../rest/server/mcp/McpHandlerDefaults_Test.java   | 12 +++-----
 ...iDocs_Springboot_MultiOpenApiProvider_Test.java |  9 ++----
 .../juneau/rest/server/view/jsp/JspView_Test.java  | 28 ++++++++++++-------
 27 files changed, 152 insertions(+), 155 deletions(-)

diff --git 
a/juneau-bean/juneau-bean-atom/src/main/java/org/apache/juneau/bean/atom/package.html
 
b/juneau-bean/juneau-bean-atom/src/main/java/org/apache/juneau/bean/atom/package.html
index 2dad90251f..8c09559652 100644
--- 
a/juneau-bean/juneau-bean-atom/src/main/java/org/apache/juneau/bean/atom/package.html
+++ 
b/juneau-bean/juneau-bean-atom/src/main/java/org/apache/juneau/bean/atom/package.html
@@ -33,8 +33,7 @@
 <p>ATOM Data Transfer Objects</p>
 
 <!-- 
========================================================================================================
 -->
-<a id="Overview"></a>
-<h2 class='topic'>1 - Overview</h2>
+<h2 id="Overview" class='topic'>1 - Overview</h2>
 <div class='topic'>
        <p>
                Juneau supports generation and consumption of ATOM feeds 
through the use of DTOs (Data Transfer Objects).
@@ -47,8 +46,7 @@
        
        
        <!-- 
========================================================================================================
 -->
-       <a id="Serialize"></a>
-       <h3 class='topic'>1.1 - Serializing ATOM feeds</h3>
+       <h3 id="Serialize" class='topic'>1.1 - Serializing ATOM feeds</h3>
        <div class='topic'>
                <p>
                        The Juneau ATOM feed DTOs are simply beans with 
fluent-style setters.
@@ -270,8 +268,7 @@
        
        
                <!-- 
========================================================================================================
 -->
-               <a id="AtomJson"></a>
-               <h4 class='topic'>1.1.1 - ATOM/JSON</h4>
+               <h4 id="AtomJson" class='topic'>1.1.1 - ATOM/JSON</h4>
                <div class='topic'>
                        <p>
                                The {@link 
org.apache.juneau.marshall.json.JsonSerializer} class can also be used to 
produce ATOM in JSON format.
@@ -368,8 +365,7 @@
                
 
                <!-- 
========================================================================================================
 -->
-               <a id="AtomRdfXml"></a>
-               <h4 class='topic'>1.1.2 - ATOM/RDF/XML</h4>
+               <h4 id="AtomRdfXml" class='topic'>1.1.2 - ATOM/RDF/XML</h4>
                <div class='topic'>
                        <p>
                                The {@link 
org.apache.juneau.marshall.jena.RdfSerializer} class and subclasses can also be 
used to produce ATOM 
@@ -489,8 +485,7 @@
                
                
                <!-- 
========================================================================================================
 -->
-               <a id="AtomHtml"></a>
-               <h4 class='topic'>1.1.3 - ATOM/HTML</h4>
+               <h4 id="AtomHtml" class='topic'>1.1.3 - ATOM/HTML</h4>
                <div class='topic'>
                        <p>
                                The {@link 
org.apache.juneau.marshall.html.HtmlSerializer} class can be used to produce 
ATOM in HTML format.
@@ -506,8 +501,7 @@
        
 
        <!-- 
========================================================================================================
 -->
-       <a id="Parse"></a>
-       <h3 class='topic'>1.2 - Parsing ATOM feeds</h3>
+       <h3 id="Parse" class='topic'>1.2 - Parsing ATOM feeds</h3>
        <div class='topic'>
                <p>
                        Use the {@link 
org.apache.juneau.marshall.xml.XmlParser} to convert ATOM/XML feeds back into 
their original POJOs:
diff --git 
a/juneau-bean/juneau-bean-html5/src/main/java/org/apache/juneau/bean/html5/package2.html
 
b/juneau-bean/juneau-bean-html5/src/main/java/org/apache/juneau/bean/html5/package2.html
index b02ac98a00..6b77966249 100644
--- 
a/juneau-bean/juneau-bean-html5/src/main/java/org/apache/juneau/bean/html5/package2.html
+++ 
b/juneau-bean/juneau-bean-html5/src/main/java/org/apache/juneau/bean/html5/package2.html
@@ -33,8 +33,7 @@
 <p>HTML5 Data Transfer Objects</p>
 
 <!-- 
========================================================================================================
 -->
-<a id="Overview"></a>
-<h2 class='topic'>1 - Overview</h2>
+<h2 id="Overview" class='topic'>1 - Overview</h2>
 <div class='topic'>
        <p>
                Juneau supports generation and consumption of HTML5 documents 
and fragments through the use of DTOs (Data 
@@ -44,8 +43,7 @@
        
        
        <!-- 
========================================================================================================
 -->
-       <a id="Serialize"></a>
-       <h3 class='topic'>1.1 - Generating HTML5</h3>
+       <h3 id="Serialize" class='topic'>1.1 - Generating HTML5</h3>
        <div class='topic'>
                <p>
                        The Juneau HTML5 DTOs are simply beans with 
fluent-style setters that allow you to quickly construct HTML
@@ -185,8 +183,7 @@
        </div>          
 
        <!-- 
========================================================================================================
 -->
-       <a id="Parse"></a>
-       <h3 class='topic'>1.2 - Parsing HTML5</h3>
+       <h3 id="Parse" class='topic'>1.2 - Parsing HTML5</h3>
        <div class='topic'>
                <p>
                        Use the {@link 
org.apache.juneau.marshall.html.HtmlParser} to convert HTML5 documents back 
into their original POJOs:
@@ -204,8 +201,7 @@
        </div>
 
        <!-- 
========================================================================================================
 -->
-       <a id="Templates"></a>
-       <h3 class='topic'>1.3 - HTML5 templates</h3>
+       <h3 id="Templates" class='topic'>1.3 - HTML5 templates</h3>
        <div class='topic'>
                <p>
                        If you're finding yourself reusing the same HTML5 DTO 
objects over and over that only differ slightly, 
diff --git 
a/juneau-core/juneau-assertions/src/test/java/org/apache/juneau/assertions/ListAssertion_Test.java
 
b/juneau-core/juneau-assertions/src/test/java/org/apache/juneau/assertions/ListAssertion_Test.java
index a2b7dc907e..b0f5b4d94e 100644
--- 
a/juneau-core/juneau-assertions/src/test/java/org/apache/juneau/assertions/ListAssertion_Test.java
+++ 
b/juneau-core/juneau-assertions/src/test/java/org/apache/juneau/assertions/ListAssertion_Test.java
@@ -198,7 +198,11 @@ class ListAssertion_Test extends TestBase {
                test(nil).asSublist(1,3).isNull();
        }
 
-       @Test void bd01_create_wStream() {
+       @Test
+       @SuppressWarnings({
+               "java:S2699" // Uses Juneau's custom fluent assertions 
(isHas/isNull), which Sonar doesn't recognize as assertions.
+       })
+       void bd01_create_wStream() {
                
ListAssertion.create(Stream.of("a","b")).setSilent().isHas("a","b");
                ListAssertion.create((Stream<String>)null).setSilent().isNull();
        }
diff --git 
a/juneau-core/juneau-commons/src/test/java/org/apache/juneau/commons/bean/BeanMap_Coverage_Test.java
 
b/juneau-core/juneau-commons/src/test/java/org/apache/juneau/commons/bean/BeanMap_Coverage_Test.java
index f22702f8ff..0dc71160ad 100644
--- 
a/juneau-core/juneau-commons/src/test/java/org/apache/juneau/commons/bean/BeanMap_Coverage_Test.java
+++ 
b/juneau-core/juneau-commons/src/test/java/org/apache/juneau/commons/bean/BeanMap_Coverage_Test.java
@@ -257,12 +257,15 @@ class BeanMap_Coverage_Test extends TestBase {
                var c = new C_DynaPojo();
                var bm = BeanMap.of(c);
                // "unknownProp" is not a declared field.  If WithDynaField 
recognizes the dyna property, this should
-               // route to the dyna setter.  If not, it throws.  Either way, 
exercise that code path.
-               try {
-                       bm.put("unknownDynaKey", "value");
-               } catch (BeanRuntimeException expected) {
-                       // Either the dyna property is not recognized on the 
commons path (throws) or it is (no throw).
-               }
+               // route to the dyna setter.  If not, it throws 
BeanRuntimeException.  Either outcome is acceptable;
+               // assert that no other exception type escapes the put() dyna 
branch.
+               assertDoesNotThrow(() -> {
+                       try {
+                               bm.put("unknownDynaKey", "value");
+                       } catch (BeanRuntimeException expected) {
+                               // Either the dyna property is not recognized 
on the commons path (throws) or it is (no throw).
+                       }
+               });
        }
 
        @Test
@@ -415,6 +418,9 @@ class BeanMap_Coverage_Test extends TestBase {
        }
 
        @Test
+       @SuppressWarnings({
+               "java:S3415" // Argument order is intentional: this test 
exercises BeanMap.equals() with a non-matching type, so the bean must be the 
receiver (first arg of assertNotEquals).
+       })
        void h03_equals_nonMap_returnsFalse() {
                var bm = BeanMap.of(new A_Pojo());
                assertNotEquals(bm, "not-a-map");
diff --git 
a/juneau-core/juneau-commons/src/test/java/org/apache/juneau/commons/bean/BeanMeta_Coverage_Test.java
 
b/juneau-core/juneau-commons/src/test/java/org/apache/juneau/commons/bean/BeanMeta_Coverage_Test.java
index 09f366b526..8d4ab2c933 100644
--- 
a/juneau-core/juneau-commons/src/test/java/org/apache/juneau/commons/bean/BeanMeta_Coverage_Test.java
+++ 
b/juneau-core/juneau-commons/src/test/java/org/apache/juneau/commons/bean/BeanMeta_Coverage_Test.java
@@ -140,6 +140,9 @@ class BeanMeta_Coverage_Test extends TestBase {
        }
 
        @Test
+       @SuppressWarnings({
+               "java:S3415" // Argument order is intentional: this test 
exercises BeanMeta.equals() with a non-matching type, so the bean must be the 
receiver (first arg of assertNotEquals).
+       })
        void a03_equals_nonBeanMeta_returnsFalse() {
                var b = BeanMeta.of(Plain.class);
                assertNotEquals(b, "not-a-bean-meta");
diff --git 
a/juneau-core/juneau-commons/src/test/java/org/apache/juneau/commons/bean/BeanPropertyMeta_Coverage_Test.java
 
b/juneau-core/juneau-commons/src/test/java/org/apache/juneau/commons/bean/BeanPropertyMeta_Coverage_Test.java
index 16ffde2730..47d9fcc92c 100644
--- 
a/juneau-core/juneau-commons/src/test/java/org/apache/juneau/commons/bean/BeanPropertyMeta_Coverage_Test.java
+++ 
b/juneau-core/juneau-commons/src/test/java/org/apache/juneau/commons/bean/BeanPropertyMeta_Coverage_Test.java
@@ -242,6 +242,9 @@ class BeanPropertyMeta_Coverage_Test extends TestBase {
        }
 
        @Test
+       @SuppressWarnings({
+               "java:S3415" // Argument order is intentional: this test 
exercises BeanPropertyMeta.equals() with a non-matching type, so the bean must 
be the receiver (first arg of assertNotEquals).
+       })
        void b03_equals_nonPropertyMeta_returnsFalse() {
                var bm = BeanMeta.of(Plain.class);
                var pm = bm.getPropertyMeta("x");
diff --git 
a/juneau-core/juneau-commons/src/test/java/org/apache/juneau/commons/lang/Version_Test.java
 
b/juneau-core/juneau-commons/src/test/java/org/apache/juneau/commons/lang/Version_Test.java
index 63eaf5865a..bc17df6db0 100644
--- 
a/juneau-core/juneau-commons/src/test/java/org/apache/juneau/commons/lang/Version_Test.java
+++ 
b/juneau-core/juneau-commons/src/test/java/org/apache/juneau/commons/lang/Version_Test.java
@@ -131,15 +131,8 @@ class Version_Test extends TestBase {
        void b02_equalsObject(String version1, String version2, boolean 
expectedEqual, boolean checkNull) {
                var v1 = of(version1);
                if (checkNull) {
-                       // equals(Object) should return false for null
-                       // The instanceof check should prevent any null access
-                       try {
-                               assertNotEquals(v1, (Object)null);
-                       } catch (NullPointerException e) {
-                               // If there's a bug in the implementation, 
we'll catch it here
-                               // But ideally this should not throw
-                               fail("equals(Object) should handle null without 
throwing NullPointerException");
-                       }
+                       // equals(Object) should return false for null without 
throwing.
+                       assertDoesNotThrow(() -> assertNotEquals(v1, 
(Object)null));
                } else {
                        var v2 = of(version2);
                        if (expectedEqual) {
diff --git 
a/juneau-core/juneau-commons/src/test/java/org/apache/juneau/commons/utils/ResourceBundleUtils_Test.java
 
b/juneau-core/juneau-commons/src/test/java/org/apache/juneau/commons/utils/ResourceBundleUtils_Test.java
index f643ca388b..7b66efb3a3 100644
--- 
a/juneau-core/juneau-commons/src/test/java/org/apache/juneau/commons/utils/ResourceBundleUtils_Test.java
+++ 
b/juneau-core/juneau-commons/src/test/java/org/apache/juneau/commons/utils/ResourceBundleUtils_Test.java
@@ -218,15 +218,13 @@ class ResourceBundleUtils_Test extends TestBase {
        void a19_findBundle_comparesWithDirectCall() {
                var loader = getClass().getClassLoader();
                // Compare behavior with direct ResourceBundle.getBundle call
-               try {
+               assertDoesNotThrow(() -> {
                        var direct = 
ResourceBundle.getBundle("org.apache.juneau.rest.server.NlsTest", 
Locale.getDefault(), loader);
                        var utils = 
ResourceBundleUtils.findBundle("org.apache.juneau.rest.server.NlsTest", 
Locale.getDefault(), loader);
                        assertNotNull(direct);
                        assertNotNull(utils);
                        assertEquals(direct.getString("key1"), 
utils.getString("key1"));
-               } catch (@SuppressWarnings("unused") MissingResourceException 
e) {
-                       fail("Direct call should not throw for existing 
bundle");
-               }
+               });
        }
 
        @Test
diff --git 
a/juneau-core/juneau-commons/src/test/java/org/apache/juneau/commons/utils/StringUtils_Test.java
 
b/juneau-core/juneau-commons/src/test/java/org/apache/juneau/commons/utils/StringUtils_Test.java
index 7da50a4473..470691a035 100755
--- 
a/juneau-core/juneau-commons/src/test/java/org/apache/juneau/commons/utils/StringUtils_Test.java
+++ 
b/juneau-core/juneau-commons/src/test/java/org/apache/juneau/commons/utils/StringUtils_Test.java
@@ -4987,38 +4987,32 @@ class StringUtils_Test extends TestBase {
                assertTrue(classStr.contains("String"));
 
                // Test Executable (Method) - triggers code path
-               try {
+               assertDoesNotThrow(() -> {
                        var method = String.class.getMethod("length");
                        var methodStr = readable(method);
                        assertNotNull(methodStr);
                        assertTrue(methodStr.contains("length"));
                        assertTrue(methodStr.contains("()"));
-               } catch (NoSuchMethodException e) {
-                       fail("Method not found");
-               }
+               });
 
                // Test Executable (Constructor) - triggers code path
-               try {
+               assertDoesNotThrow(() -> {
                        var constructor = 
String.class.getConstructor(String.class);
                        var constructorStr = readable(constructor);
                        assertNotNull(constructorStr);
                        assertTrue(constructorStr.contains("String"));
                        assertTrue(constructorStr.contains("("));
-               } catch (NoSuchMethodException e) {
-                       fail("Constructor not found");
-               }
+               });
 
                // Test Executable with parameters - triggers code path
-               try {
+               assertDoesNotThrow(() -> {
                        var method = String.class.getMethod("substring", 
int.class, int.class);
                        var methodStr = readable(method);
                        assertNotNull(methodStr);
                        assertTrue(methodStr.contains("substring"));
                        assertTrue(methodStr.contains("int"));
                        assertTrue(methodStr.contains(",")); // Multiple 
parameters
-               } catch (NoSuchMethodException e) {
-                       fail("Method not found");
-               }
+               });
 
                // Test ClassInfo - triggers new ClassInfo case
                var classInfo = 
org.apache.juneau.commons.reflect.ClassInfo.of(String.class);
@@ -5073,7 +5067,7 @@ class StringUtils_Test extends TestBase {
                }
 
                // Test Parameter (java.lang.reflect.Parameter) - triggers new 
Parameter case
-               try {
+               assertDoesNotThrow(() -> {
                        var method = String.class.getMethod("substring", 
int.class, int.class);
                        var parameters = method.getParameters();
                        if (parameters.length > 0) {
@@ -5083,9 +5077,7 @@ class StringUtils_Test extends TestBase {
                                // Just verify it's not empty and contains a 
bracket
                                assertFalse(paramStr.isEmpty());
                        }
-               } catch (NoSuchMethodException e) {
-                       fail("Method not found");
-               }
+               });
        }
 
        
//====================================================================================================
diff --git 
a/juneau-core/juneau-marshall/src/test/java/org/apache/juneau/collections/MarshalledList_Test.java
 
b/juneau-core/juneau-marshall/src/test/java/org/apache/juneau/collections/MarshalledList_Test.java
index 668cb776ec..5473ecc23d 100644
--- 
a/juneau-core/juneau-marshall/src/test/java/org/apache/juneau/collections/MarshalledList_Test.java
+++ 
b/juneau-core/juneau-marshall/src/test/java/org/apache/juneau/collections/MarshalledList_Test.java
@@ -131,15 +131,17 @@ class MarshalledList_Test extends TestBase {
        @Test void a11_unmodifiable() {
                var l = MarshalledList.of("a", "b", "c").unmodifiable();
                assertTrue(l.isUnmodifiable());
+               var listX = List.of("x");
+               var listA = List.of("a");
                assertThrows(UnsupportedOperationException.class, () -> 
l.add(0, "x"));
                assertThrows(UnsupportedOperationException.class, () -> 
l.add("x"));
                assertThrows(UnsupportedOperationException.class, () -> 
l.remove(0));
                assertThrows(UnsupportedOperationException.class, () -> 
l.remove("a"));
                assertThrows(UnsupportedOperationException.class, () -> 
l.set(0, "x"));
-               assertThrows(UnsupportedOperationException.class, () -> 
l.addAll(List.of("x")));
-               assertThrows(UnsupportedOperationException.class, () -> 
l.addAll(0, List.of("x")));
-               assertThrows(UnsupportedOperationException.class, () -> 
l.removeAll(List.of("a")));
-               assertThrows(UnsupportedOperationException.class, () -> 
l.retainAll(List.of("a")));
+               assertThrows(UnsupportedOperationException.class, () -> 
l.addAll(listX));
+               assertThrows(UnsupportedOperationException.class, () -> 
l.addAll(0, listX));
+               assertThrows(UnsupportedOperationException.class, () -> 
l.removeAll(listA));
+               assertThrows(UnsupportedOperationException.class, () -> 
l.retainAll(listA));
                assertThrows(UnsupportedOperationException.class, l::clear);
                assertThrows(UnsupportedOperationException.class, () -> 
l.addFirst("x"));
                assertThrows(UnsupportedOperationException.class, () -> 
l.addLast("x"));
diff --git 
a/juneau-core/juneau-marshall/src/test/java/org/apache/juneau/collections/MarshalledMap_Test.java
 
b/juneau-core/juneau-marshall/src/test/java/org/apache/juneau/collections/MarshalledMap_Test.java
index d7158e299a..4409bb099f 100644
--- 
a/juneau-core/juneau-marshall/src/test/java/org/apache/juneau/collections/MarshalledMap_Test.java
+++ 
b/juneau-core/juneau-marshall/src/test/java/org/apache/juneau/collections/MarshalledMap_Test.java
@@ -164,9 +164,10 @@ class MarshalledMap_Test extends TestBase {
        @Test void a14_unmodifiable() {
                var m = MarshalledMap.of("a", 1).unmodifiable();
                assertTrue(m.isUnmodifiable());
+               var mapB = Map.of("b", 2);
                assertThrows(UnsupportedOperationException.class, () -> 
m.put("b", 2));
                assertThrows(UnsupportedOperationException.class, () -> 
m.remove("a"));
-               assertThrows(UnsupportedOperationException.class, () -> 
m.putAll(Map.of("b", 2)));
+               assertThrows(UnsupportedOperationException.class, () -> 
m.putAll(mapB));
                assertThrows(UnsupportedOperationException.class, m::clear);
                assertThrows(UnsupportedOperationException.class, () -> 
m.putIfAbsent("b", 2));
                assertThrows(UnsupportedOperationException.class, () -> 
m.remove("a", 1));
diff --git 
a/juneau-integration-tests/src/test/java/org/apache/juneau/http/remote/RrpcInterface_Test.java
 
b/juneau-integration-tests/src/test/java/org/apache/juneau/http/remote/RrpcInterface_Test.java
index a809543a83..8dcda1f036 100644
--- 
a/juneau-integration-tests/src/test/java/org/apache/juneau/http/remote/RrpcInterface_Test.java
+++ 
b/juneau-integration-tests/src/test/java/org/apache/juneau/http/remote/RrpcInterface_Test.java
@@ -1324,21 +1324,14 @@ class RrpcInterface_Test extends TestBase {
        @ParameterizedTest
        @MethodSource("input")
        void g01_throwException1(Input input) {
-               try {
-                       input.proxy.throwException1();
-                       fail();
-               } catch (InterfaceProxy.InterfaceProxyException1 e) {
-                       assertEquals("foo",e.getMessage());
-               }
+               var e = 
assertThrows(InterfaceProxy.InterfaceProxyException1.class, () -> 
input.proxy.throwException1());
+               assertEquals("foo",e.getMessage());
        }
 
        @ParameterizedTest
        @MethodSource("input")
        void g02_throwException2(Input input) {
-               try {
-                       input.proxy.throwException2();
-                       fail();
-               } catch (InterfaceProxy.InterfaceProxyException2 e) {/*no-op*/}
+               assertThrows(InterfaceProxy.InterfaceProxyException2.class, () 
-> input.proxy.throwException2());
        }
 
        
//-----------------------------------------------------------------------------------------------------------------
diff --git 
a/juneau-integration-tests/src/test/java/org/apache/juneau/rest/server/auth/oauth/OAuthFilter_Test.java
 
b/juneau-integration-tests/src/test/java/org/apache/juneau/rest/server/auth/oauth/OAuthFilter_Test.java
index 3c9937b592..70d21c59ab 100644
--- 
a/juneau-integration-tests/src/test/java/org/apache/juneau/rest/server/auth/oauth/OAuthFilter_Test.java
+++ 
b/juneau-integration-tests/src/test/java/org/apache/juneau/rest/server/auth/oauth/OAuthFilter_Test.java
@@ -117,14 +117,10 @@ class OAuthFilter_Test extends TestBase {
        @Test void d02_builder_realmCustomization() throws Exception {
                TokenValidator v = token -> { throw new 
AuthenticationException("bad"); };
                var f = OAuthFilter.create().validator(v).realm("api2").build();
-               try {
-                       f.authenticate(req("Bearer x"));
-                       fail();
-               } catch (AuthenticationException e) {
-                       var hdr = e.getHeaders().stream()
-                               .filter(h -> 
"WWW-Authenticate".equalsIgnoreCase(h.getName()))
-                               .findFirst().orElseThrow();
-                       assertTrue(hdr.getValue().contains("api2"));
-               }
+               var e = assertThrows(AuthenticationException.class, () -> 
f.authenticate(req("Bearer x")));
+               var hdr = e.getHeaders().stream()
+                       .filter(h -> 
"WWW-Authenticate".equalsIgnoreCase(h.getName()))
+                       .findFirst().orElseThrow();
+               assertTrue(hdr.getValue().contains("api2"));
        }
 }
diff --git 
a/juneau-integration-tests/src/test/java/org/apache/juneau/rest/server/convention/BasicConvention_Builders_Test.java
 
b/juneau-integration-tests/src/test/java/org/apache/juneau/rest/server/convention/BasicConvention_Builders_Test.java
index 49fc009eeb..d2becd62a9 100644
--- 
a/juneau-integration-tests/src/test/java/org/apache/juneau/rest/server/convention/BasicConvention_Builders_Test.java
+++ 
b/juneau-integration-tests/src/test/java/org/apache/juneau/rest/server/convention/BasicConvention_Builders_Test.java
@@ -114,11 +114,7 @@ class BasicConvention_Builders_Test extends TestBase {
                        "daily",
                        1.0);
                var sw = new java.io.StringWriter();
-               try {
-                       e.write(sw);
-               } catch (IOException ex) {
-                       fail(ex);
-               }
+               assertDoesNotThrow(() -> e.write(sw));
                var xml = sw.toString();
                assertTrue(xml.contains("<lastmod>"), "lastmod present");
                assertTrue(xml.contains("<changefreq>daily</changefreq>"), 
"changefreq present");
diff --git 
a/juneau-integration-tests/src/test/java/org/apache/juneau/rest/server/docs/BasicApiDocs_Springboot_MultiOpenApiProvider_Test.java
 
b/juneau-integration-tests/src/test/java/org/apache/juneau/rest/server/docs/BasicApiDocs_Springboot_MultiOpenApiProvider_Test.java
index 5713be3ac9..84907f9192 100644
--- 
a/juneau-integration-tests/src/test/java/org/apache/juneau/rest/server/docs/BasicApiDocs_Springboot_MultiOpenApiProvider_Test.java
+++ 
b/juneau-integration-tests/src/test/java/org/apache/juneau/rest/server/docs/BasicApiDocs_Springboot_MultiOpenApiProvider_Test.java
@@ -151,16 +151,13 @@ class BasicApiDocs_Springboot_MultiOpenApiProvider_Test {
 
        @Test
        void 
a02_collidingProvidersFailContextLoadWithBeanDefinitionOverrideException() {
-               var ex = assertThrows(BeanDefinitionOverrideException.class, () 
-> {
-                       try (var ctx = new 
SpringApplicationBuilder(CollidingApp.class)
+               var ex = assertThrows(BeanDefinitionOverrideException.class, () 
->
+                       new SpringApplicationBuilder(CollidingApp.class)
                                .web(WebApplicationType.NONE)
                                .run(
                                        "--spring.main.banner-mode=off",
                                        
"--spring.main.allow-bean-definition-overriding=false"
-                               )) {
-                               fail("Expected context load to fail with 
BeanDefinitionOverrideException, but it loaded: " + ctx);
-                       }
-               });
+                               ).close());
 
                // Spring's exact message text drifts across versions, so we 
only assert the bean id appears
                // in the message — enough to confirm Spring caught the 
collision on the expected bean.
diff --git 
a/juneau-integration-tests/src/test/java/org/apache/juneau/rest/server/mcp/McpHandlerDefaults_Test.java
 
b/juneau-integration-tests/src/test/java/org/apache/juneau/rest/server/mcp/McpHandlerDefaults_Test.java
index 52c8d3c8b0..8941baa327 100644
--- 
a/juneau-integration-tests/src/test/java/org/apache/juneau/rest/server/mcp/McpHandlerDefaults_Test.java
+++ 
b/juneau-integration-tests/src/test/java/org/apache/juneau/rest/server/mcp/McpHandlerDefaults_Test.java
@@ -69,24 +69,20 @@ class McpHandlerDefaults_Test {
        void typedHandlers_constructor_isPrivate() {
                // Sanity: the static façade class should not be instantiable. 
Reflection trick used to bump coverage on the
                // implicit private no-arg constructor.
-               try {
+               assertDoesNotThrow(() -> {
                        var ctor = 
McpTypedHandlers.class.getDeclaredConstructor();
                        ctor.setAccessible(true);
                        assertNotNull(ctor.newInstance());
-               } catch (Exception e) {
-                       fail(e);
-               }
+               });
        }
 
        @Test
        void mcp_facade_constructor_isPrivate() {
-               try {
+               assertDoesNotThrow(() -> {
                        var ctor = Mcp.class.getDeclaredConstructor();
                        ctor.setAccessible(true);
                        assertNotNull(ctor.newInstance());
-               } catch (Exception e) {
-                       fail(e);
-               }
+               });
        }
 
        @Test
diff --git 
a/juneau-integration-tests/src/test/java/org/apache/juneau/rest/server/rrpc/RrpcRestOpSession_Test.java
 
b/juneau-integration-tests/src/test/java/org/apache/juneau/rest/server/rrpc/RrpcRestOpSession_Test.java
index 6bda7fcf9a..86e4cfe66b 100644
--- 
a/juneau-integration-tests/src/test/java/org/apache/juneau/rest/server/rrpc/RrpcRestOpSession_Test.java
+++ 
b/juneau-integration-tests/src/test/java/org/apache/juneau/rest/server/rrpc/RrpcRestOpSession_Test.java
@@ -31,22 +31,18 @@ class RrpcRestOpSession_Test extends TestBase {
                // The actual functionality is tested through integration tests.
 
                // Verify the method exists with correct return type via 
reflection
-               try {
+               assertDoesNotThrow(() -> {
                        var method = 
RrpcRestOpSession.class.getMethod("status", HttpStatusLine.class);
                        assertEquals(RrpcRestOpSession.class, 
method.getReturnType());
-               } catch (Exception e) {
-                       fail("Method status(HttpStatusLine) should exist and 
return RrpcRestOpSession");
-               }
+               });
        }
 
        @Test void a02_finish_fluentChaining() {
                // Test that finish() returns RrpcRestOpSession for fluent 
chaining
                // Verify the method exists with correct return type via 
reflection
-               try {
+               assertDoesNotThrow(() -> {
                        var method = 
RrpcRestOpSession.class.getMethod("finish");
                        assertEquals(RrpcRestOpSession.class, 
method.getReturnType());
-               } catch (Exception e) {
-                       fail("Method finish() should exist and return 
RrpcRestOpSession");
-               }
+               });
        }
 }
\ No newline at end of file
diff --git 
a/juneau-microservice/juneau-microservice/src/test/java/org/apache/juneau/microservice/resources/LogsResource_Action_Test.java
 
b/juneau-microservice/juneau-microservice/src/test/java/org/apache/juneau/microservice/resources/LogsResource_Action_Test.java
index a1fa8ec16f..07fbff68b0 100644
--- 
a/juneau-microservice/juneau-microservice/src/test/java/org/apache/juneau/microservice/resources/LogsResource_Action_Test.java
+++ 
b/juneau-microservice/juneau-microservice/src/test/java/org/apache/juneau/microservice/resources/LogsResource_Action_Test.java
@@ -71,16 +71,14 @@ class LogsResource_Action_Test extends TestBase {
                // Test setUri(java.net.URI) returns correct type
                var x = new Action("view", "/logs/test.log");
 
-               try {
+               assertDoesNotThrow(() -> {
                        Action result = x.setUri(new 
java.net.URI("http://example.com/logs/test.log";));
 
                        // Verify fluent chaining
                        assertSame(x, result);
                        assertInstanceOf(Action.class, result);
                        
assertTrue(x.getUri().toString().contains("example.com"));
-               } catch (Exception e) {
-                       fail("URI creation failed: " + e.getMessage());
-               }
+               });
        }
 
        @Test void a06_setUri_withArgs() {
diff --git 
a/juneau-petstore/juneau-petstore-core/src/test/java/org/apache/juneau/petstore/service/PetStore_Test.java
 
b/juneau-petstore/juneau-petstore-core/src/test/java/org/apache/juneau/petstore/service/PetStore_Test.java
index f4f2c89aa0..0672d1e1a9 100644
--- 
a/juneau-petstore/juneau-petstore-core/src/test/java/org/apache/juneau/petstore/service/PetStore_Test.java
+++ 
b/juneau-petstore/juneau-petstore-core/src/test/java/org/apache/juneau/petstore/service/PetStore_Test.java
@@ -132,8 +132,8 @@ class PetStore_Test extends TestBase {
 
        @Test void d02_createUser_duplicate_throws() {
                var s = new PetStore();
-               assertThrows(IllegalArgumentException.class,
-                       () -> s.createUser(new 
User().setUsername("mwatson").setUserStatus(UserStatus.ACTIVE)));
+               var u = new 
User().setUsername("mwatson").setUserStatus(UserStatus.ACTIVE);
+               assertThrows(IllegalArgumentException.class, () -> 
s.createUser(u));
        }
 
        @Test void d03_updateUser_replacesContent() {
diff --git 
a/juneau-petstore/juneau-petstore-jetty/src/test/java/org/apache/juneau/petstore/jetty/PetstoreJetty_Test.java
 
b/juneau-petstore/juneau-petstore-jetty/src/test/java/org/apache/juneau/petstore/jetty/PetstoreJetty_Test.java
index 905bcab0d2..583439a9f7 100644
--- 
a/juneau-petstore/juneau-petstore-jetty/src/test/java/org/apache/juneau/petstore/jetty/PetstoreJetty_Test.java
+++ 
b/juneau-petstore/juneau-petstore-jetty/src/test/java/org/apache/juneau/petstore/jetty/PetstoreJetty_Test.java
@@ -49,6 +49,38 @@ class PetstoreJetty_Test extends TestBase {
                .followRedirects(HttpClient.Redirect.NEVER)
                .build();
 
+       /**
+        * Primes the root endpoint before the timed test methods run.
+        *
+        * <p>
+        * The fixture's {@code beforeAll} only waits for the Jetty connector 
to bind — not for the REST servlet to
+        * initialize. The first request to a Juneau REST resource triggers 
one-time {@code RestContext} setup
+        * (serializer/parser metadata, {@code HtmlDocSerializer} construction) 
which, under a loaded CI agent, can
+        * exceed the tight 10s per-request timeout the test methods use. 
Absorbing that cold-start here (with a
+        * generous budget + retry) removes the startup race from {@code a01} 
while keeping the per-test timeouts tight.
+        */
+       @BeforeAll
+       static void warmUpServer() throws Exception {
+               var deadline = Instant.now().plusSeconds(30);
+               Exception last = null;
+               while (Instant.now().isBefore(deadline)) {
+                       try {
+                               var req = HttpRequest.newBuilder()
+                                       .uri(URI.create(fixture.getRootUrl() + 
"/"))
+                                       .timeout(Duration.ofSeconds(20))
+                                       .header("Accept", "text/html")
+                                       .GET()
+                                       .build();
+                               if (HTTP.send(req, 
BodyHandlers.ofString()).statusCode() == 200)
+                                       return;
+                       } catch (HttpTimeoutException | ConnectException e) {
+                               last = e;
+                       }
+                       Thread.sleep(250);
+               }
+               throw new IllegalStateException("Petstore Jetty server did not 
become ready within 30s", last);
+       }
+
        private static HttpResponse<String> get(String path, String accept) 
throws Exception {
                var req = HttpRequest.newBuilder()
                        .uri(URI.create(fixture.getRootUrl() + path))
diff --git 
a/juneau-rest/juneau-rest-common-classic/src/test/java/org/apache/juneau/http/classic/BasicPart_Test.java
 
b/juneau-rest/juneau-rest-common-classic/src/test/java/org/apache/juneau/http/classic/BasicPart_Test.java
index 5464be927c..fdcdf9a10d 100644
--- 
a/juneau-rest/juneau-rest-common-classic/src/test/java/org/apache/juneau/http/classic/BasicPart_Test.java
+++ 
b/juneau-rest/juneau-rest-common-classic/src/test/java/org/apache/juneau/http/classic/BasicPart_Test.java
@@ -124,7 +124,11 @@ class BasicPart_Test extends TestBase {
                assertEquals("inner", x4.getValue());
        }
 
-       @Test void a07_equals() {
+       @Test
+       @SuppressWarnings({
+               "java:S3415" // Argument order is intentional: 
assertNotEquals(x1, ...) exercises BasicPart.equals() with a non-matching 
arg/null, so x1 must be the receiver.
+       })
+       void a07_equals() {
                var x1 = part("Foo","bar");
                var x2 = part("Foo","bar");
                var x3 = part("Foo","baz");
diff --git 
a/juneau-rest/juneau-rest-common-classic/src/test/java/org/apache/juneau/http/classic/resource/BasicResource_Test.java
 
b/juneau-rest/juneau-rest-common-classic/src/test/java/org/apache/juneau/http/classic/resource/BasicResource_Test.java
index f7d595a1b5..147924f70c 100644
--- 
a/juneau-rest/juneau-rest-common-classic/src/test/java/org/apache/juneau/http/classic/resource/BasicResource_Test.java
+++ 
b/juneau-rest/juneau-rest-common-classic/src/test/java/org/apache/juneau/http/classic/resource/BasicResource_Test.java
@@ -225,10 +225,10 @@ class BasicResource_Test extends TestBase {
                assertEquals("writeMe", out.toString("UTF-8"));
        }
 
-       @Test void d06_consumeContent() throws Exception {
+       @Test void d06_consumeContent() {
                var x = new BasicResource(new StringEntity(null, "foo"));
-               // No-op
-               x.consumeContent();
+               // consumeContent() is a no-op that must complete without 
throwing.
+               assertDoesNotThrow(x::consumeContent);
        }
 
        
//------------------------------------------------------------------------------------------------------------------
diff --git 
a/juneau-rest/juneau-rest-mock/src/test/java/org/apache/juneau/rest/mock/MockRestClient_Test.java
 
b/juneau-rest/juneau-rest-mock/src/test/java/org/apache/juneau/rest/mock/MockRestClient_Test.java
index edcec766a1..edc1cebb8c 100644
--- 
a/juneau-rest/juneau-rest-mock/src/test/java/org/apache/juneau/rest/mock/MockRestClient_Test.java
+++ 
b/juneau-rest/juneau-rest-mock/src/test/java/org/apache/juneau/rest/mock/MockRestClient_Test.java
@@ -228,11 +228,11 @@ class MockRestClient_Test {
 
        @Test
        void c04_getClient_returnsNgRestClient() {
-               try (var client = MockRestClient.create(RootResource.class)) {
-                       assertNotNull(client.getClient());
-               } catch (IOException e) {
-                       fail("Unexpected exception: " + e.getMessage());
-               }
+               assertDoesNotThrow(() -> {
+                       try (var client = 
MockRestClient.create(RootResource.class)) {
+                               assertNotNull(client.getClient());
+                       }
+               });
        }
 
        // 
=================================================================================================================
diff --git 
a/juneau-rest/juneau-rest-server-auth-oauth/src/test/java/org/apache/juneau/rest/server/auth/oauth/OAuthFilter_Test.java
 
b/juneau-rest/juneau-rest-server-auth-oauth/src/test/java/org/apache/juneau/rest/server/auth/oauth/OAuthFilter_Test.java
index 3c9937b592..70d21c59ab 100644
--- 
a/juneau-rest/juneau-rest-server-auth-oauth/src/test/java/org/apache/juneau/rest/server/auth/oauth/OAuthFilter_Test.java
+++ 
b/juneau-rest/juneau-rest-server-auth-oauth/src/test/java/org/apache/juneau/rest/server/auth/oauth/OAuthFilter_Test.java
@@ -117,14 +117,10 @@ class OAuthFilter_Test extends TestBase {
        @Test void d02_builder_realmCustomization() throws Exception {
                TokenValidator v = token -> { throw new 
AuthenticationException("bad"); };
                var f = OAuthFilter.create().validator(v).realm("api2").build();
-               try {
-                       f.authenticate(req("Bearer x"));
-                       fail();
-               } catch (AuthenticationException e) {
-                       var hdr = e.getHeaders().stream()
-                               .filter(h -> 
"WWW-Authenticate".equalsIgnoreCase(h.getName()))
-                               .findFirst().orElseThrow();
-                       assertTrue(hdr.getValue().contains("api2"));
-               }
+               var e = assertThrows(AuthenticationException.class, () -> 
f.authenticate(req("Bearer x")));
+               var hdr = e.getHeaders().stream()
+                       .filter(h -> 
"WWW-Authenticate".equalsIgnoreCase(h.getName()))
+                       .findFirst().orElseThrow();
+               assertTrue(hdr.getValue().contains("api2"));
        }
 }
diff --git 
a/juneau-rest/juneau-rest-server-mcp/src/test/java/org/apache/juneau/rest/server/mcp/McpHandlerDefaults_Test.java
 
b/juneau-rest/juneau-rest-server-mcp/src/test/java/org/apache/juneau/rest/server/mcp/McpHandlerDefaults_Test.java
index 52c8d3c8b0..8941baa327 100644
--- 
a/juneau-rest/juneau-rest-server-mcp/src/test/java/org/apache/juneau/rest/server/mcp/McpHandlerDefaults_Test.java
+++ 
b/juneau-rest/juneau-rest-server-mcp/src/test/java/org/apache/juneau/rest/server/mcp/McpHandlerDefaults_Test.java
@@ -69,24 +69,20 @@ class McpHandlerDefaults_Test {
        void typedHandlers_constructor_isPrivate() {
                // Sanity: the static façade class should not be instantiable. 
Reflection trick used to bump coverage on the
                // implicit private no-arg constructor.
-               try {
+               assertDoesNotThrow(() -> {
                        var ctor = 
McpTypedHandlers.class.getDeclaredConstructor();
                        ctor.setAccessible(true);
                        assertNotNull(ctor.newInstance());
-               } catch (Exception e) {
-                       fail(e);
-               }
+               });
        }
 
        @Test
        void mcp_facade_constructor_isPrivate() {
-               try {
+               assertDoesNotThrow(() -> {
                        var ctor = Mcp.class.getDeclaredConstructor();
                        ctor.setAccessible(true);
                        assertNotNull(ctor.newInstance());
-               } catch (Exception e) {
-                       fail(e);
-               }
+               });
        }
 
        @Test
diff --git 
a/juneau-rest/juneau-rest-server-springboot/src/test/java/org/apache/juneau/rest/server/docs/BasicApiDocs_Springboot_MultiOpenApiProvider_Test.java
 
b/juneau-rest/juneau-rest-server-springboot/src/test/java/org/apache/juneau/rest/server/docs/BasicApiDocs_Springboot_MultiOpenApiProvider_Test.java
index e8edb22ba6..c8c1e83307 100644
--- 
a/juneau-rest/juneau-rest-server-springboot/src/test/java/org/apache/juneau/rest/server/docs/BasicApiDocs_Springboot_MultiOpenApiProvider_Test.java
+++ 
b/juneau-rest/juneau-rest-server-springboot/src/test/java/org/apache/juneau/rest/server/docs/BasicApiDocs_Springboot_MultiOpenApiProvider_Test.java
@@ -152,16 +152,13 @@ class BasicApiDocs_Springboot_MultiOpenApiProvider_Test {
 
        @Test
        void 
a02_collidingProvidersFailContextLoadWithBeanDefinitionOverrideException() {
-               var ex = assertThrows(BeanDefinitionOverrideException.class, () 
-> {
-                       try (var ctx = new 
SpringApplicationBuilder(CollidingApp.class)
+               var ex = assertThrows(BeanDefinitionOverrideException.class, () 
->
+                       new SpringApplicationBuilder(CollidingApp.class)
                                .web(WebApplicationType.NONE)
                                .run(
                                        "--spring.main.banner-mode=off",
                                        
"--spring.main.allow-bean-definition-overriding=false"
-                               )) {
-                               fail("Expected context load to fail with 
BeanDefinitionOverrideException, but it loaded: " + ctx);
-                       }
-               });
+                               ).close());
 
                // Spring's exact message text drifts across versions, so we 
only assert the bean id appears
                // in the message — enough to confirm Spring caught the 
collision on the expected bean.
diff --git 
a/juneau-rest/juneau-rest-server-view-jsp/src/test/java/org/apache/juneau/rest/server/view/jsp/JspView_Test.java
 
b/juneau-rest/juneau-rest-server-view-jsp/src/test/java/org/apache/juneau/rest/server/view/jsp/JspView_Test.java
index 01a30a1ee2..b6074b27d6 100644
--- 
a/juneau-rest/juneau-rest-server-view-jsp/src/test/java/org/apache/juneau/rest/server/view/jsp/JspView_Test.java
+++ 
b/juneau-rest/juneau-rest-server-view-jsp/src/test/java/org/apache/juneau/rest/server/view/jsp/JspView_Test.java
@@ -101,26 +101,30 @@ class JspView_Test extends TestBase {
                // Servlet spec: setAttribute(name, null) removes the binding. 
JspView mirrors that at
                // build-time so the renderer never has to short-circuit a 
request-attribute write at
                // dispatch time.
+               var v = JspView.of("hello.jsp");
                assertThrows(IllegalArgumentException.class,
-                       () -> JspView.of("hello.jsp").attr("missing", null));
+                       () -> v.attr("missing", null));
        }
 
        @Test void b05_attrRejectsNullKey() {
+               var v = JspView.of("hello.jsp");
                assertThrows(IllegalArgumentException.class,
-                       () -> JspView.of("hello.jsp").attr(null, "v"));
+                       () -> v.attr(null, "v"));
        }
 
        @Test void b06_attrRejectsBlankKey() {
+               var v = JspView.of("hello.jsp");
                assertThrows(IllegalArgumentException.class,
-                       () -> JspView.of("hello.jsp").attr("", "v"));
+                       () -> v.attr("", "v"));
                assertThrows(IllegalArgumentException.class,
-                       () -> JspView.of("hello.jsp").attr("   ", "v"));
+                       () -> v.attr("   ", "v"));
        }
 
        @Test void b07_attributesMapIsImmutable() {
                var v = JspView.of("hello.jsp").attr("name", "Bob");
+               var attrs = v.getAttributes();
                assertThrows(UnsupportedOperationException.class,
-                       () -> v.getAttributes().put("name", "Alice"));
+                       () -> attrs.put("name", "Alice"));
        }
 
        /* 
----------------------------------------------------------------------------------------
 *
@@ -150,8 +154,9 @@ class JspView_Test extends TestBase {
                var m = new LinkedHashMap<String, Object>();
                m.put("ok", 1);
                m.put("", 2);
+               var v = JspView.of("hello.jsp");
                assertThrows(IllegalArgumentException.class,
-                       () -> JspView.of("hello.jsp").attrs(m));
+                       () -> v.attrs(m));
        }
 
        @Test void c05_attrsOverridesExistingBindings() {
@@ -180,16 +185,18 @@ class JspView_Test extends TestBase {
        }
 
        @Test void d03_headerRejectsBlankName() {
+               var v = JspView.of("hello.jsp");
                assertThrows(IllegalArgumentException.class,
-                       () -> JspView.of("hello.jsp").header("", "v"));
+                       () -> v.header("", "v"));
                assertThrows(IllegalArgumentException.class,
-                       () -> JspView.of("hello.jsp").header(null, "v"));
+                       () -> v.header(null, "v"));
        }
 
        @Test void d04_headerRejectsNullValue() {
                // null header value is rejected (unlike attribute values).
+               var v = JspView.of("hello.jsp");
                assertThrows(IllegalArgumentException.class,
-                       () -> JspView.of("hello.jsp").header("X", null));
+                       () -> v.header("X", null));
        }
 
        @Test void d05_headerReturnsNewInstance() {
@@ -201,8 +208,9 @@ class JspView_Test extends TestBase {
 
        @Test void d06_responseHeadersMapIsImmutable() {
                var v = JspView.of("hello.jsp").header("X", "1");
+               var headers = v.getResponseHeaders();
                assertThrows(UnsupportedOperationException.class,
-                       () -> v.getResponseHeaders().put("Y", "2"));
+                       () -> headers.put("Y", "2"));
        }
 
        /* 
----------------------------------------------------------------------------------------
 *


Reply via email to