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 fc150eb4f Test modernization
     new be6ea448b Merge branch 'master' of 
https://gitbox.apache.org/repos/asf/juneau.git
fc150eb4f is described below

commit fc150eb4f889977d6845fd73eb29d8d56ef7ea64
Author: James Bognar <james.bog...@salesforce.com>
AuthorDate: Fri Aug 29 12:54:06 2025 -0400

    Test modernization
---
 .../java/org/apache/juneau/BeanConfig_Test.java    |  14 +-
 .../test/java/org/apache/juneau/BeanMap_Test.java  |  15 +-
 .../src/test/java/org/apache/juneau/TestUtils.java | 111 +++++++---
 .../juneau/a/rttests/RoundTripBeanMaps_Test.java   |  41 ++--
 .../apache/juneau/dto/swagger/Contact_Test.java    |  53 ++---
 .../dto/swagger/ExternalDocumentation_Test.java    |  47 +++--
 .../apache/juneau/dto/swagger/HeaderInfo_Test.java |  89 ++++----
 .../org/apache/juneau/dto/swagger/Info_Test.java   |  46 +++--
 .../org/apache/juneau/dto/swagger/Items_Test.java  |  31 +--
 .../apache/juneau/dto/swagger/License_Test.java    |  38 +++-
 .../apache/juneau/dto/swagger/Operation_Test.java  | 100 ++++-----
 .../juneau/dto/swagger/ParameterInfo_Test.java     |  43 +---
 .../juneau/dto/swagger/ResponseInfo_Test.java      |  52 +++--
 .../juneau/dto/swagger/SecurityScheme_Test.java    |  53 ++---
 .../org/apache/juneau/dto/swagger/Tag_Test.java    |  40 ++--
 .../org/apache/juneau/dto/swagger/Xml_Test.java    |  44 ++--
 .../juneau/http/remote/RrpcInterface_Test.java     | 224 ++++++++++-----------
 .../java/org/apache/juneau/rest/Swagger_Test.java  |  34 ++--
 .../rest/annotation/Swagger_FormData_Test.java     |  20 +-
 .../rest/annotation/Swagger_Header_Test.java       |  20 +-
 .../juneau/rest/annotation/Swagger_Path_Test.java  |  51 ++---
 .../rest/annotation/Swagger_Response_Test.java     |  81 +++-----
 .../juneau/testutils/pojos/SwappedObject.java      |   5 +
 .../juneau/testutils/pojos/TypedBeanImpl.java      |   5 +
 .../java/org/apache/juneau/uon/UonParser_Test.java |   3 +-
 .../urlencoding/CommonParser_UrlEncodingTest.java  |  11 +-
 26 files changed, 656 insertions(+), 615 deletions(-)

diff --git a/juneau-utest/src/test/java/org/apache/juneau/BeanConfig_Test.java 
b/juneau-utest/src/test/java/org/apache/juneau/BeanConfig_Test.java
index ef640bd81..f64f20fbd 100755
--- a/juneau-utest/src/test/java/org/apache/juneau/BeanConfig_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/BeanConfig_Test.java
@@ -237,13 +237,11 @@ class BeanConfig_Test extends SimpleTestBase {
 
                // Bean
                o = "{name:'x',age:123}";
-               assertEquals("x", bc.convertToType(o, Person.class).getName());
-               assertEquals(123, bc.convertToType(o, Person.class).getAge());
+               assertBean(bc.convertToType(o, Person.class), "name,age", 
"x,123");
 
                // Read-only bean
                o = "{name:'x',age:123}";
-               assertEquals("x", bc.convertToType(o, 
ReadOnlyPerson.class).getName());
-               assertEquals(123, bc.convertToType(o, 
ReadOnlyPerson.class).getAge());
+               assertBean(bc.convertToType(o, ReadOnlyPerson.class), 
"name,age", "x,123");
 
                // Class with forString(String) method.
                o = UUID.randomUUID();
@@ -405,8 +403,7 @@ class BeanConfig_Test extends SimpleTestBase {
                f1.setA("Hello");
                f1.setB(50);
 
-               assertEquals(bm2.get("a"), "Hello", fs("Failed to set string 
property 'a' on dynamic proxy bean. {0}", bm2));  // NOSONAR
-               assertEquals(bm2.get("b"), Integer.valueOf(50), fs("Failed to 
set string property 'b' on dynamic proxy bean. {0}", bm2));
+               assertMap(bm2, "a,b", "Hello,50");
                assertEquals(bm1, bm2, fs("Failed equality test of dynamic 
proxies beans: {0} / {1}", bm1, bm2));
                assertEquals(bm2, bm1, fs("Failed reverse equality test of 
dynamic proxies beans: {0} / {1}", bm1, bm2));
        }
@@ -619,10 +616,7 @@ class BeanConfig_Test extends SimpleTestBase {
                                bm.add("f4", i);
                        }
                        var d = bm.getBean();
-                       assertEquals(5000, d.f1.length);
-                       assertEquals(5000, d.f2.length);
-                       assertEquals(5003, d.f3.length);
-                       assertEquals(5003, d.f4.length);
+                       assertBean(d, 
"f1{length},f2{length},f3{length},f4{length}", "{5000},{5000},{5003},{5003}");
                });
        }
 
diff --git a/juneau-utest/src/test/java/org/apache/juneau/BeanMap_Test.java 
b/juneau-utest/src/test/java/org/apache/juneau/BeanMap_Test.java
index df6d6a0fc..8eee2e537 100755
--- a/juneau-utest/src/test/java/org/apache/juneau/BeanMap_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/BeanMap_Test.java
@@ -1038,12 +1038,10 @@ class BeanMap_Test extends SimpleTestBase {
                assertEquals(1, t.f1);
 
                t = (R2)m.cast(R1.class);
-               assertEquals(1, t.f1);
-               assertEquals(2, t.f2);
+               assertBean(t, "f1,f2", "1,2");
 
                t = (R2)m.cast(bc.getClassMeta(R1.class));
-               assertEquals(1, t.f1);
-               assertEquals(2, t.f2);
+               assertBean(t, "f1,f2", "1,2");
 
                // Without _type
                m = new JsonMap(session);
@@ -1051,16 +1049,13 @@ class BeanMap_Test extends SimpleTestBase {
                m.put("f2", "2");
 
                m = (JsonMap)m.cast(Object.class);
-               assertEquals(1, t.f1);
-               assertEquals(2, t.f2);
+               assertBean(t, "f1,f2", "1,2");
 
                t = m.cast(R2.class);
-               assertEquals(1, t.f1);
-               assertEquals(2, t.f2);
+               assertBean(t, "f1,f2", "1,2");
 
                t = m.cast(bc.getClassMeta(R2.class));
-               assertEquals(1, t.f1);
-               assertEquals(2, t.f2);
+               assertBean(t, "f1,f2", "1,2");
        }
 
        // Bean with no properties
diff --git a/juneau-utest/src/test/java/org/apache/juneau/TestUtils.java 
b/juneau-utest/src/test/java/org/apache/juneau/TestUtils.java
index 9e53ae2ac..6030efacc 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/TestUtils.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/TestUtils.java
@@ -135,25 +135,8 @@ public class TestUtils extends Utils2 {
        /**
         * Asserts the entries in an array matches the expected strings after 
they've been made readable.
         */
-       @SuppressWarnings("unchecked")
        public static void assertArray(Object array, Object...expected) {
-               if (expected.length == 1 && expected[0] instanceof String && 
s(expected[0]).contains(","))
-                       expected = s(expected[0]).charAt(0) == '>' ? new 
String[]{s(expected[0]).substring(1)} : splita(s(expected[0]));
-               if (Array.getLength(array) != expected.length)
-                       fail(fs("Wrong array length.  expected={0}, 
actual={1}", expected.length, Array.getLength(array)));
-               for (var i = 0; i < expected.length; i++) {
-                       var x = Array.get(array, i);
-                       if (expected[i] instanceof String e) {
-                               if (ne(r(x), e))
-                                       fail(fs("Element at index {0} did not 
match.  expected={1}, actual={2}", i, e, r(x)));
-                       } else if (expected[i] instanceof Predicate e) {
-                               if (! e.test(x))
-                                       fail(fs("Element at index {0} did pass 
predicate.  actual={1}", i, r(x)));
-                       } else {
-                               if (ne(expected[i], x))
-                                       fail(fs("Element at index {0} did not 
match.  expected={1}, actual={2}", i, r(expected[i]), r(x)));
-                       }
-               }
+               assertCollection(arrayToList(array), expected);
        }
 
        /**
@@ -358,7 +341,7 @@ public class TestUtils extends Utils2 {
                if (o instanceof Iterable o2) return isNumeric(name) ? 
toList(o2).get(Integer.parseInt(name)) : getBeanProp(o, name);
                if (o instanceof Iterator o2) return isNumeric(name) ? 
toList(o2).get(Integer.parseInt(name)) : getBeanProp(o, name);
                if (o instanceof Enumeration o2) return isNumeric(name) ? 
toList(o2).get(Integer.parseInt(name)) : getBeanProp(o, name);
-               return TestUtils.getBeanProp(o, name);
+               return getBeanProp(o, name);
        }
 
        private static boolean isNumeric(String name) {
@@ -394,15 +377,21 @@ public class TestUtils extends Utils2 {
                                f.setAccessible(true);
                                return f.get(o);
                        }
+                       m = Arrays.stream(c.getMethods()).filter(x -> 
x.getName().equals("get") && x.getParameterCount() == 1 && 
x.getParameterTypes()[0] == String.class && x.getAnnotation(BeanIgnore.class) 
== null).findFirst().orElse(null);
+                       if (m != null) {
+                               m.setAccessible(true);
+                               return m.invoke(o, name);
+                       }
+                       if (c.isArray()) {
+                               switch (name) {
+                                       case "length": return 
Array.getLength(o);
+                                       default: // Fall through.
+                               }
+                       }
                        throw runtimeException("No field called {0} found on 
class {1}", name, c.getName());
                });
        }
 
-       private static boolean isGetter(Method m, String n) {
-               var mn = m.getName();
-               return ((("get"+n).equals(mn) || ("is"+n).equals(mn)) && 
m.getParameterCount() == 0);
-       }
-
        public static String json(Object o) {
                return Json5.DEFAULT.write(o);
        }
@@ -618,4 +607,78 @@ public class TestUtils extends Utils2 {
                }
                assertMap(m, properties, expected);
        }
+
+       /**
+        * Converts any array (including primitive arrays) to a List.
+        *
+        * @param array The array to convert. Can be any array type including 
primitives.
+        * @return A List containing the array elements. Primitive values are 
auto-boxed.
+        *         Returns null if the input is null.
+        * @throws IllegalArgumentException if the input is not an array.
+        */
+       public static List<Object> arrayToList(Object array) {
+               if (array == null) {
+                       return null;
+               }
+
+               if (!array.getClass().isArray()) {
+                       throw new IllegalArgumentException("Input must be an 
array, but was: " + array.getClass().getName());
+               }
+
+               var componentType = array.getClass().getComponentType();
+               var length = Array.getLength(array);
+               var result = new ArrayList<Object>(length);
+
+               // Handle primitive arrays specifically for better performance
+               if (componentType.isPrimitive()) {
+                       if (componentType == int.class) {
+                               var arr = (int[]) array;
+                               for (int value : arr) {
+                                       result.add(value);
+                               }
+                       } else if (componentType == long.class) {
+                               var arr = (long[]) array;
+                               for (long value : arr) {
+                                       result.add(value);
+                               }
+                       } else if (componentType == double.class) {
+                               var arr = (double[]) array;
+                               for (double value : arr) {
+                                       result.add(value);
+                               }
+                       } else if (componentType == float.class) {
+                               var arr = (float[]) array;
+                               for (float value : arr) {
+                                       result.add(value);
+                               }
+                       } else if (componentType == boolean.class) {
+                               var arr = (boolean[]) array;
+                               for (boolean value : arr) {
+                                       result.add(value);
+                               }
+                       } else if (componentType == byte.class) {
+                               var arr = (byte[]) array;
+                               for (byte value : arr) {
+                                       result.add(value);
+                               }
+                       } else if (componentType == char.class) {
+                               var arr = (char[]) array;
+                               for (char value : arr) {
+                                       result.add(value);
+                               }
+                       } else if (componentType == short.class) {
+                               var arr = (short[]) array;
+                               for (short value : arr) {
+                                       result.add(value);
+                               }
+                       }
+               } else {
+                       // Handle Object arrays
+                       for (var i = 0; i < length; i++) {
+                               result.add(Array.get(array, i));
+                       }
+               }
+
+               return result;
+       }
 }
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/a/rttests/RoundTripBeanMaps_Test.java
 
b/juneau-utest/src/test/java/org/apache/juneau/a/rttests/RoundTripBeanMaps_Test.java
index 84da99df0..dafcda52e 100755
--- 
a/juneau-utest/src/test/java/org/apache/juneau/a/rttests/RoundTripBeanMaps_Test.java
+++ 
b/juneau-utest/src/test/java/org/apache/juneau/a/rttests/RoundTripBeanMaps_Test.java
@@ -170,15 +170,15 @@ class RoundTripBeanMaps_Test extends SimpleTestBase {
 
                l.get(0).setF1("bar");
                l = t.roundTrip(l, List.class, IBean.class);
-               assertEquals("bar", l.get(0).getF1());
+               assertBean(l.get(0), "f1", "bar");
                l = t.roundTrip(l, LinkedList.class, IBean.class);
-               assertEquals("bar", l.get(0).getF1());
+               assertBean(l.get(0), "f1", "bar");
 
                l.get(0).setF1("bing");
                l = t.roundTrip(l, List.class, CBean.class);
-               assertEquals("bing", l.get(0).getF1());
+               assertBean(l.get(0), "f1", "bing");
                l = t.roundTrip(l, LinkedList.class, CBean.class);
-               assertEquals("bing", l.get(0).getF1());
+               assertBean(l.get(0), "f1", "bing");
        }
 
        
//====================================================================================================
@@ -192,15 +192,15 @@ class RoundTripBeanMaps_Test extends SimpleTestBase {
 
                l.get("foo").setF1("bar");
                l = t.roundTrip(l, Map.class, String.class, IBean.class);
-               assertEquals("bar", l.get("foo").getF1());
+               assertBean(l.get("foo"), "f1", "bar");
                l = t.roundTrip(l, LinkedHashMap.class, String.class, 
IBean.class);
-               assertEquals("bar", l.get("foo").getF1());
+               assertBean(l.get("foo"), "f1", "bar");
 
                l.get("foo").setF1("bing");
                l = t.roundTrip(l, Map.class, String.class, CBean.class);
-               assertEquals("bing", l.get("foo").getF1());
+               assertBean(l.get("foo"), "f1", "bing");
                l = t.roundTrip(l, LinkedHashMap.class, String.class, 
CBean.class);
-               assertEquals("bing", l.get("foo").getF1());
+               assertBean(l.get("foo"), "f1", "bing");
        }
 
        
//====================================================================================================
@@ -214,12 +214,7 @@ class RoundTripBeanMaps_Test extends SimpleTestBase {
                b = t.roundTrip(b);
                if (t.returnOriginalObject || t.getParser() == null)
                        return;
-               assertEquals(0, b.f1);
-               assertEquals(0, b.f2);
-               assertEquals(1, b.f3);
-               assertEquals(1, b.f4);
-               assertEquals(0, b.getF5());
-               assertEquals(1, b.getF6());
+               assertBean(b, "f1,f2,f3,f4,f5,f6", "0,0,1,1,0,1");
        }
 
        public interface IBean {
@@ -434,7 +429,7 @@ class RoundTripBeanMaps_Test extends SimpleTestBase {
                var r = s.serialize(ba1);
                var b = p.parse(r, BA.class);
                assertTrue(b instanceof BA1);
-               assertJson(b, "{f0a:'f0a',f0b:'f0b',f1:'f1'}");
+               assertBean(b, "f0a,f0b,f1", "f0a,f0b,f1");
        }
 
        @Bean(dictionary={BA1.class,BA2.class})
@@ -477,7 +472,7 @@ class RoundTripBeanMaps_Test extends SimpleTestBase {
                var r = s.serialize(c1);
                var c = p.parse(r, CA.class);
                assertTrue(c instanceof CA1);
-               assertJson(c, "{f0a:'f0a',f0b:'f0b',f1:'f1'}");
+               assertBean(c, "f0a,f0b,f1", "f0a,f0b,f1");
        }
 
        public abstract static class CA {
@@ -524,7 +519,7 @@ class RoundTripBeanMaps_Test extends SimpleTestBase {
                var r = s.serialize(d);
                d = p.parse(r, D1.class);
                assertNull(d.f1);
-               assertJson(d, "{f3:'f3',f2:'f2'}");
+               assertBean(d, "f3,f2", "f3,f2");
        }
 
        @Bean(p="f3,f2")
@@ -588,7 +583,7 @@ class RoundTripBeanMaps_Test extends SimpleTestBase {
                var e = new E1().init();
                var r = s.serialize(e);
                e = p.parse(r, E1.class);
-               assertJson(e, "{f1:'f1',f3:'f3'}");
+               assertBean(e, "f1,f3", "f1,f3");
        }
 
        @Bean(excludeProperties="f2")
@@ -619,7 +614,7 @@ class RoundTripBeanMaps_Test extends SimpleTestBase {
                var e = new E2().init();
                var r = s.serialize(e);
                e = p.parse(r, E2.class);
-               assertJson(e, "{f1:'f1',f3:'f3'}");
+               assertBean(e, "f1,f3", "f1,f3");
        }
 
        public static class E2 {
@@ -649,7 +644,7 @@ class RoundTripBeanMaps_Test extends SimpleTestBase {
                var x = new FA2().init();
                var r = s.serialize(x);
                x = p.parse(r, FA2.class);
-               assertJson(x, "{f1:'f1'}");
+               assertBean(x, "f1", "f1");
        }
 
        @Bean(interfaceClass=FA1.class)
@@ -689,7 +684,7 @@ class RoundTripBeanMaps_Test extends SimpleTestBase {
                x = new FB2().init();
                r = s.build().serialize(x);
                x = p.build().parse(r, FB2.class);
-               assertJson(x, "{f1:'f1'}");
+               assertBean(x, "f1", "f1");
 
                // --- BeanFilter defined on child class class ---
                s.interfaces(FB1.class);
@@ -698,7 +693,7 @@ class RoundTripBeanMaps_Test extends SimpleTestBase {
                x = new FB2().init();
                r = s.build().serialize(x);
                x = p.build().parse(r, FB2.class);
-               assertJson(x, "{f1:'f1'}");
+               assertBean(x, "f1", "f1");
 
                // --- BeanFilter defined as plain class ---
                s.interfaces(FB1.class);
@@ -707,7 +702,7 @@ class RoundTripBeanMaps_Test extends SimpleTestBase {
                x = new FB2().init();
                r = s.build().serialize(x);
                x = p.build().parse(r, FB2.class);
-               assertJson(x, "{f1:'f1'}");
+               assertBean(x, "f1", "f1");
        }
 
        public static class FB1 {
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/dto/swagger/Contact_Test.java 
b/juneau-utest/src/test/java/org/apache/juneau/dto/swagger/Contact_Test.java
index b3910deef..da97c3a10 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/dto/swagger/Contact_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/dto/swagger/Contact_Test.java
@@ -32,10 +32,14 @@ class Contact_Test extends SimpleTestBase {
         */
        @Test void a01_gettersAndSetters() {
                var t = new Contact();
-               assertEquals("foo", t.setName("foo").getName());
+
+               assertBean(
+                       
t.setName("a").setEmail("b").setUrl(URI.create("http://c";)),
+                       "name,email,url",
+                       "a,b,http://c";
+               );
+
                assertNull(t.setName(null).getName());
-               assertString("http://bar";, 
t.setUrl(URI.create("http://bar";)).getUrl());
-               assertEquals("foo", t.setEmail("foo").getEmail());
                assertNull(t.setEmail(null).getEmail());
        }
 
@@ -46,32 +50,33 @@ class Contact_Test extends SimpleTestBase {
                var t = new Contact();
 
                t
-                       .set("name", "foo")
-                       .set("url", "bar")
-                       .set("email", "baz")
-                       .set("$ref", "qux");
+                       .set("name", "a")
+                       .set("url", "b")
+                       .set("email", "c")
+                       .set("$ref", "d");
 
-               assertJson(t, 
"{name:'foo',url:'bar',email:'baz','$ref':'qux'}");
+               assertBean(t, "name,url,email,$ref", "a,b,c,d");
 
                t
-                       .set("name", new StringBuilder("foo"))
-                       .set("url", new StringBuilder("bar"))
-                       .set("email", new StringBuilder("baz"))
-                       .set("$ref", new StringBuilder("qux"));
+                       .set("name", new StringBuilder("a"))
+                       .set("url", new StringBuilder("b"))
+                       .set("email", new StringBuilder("c"))
+                       .set("$ref", new StringBuilder("d"));
 
-               assertJson(t, 
"{name:'foo',url:'bar',email:'baz','$ref':'qux'}");
+               assertBean(t, "name,url,email,$ref", "a,b,c,d");
 
-               assertEquals("foo", t.get("name", String.class));
-               assertString("bar", t.get("url", URI.class));
-               assertEquals("baz", t.get("email", String.class));
-               assertEquals("qux", t.get("$ref", String.class));
+               assertMapped(
+                       t, (obj,prop) -> obj.get(prop, String.class),
+                       "name,url,email,$ref",
+                       "a,b,c,d"
+               );
 
                t.set("null", null).set(null, "null");
                assertNull(t.get("null", Object.class));
                assertNull(t.get(null, Object.class));
                assertNull(t.get("foo", Object.class));
 
-               
assertJson(JsonParser.DEFAULT.parse("{name:'foo',url:'bar',email:'baz','$ref':'qux'}",
 Contact.class), "{name:'foo',url:'bar',email:'baz','$ref':'qux'}");
+               
assertBean(JsonParser.DEFAULT.parse("{name:'a',url:'b',email:'c','$ref':'d'}", 
Contact.class), "name,url,email,$ref", "a,b,c,d");
        }
 
        @Test void b02_copy() {
@@ -82,13 +87,13 @@ class Contact_Test extends SimpleTestBase {
                assertJson(t, "{}");
 
                t
-                       .set("name", "foo")
-                       .set("url", "bar")
-                       .set("email", "baz")
-                       .set("$ref", "qux")
+                       .set("name", "a")
+                       .set("url", "b")
+                       .set("email", "c")
+                       .set("$ref", "d")
                        .copy();
 
-               assertJson(t, 
"{name:'foo',url:'bar',email:'baz','$ref':'qux'}");
+               assertBean(t, "name,url,email,$ref", "a,b,c,d");
        }
 
        @Test void b03_keySet() {
@@ -102,6 +107,6 @@ class Contact_Test extends SimpleTestBase {
                        .set("email", "baz")
                        .set("$ref", "qux");
 
-               assertJson(t.keySet(), "['email','name','url','$ref']");
+               assertSet(t.keySet(), "email,name,url,$ref");
        }
 }
\ No newline at end of file
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/dto/swagger/ExternalDocumentation_Test.java
 
b/juneau-utest/src/test/java/org/apache/juneau/dto/swagger/ExternalDocumentation_Test.java
index a2fe1afae..667d0de23 100644
--- 
a/juneau-utest/src/test/java/org/apache/juneau/dto/swagger/ExternalDocumentation_Test.java
+++ 
b/juneau-utest/src/test/java/org/apache/juneau/dto/swagger/ExternalDocumentation_Test.java
@@ -32,9 +32,14 @@ class ExternalDocumentation_Test extends SimpleTestBase {
         */
        @Test void a01_gettersAndSetters() {
                var t = new ExternalDocumentation();
-               assertEquals("foo", t.setDescription("foo").getDescription());
+
+               assertBean(
+                       t.setDescription("a").setUrl(URI.create("http://b";)),
+                       "description,url",
+                       "a,http://b";
+               );
+
                assertNull(t.setDescription(null).getDescription());
-               assertString("http://bar";, 
t.setUrl(URI.create("http://bar";)).getUrl());
        }
 
        /**
@@ -44,29 +49,31 @@ class ExternalDocumentation_Test extends SimpleTestBase {
                var t = new ExternalDocumentation();
 
                t
-                       .set("description", "foo")
-                       .set("url", "bar")
-                       .set("$ref", "baz");
+                       .set("description", "a")
+                       .set("url", "b")
+                       .set("$ref", "c");
 
-               assertJson(t, "{description:'foo',url:'bar','$ref':'baz'}");
+               assertBean(t, "description,url,$ref", "a,b,c");
 
                t
-                       .set("description", new StringBuilder("foo"))
-                       .set("url", new StringBuilder("bar"))
-                       .set("$ref", new StringBuilder("baz"));
+                       .set("description", new StringBuilder("a2"))
+                       .set("url", new StringBuilder("b2"))
+                       .set("$ref", new StringBuilder("c2"));
 
-               assertJson(t, "{description:'foo',url:'bar','$ref':'baz'}");
+               assertBean(t, "description,url,$ref", "a2,b2,c2");
 
-               assertEquals("foo", t.get("description", String.class));
-               assertString("bar", t.get("url", URI.class));
-               assertEquals("baz", t.get("$ref", String.class));
+               assertMapped(
+                       t, (obj,prop) -> obj.get(prop, String.class),
+                       "description,url,$ref",
+                       "a2,b2,c2"
+               );
 
                t.set("null", null).set(null, "null");
                assertNull(t.get("null", Object.class));
                assertNull(t.get(null, Object.class));
                assertNull(t.get("foo", Object.class));
 
-               
assertJson(JsonParser.DEFAULT.parse("{description:'foo',url:'bar','$ref':'baz'}",
 ExternalDocumentation.class), "{description:'foo',url:'bar','$ref':'baz'}");
+               
assertBean(JsonParser.DEFAULT.parse("{description:'a',url:'b','$ref':'c'}", 
ExternalDocumentation.class), "description,url,$ref", "a,b,c");
        }
 
        @Test void b02_copy() {
@@ -77,24 +84,24 @@ class ExternalDocumentation_Test extends SimpleTestBase {
                assertJson(t, "{}");
 
                t
-                       .set("description", "foo")
-                       .set("url", "bar")
-                       .set("$ref", "baz")
+                       .set("description", "a")
+                       .set("url", "b")
+                       .set("$ref", "c")
                        .copy();
 
-               assertJson(t, "{description:'foo',url:'bar','$ref':'baz'}");
+               assertBean(t, "description,url,$ref", "a,b,c");
        }
 
        @Test void b03_keySet() {
                var t = new ExternalDocumentation();
 
-               assertJson(t.keySet(), "[]");
+               assertSet(t.keySet());
 
                t
                        .set("description", "foo")
                        .set("url", "bar")
                        .set("$ref", "baz");
 
-               assertJson(t.keySet(), "['description','url','$ref']");
+               assertSet(t.keySet(), "description,url,$ref");
        }
 }
\ No newline at end of file
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/dto/swagger/HeaderInfo_Test.java 
b/juneau-utest/src/test/java/org/apache/juneau/dto/swagger/HeaderInfo_Test.java
index dd2001490..bfc862a1a 100644
--- 
a/juneau-utest/src/test/java/org/apache/juneau/dto/swagger/HeaderInfo_Test.java
+++ 
b/juneau-utest/src/test/java/org/apache/juneau/dto/swagger/HeaderInfo_Test.java
@@ -33,45 +33,37 @@ class HeaderInfo_Test extends SimpleTestBase {
         */
        @Test void a01_gettersAndSetters() {
                var t = new HeaderInfo();
-               assertEquals("foo", t.setDescription("foo").getDescription());
+
+               // General - Combined assertBean test
+               assertBean(
+                       
t.setDescription("foo").setType("foo").setFormat("foo").setItems(items("foo"))
+                        
.setCollectionFormat("foo").setDefault("foo").setMaximum(123).setExclusiveMaximum(true)
+                        
.setMinimum(123).setExclusiveMinimum(true).setMaxLength(123).setMinLength(123)
+                        
.setPattern("foo").setMaxItems(123).setMinItems(123).setUniqueItems(true)
+                        
.setEnum(set("foo","bar")).setMultipleOf(123).setExample("foo").setRef("foo"),
+                       
"description,type,format,items{type},collectionFormat,default,maximum,exclusiveMaximum,minimum,exclusiveMinimum,maxLength,minLength,pattern,maxItems,minItems,uniqueItems,enum,multipleOf,example,ref",
+                       
"foo,foo,foo,{foo},foo,foo,123,true,123,true,123,123,foo,123,123,true,[foo,bar],123,foo,foo"
+               );
+
+               // Special cases
                assertNull(t.setDescription(null).getDescription());
-               assertEquals("foo", t.setType("foo").getType());
                assertNull(t.setType(null).getType());
-               assertEquals("foo", t.setFormat("foo").getFormat());
                assertNull(t.setFormat(null).getFormat());
-               assertJson(t.setItems(items("foo")).getItems(), "{type:'foo'}");
                assertNull(t.setItems((Items)null).getItems());
-               assertEquals("foo", 
t.setCollectionFormat("foo").getCollectionFormat());
                assertNull(t.setCollectionFormat(null).getCollectionFormat());
-               assertEquals("foo", t.setDefault("foo").getDefault());
-               assertString("foo", t.setDefault(new 
StringBuilder("foo")).getDefault());
                assertNull(t.setDefault(null).getDefault());
-               assertEquals(123, t.setMaximum(123).getMaximum());
                assertEquals(123f, t.setMaximum(123f).getMaximum());
-               assertTrue(t.setExclusiveMaximum(true).getExclusiveMaximum());
-               assertEquals(123, t.setMinimum(123).getMinimum());
                assertEquals(123f, t.setMinimum(123f).getMinimum());
-               assertTrue(t.setExclusiveMinimum(true).getExclusiveMinimum());
-               assertEquals(123, t.setMaxLength(123).getMaxLength());
-               assertEquals(123, t.setMinLength(123).getMinLength());
-               assertEquals("foo", t.setPattern("foo").getPattern());
                assertNull(t.setPattern(null).getPattern());
-               assertEquals(123, t.setMaxItems(123).getMaxItems());
-               assertEquals(123, t.setMinItems(123).getMinItems());
-               assertTrue(t.setUniqueItems(true).getUniqueItems());
-               assertJson(t.setEnum(set("foo","bar")).getEnum(), 
"['foo','bar']");
-               assertJson(t.setEnum(set()).getEnum(), "[]");
-               assertJson(t.setEnum("foo","bar").getEnum(), "['foo','bar']");
+               assertSet(t.setEnum(set()).getEnum());
+               assertSet(t.setEnum("foo","bar").getEnum(), "foo,bar");
                assertNull(t.setEnum((Set<Object>)null).getEnum());
-               assertJson(t.addEnum("foo","bar").getEnum(), "['foo','bar']");
-               assertJson(t.addEnum("baz").getEnum(), "['foo','bar','baz']");
-               assertEquals(123, t.setMultipleOf(123).getMultipleOf());
+               assertSet(t.addEnum("foo","bar").getEnum(), "foo,bar");
+               assertSet(t.addEnum("baz").getEnum(), "foo,bar,baz");
                assertEquals(123f, t.setMultipleOf(123f).getMultipleOf());
-               assertEquals("foo", t.setExample("foo").getExample());
-               assertEquals(123f, t.setExample(123f).getExample());
+               assertBean(t.setExample(123f), "example", "123.0");
                assertNull(t.setExample((String)null).getExample());
-               assertEquals("foo", t.setRef("foo").getRef());
-               assertNull(t.setRef(null).getRef());
+               assertBean(t.setRef(null), "ref", "null");
        }
 
        /**
@@ -102,7 +94,9 @@ class HeaderInfo_Test extends SimpleTestBase {
                        .set("uniqueItems", true)
                        .set("$ref", "ref");
 
-               assertJson(t, 
"{description:'d',type:'j',format:'g',items:{type:'h'},collectionFormat:'c','default':'a',maximum:123.0,exclusiveMaximum:true,minimum:123.0,exclusiveMinimum:true,maxLength:123,minLength:123,pattern:'i',maxItems:123,minItems:123,uniqueItems:true,'enum':['b'],multipleOf:123.0,'$ref':'ref',example:'e'}");
+               assertBean(t,
+                       
"description,type,format,items{type},collectionFormat,default,maximum,exclusiveMaximum,minimum,exclusiveMinimum,maxLength,minLength,pattern,maxItems,minItems,uniqueItems,enum,multipleOf,ref,example",
+                       
"d,j,g,{h},c,a,123.0,true,123.0,true,123,123,i,123,123,true,[b],123.0,ref,e");
 
                t
                        .set("default", "a")
@@ -126,7 +120,9 @@ class HeaderInfo_Test extends SimpleTestBase {
                        .set("uniqueItems", "true")
                        .set("$ref", "ref");
 
-               assertJson(t, 
"{description:'d',type:'j',format:'g',items:{type:'h'},collectionFormat:'c','default':'a',maximum:123.0,exclusiveMaximum:true,minimum:123.0,exclusiveMinimum:true,maxLength:123,minLength:123,pattern:'i',maxItems:123,minItems:123,uniqueItems:true,'enum':['b'],multipleOf:123.0,'$ref':'ref',example:'e'}");
+               assertBean(t,
+                       
"description,type,format,items{type},collectionFormat,default,maximum,exclusiveMaximum,minimum,exclusiveMinimum,maxLength,minLength,pattern,maxItems,minItems,uniqueItems,enum,multipleOf,ref,example",
+                       
"d,j,g,{h},c,a,123.0,true,123.0,true,123,123,i,123,123,true,[b],123.0,ref,e");
 
                t
                        .set("default", new StringBuilder("a"))
@@ -150,28 +146,13 @@ class HeaderInfo_Test extends SimpleTestBase {
                        .set("uniqueItems", new StringBuilder("true"))
                        .set("$ref", new StringBuilder("ref"));
 
-               assertJson(t, 
"{description:'d',type:'j',format:'g',items:{type:'h'},collectionFormat:'c','default':'a',maximum:123.0,exclusiveMaximum:true,minimum:123.0,exclusiveMinimum:true,maxLength:123,minLength:123,pattern:'i',maxItems:123,minItems:123,uniqueItems:true,'enum':['b'],multipleOf:123.0,'$ref':'ref',example:'e'}");
+               assertBean(t,
+                       
"description,type,format,items{type},collectionFormat,default,maximum,exclusiveMaximum,minimum,exclusiveMinimum,maxLength,minLength,pattern,maxItems,minItems,uniqueItems,enum,multipleOf,ref,example",
+                       
"d,j,g,{h},c,a,123.0,true,123.0,true,123,123,i,123,123,true,[b],123.0,ref,e");
 
-               assertString("a", t.get("default", Object.class));
-               assertJson(t.get("enum", Object.class), "['b']");
-               assertEquals("c", t.get("collectionFormat", Object.class));
-               assertEquals("d", t.get("description", Object.class));
-               assertString("e", t.get("example", Object.class));
-               assertTrue((Boolean)t.get("exclusiveMaximum", Object.class));
-               assertTrue((Boolean)t.get("exclusiveMinimum", Object.class));
-               assertEquals("g", t.get("format", Object.class));
-               assertJson(t.get("items", Object.class), "{type:'h'}");
-               assertEquals(123f, t.get("maximum", Object.class));
-               assertEquals(123, t.get("maxItems", Object.class));
-               assertEquals(123, t.get("maxLength", Object.class));
-               assertEquals(123f, t.get("minimum", Object.class));
-               assertEquals(123, t.get("minItems", Object.class));
-               assertEquals(123, t.get("minLength", Object.class));
-               assertEquals(123f, t.get("multipleOf", Object.class));
-               assertEquals("i", t.get("pattern", Object.class));
-               assertEquals("j", t.get("type", Object.class));
-               assertTrue((Boolean)t.get("uniqueItems", Object.class));
-               assertEquals("ref", t.get("$ref", Object.class));
+               assertMapped(t, (obj,prop) -> obj.get(prop, Object.class),
+                       
"default,collectionFormat,description,enum,example,exclusiveMaximum,exclusiveMinimum,format,items,maximum,maxItems,maxLength,minimum,minItems,minLength,multipleOf,pattern,type,uniqueItems,$ref",
+                       
"a,c,d,[b],e,true,true,g,{\"type\":\"h\"},123.0,123,123,123.0,123,123,123.0,i,j,true,ref");
 
                t.set("null", null).set(null, "null");
                assertNull(t.get("null", Object.class));
@@ -212,13 +193,15 @@ class HeaderInfo_Test extends SimpleTestBase {
                        .set("$ref", "ref")
                        .copy();
 
-               assertJson(t, 
"{description:'d',type:'j',format:'g',items:{type:'h'},collectionFormat:'c','default':'a',maximum:123.0,exclusiveMaximum:true,minimum:123.0,exclusiveMinimum:true,maxLength:123,minLength:123,pattern:'i',maxItems:123,minItems:123,uniqueItems:true,'enum':['b'],multipleOf:123.0,'$ref':'ref',example:'e'}");
+               assertBean(t,
+                       
"description,type,format,items{type},collectionFormat,default,maximum,exclusiveMaximum,minimum,exclusiveMinimum,maxLength,minLength,pattern,maxItems,minItems,uniqueItems,enum,multipleOf,ref,example",
+                       
"d,j,g,{h},c,a,123.0,true,123.0,true,123,123,i,123,123,true,[b],123.0,ref,e");
        }
 
        @Test void b03_keySet() {
                var t = new HeaderInfo();
 
-               assertJson(t.keySet(), "[]");
+               assertSet(t.keySet());
 
                t
                        .set("default", "a")
@@ -242,7 +225,7 @@ class HeaderInfo_Test extends SimpleTestBase {
                        .set("uniqueItems", true)
                        .set("$ref", "ref");
 
-               assertJson(t.keySet(), 
"['collectionFormat','default','description','enum','example','exclusiveMaximum','exclusiveMinimum','format','items','maximum','maxItems','maxLength','minimum','minItems','minLength','multipleOf','pattern','$ref','type','uniqueItems']");
+               assertSet(t.keySet(), 
"collectionFormat,default,description,enum,example,exclusiveMaximum,exclusiveMinimum,format,items,maximum,maxItems,maxLength,minimum,minItems,minLength,multipleOf,pattern,$ref,type,uniqueItems");
        }
 
        @Test void c01_strict() {
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/dto/swagger/Info_Test.java 
b/juneau-utest/src/test/java/org/apache/juneau/dto/swagger/Info_Test.java
index 08fcf69fa..cf2dd32d7 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/dto/swagger/Info_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/dto/swagger/Info_Test.java
@@ -31,15 +31,18 @@ class Info_Test extends SimpleTestBase {
         */
        @Test void a01_gettersAndSetters() {
                var t = new Info();
-               assertEquals("foo", t.setTitle("foo").getTitle());
+
+               // General
+               assertBean(
+                       
t.setTitle("a").setDescription("b").setTermsOfService("c").setContact(contact("d")).setLicense(license("e")).setVersion("f"),
+                       
"title,description,termsOfService,contact{name},license{name},version",
+                       "a,b,c,{d},{e},f"
+               );
+
+               // Edge cases for nulls.
                assertNull(t.setTitle(null).getTitle());
-               assertEquals("foo", t.setDescription("foo").getDescription());
                assertNull(t.setDescription(null).getDescription());
-               assertEquals("foo", 
t.setTermsOfService("foo").getTermsOfService());
                assertNull(t.setTermsOfService(null).getTermsOfService());
-               assertJson(t.setContact(contact("foo")).getContact(), 
"{name:'foo'}");
-               assertJson(t.setLicense(license("foo")).getLicense(), 
"{name:'foo'}");
-               assertEquals("foo", t.setVersion("foo").getVersion());
                assertNull(t.setVersion(null).getVersion());
        }
 
@@ -58,7 +61,10 @@ class Info_Test extends SimpleTestBase {
                        .set("version", "f")
                        .set("$ref", "ref");
 
-               assertJson(t, 
"{title:'e',description:'b',version:'f',contact:{name:'a'},license:{name:'c'},termsOfService:'d','$ref':'ref'}");
+               // Comprehensive object state validation
+               assertBean(t,
+                       
"title,description,version,contact{name},license{name},termsOfService,$ref",
+                       "e,b,f,{a},{c},d,ref");
 
                t
                        .set("contact", "{name:'a'}")
@@ -69,7 +75,9 @@ class Info_Test extends SimpleTestBase {
                        .set("version", "f")
                        .set("$ref", "ref");
 
-               assertJson(t, 
"{title:'e',description:'b',version:'f',contact:{name:'a'},license:{name:'c'},termsOfService:'d','$ref':'ref'}");
+               assertBean(t,
+                       
"title,description,version,contact{name},license{name},termsOfService,$ref",
+                       "e,b,f,{a},{c},d,ref");
 
                t
                        .set("contact", new StringBuilder("{name:'a'}"))
@@ -80,15 +88,13 @@ class Info_Test extends SimpleTestBase {
                        .set("version", new StringBuilder("f"))
                        .set("$ref", new StringBuilder("ref"));
 
-               assertJson(t, 
"{title:'e',description:'b',version:'f',contact:{name:'a'},license:{name:'c'},termsOfService:'d','$ref':'ref'}");
+               assertBean(t,
+                       
"title,description,version,contact{name},license{name},termsOfService,$ref",
+                       "e,b,f,{a},{c},d,ref");
 
-               assertEquals("{name:'a'}", t.get("contact", String.class));
-               assertEquals("b", t.get("description", String.class));
-               assertEquals("{name:'c'}", t.get("license", String.class));
-               assertEquals("d", t.get("termsOfService", String.class));
-               assertEquals("e", t.get("title", String.class));
-               assertEquals("f", t.get("version", String.class));
-               assertEquals("ref", t.get("$ref", String.class));
+               assertMapped(t, (obj,prop) -> obj.get(prop, String.class),
+                       
"contact,description,license,termsOfService,title,version,$ref",
+                       "{name:'a'},b,{name:'c'},d,e,f,ref");
 
                assertType(Contact.class, t.get("contact", Object.class));
                assertType(String.class, t.get("description", Object.class));
@@ -124,13 +130,15 @@ class Info_Test extends SimpleTestBase {
                        .set("$ref", "ref")
                        .copy();
 
-               assertJson(t, 
"{title:'e',description:'b',version:'f',contact:{name:'a'},license:{name:'c'},termsOfService:'d','$ref':'ref'}");
+               assertBean(t,
+                       
"title,description,version,contact{name},license{name},termsOfService,$ref",
+                       "e,b,f,{a},{c},d,ref");
        }
 
        @Test void b03_keySet() {
                var t = new Info();
 
-               assertJson(t.keySet(), "[]");
+               assertSet(t.keySet());
 
                t
                        .set("contact", contact("a"))
@@ -141,6 +149,6 @@ class Info_Test extends SimpleTestBase {
                        .set("version", "f")
                        .set("$ref", "ref");
 
-               assertJson(t.keySet(), 
"['contact','description','license','termsOfService','title','version','$ref']");
+               assertSet(t.keySet(), 
"contact,description,license,termsOfService,title,version,$ref");
        }
 }
\ No newline at end of file
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/dto/swagger/Items_Test.java 
b/juneau-utest/src/test/java/org/apache/juneau/dto/swagger/Items_Test.java
index 4d07511f8..7a774e1b6 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/dto/swagger/Items_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/dto/swagger/Items_Test.java
@@ -33,14 +33,14 @@ class Items_Test extends SimpleTestBase {
         */
        @Test void a01_gettersAndSetters() {
                var t = new Items();
-               assertEquals("foo", t.setType("foo").getType());
+               assertBean(t.setType("foo"), "type", "foo");
                assertNull(t.setType(null).getType());
-               assertEquals("foo", t.setFormat("foo").getFormat());
+               assertBean(t.setFormat("foo"), "format", "foo");
                assertNull(t.setFormat(null).getFormat());
                assertJson(t.setItems(items("foo")).getItems(), "{type:'foo'}");
-               assertEquals("foo", 
t.setCollectionFormat("foo").getCollectionFormat());
+               assertBean(t.setCollectionFormat("foo"), "collectionFormat", 
"foo");
                assertNull(t.setCollectionFormat(null).getCollectionFormat());
-               assertEquals("foo", t.setDefault("foo").getDefault());
+               assertBean(t.setDefault("foo"), "default", "foo");
                assertString("foo", t.setDefault(new 
StringBuilder("foo")).getDefault());
                assertNull(t.setDefault(null).getDefault());
                assertEquals(123, t.setMaximum(123).getMaximum());
@@ -51,7 +51,7 @@ class Items_Test extends SimpleTestBase {
                assertTrue(t.setExclusiveMinimum(true).getExclusiveMinimum());
                assertEquals(123, t.setMaxLength(123).getMaxLength());
                assertEquals(123, t.setMinLength(123).getMinLength());
-               assertEquals("foo", t.setPattern("foo").getPattern());
+               assertBean(t.setPattern("foo"), "pattern", "foo");
                assertNull(t.setPattern(null).getPattern());
                assertEquals(123, t.setMaxItems(123).getMaxItems());
                assertEquals(123, t.setMinItems(123).getMinItems());
@@ -138,24 +138,9 @@ class Items_Test extends SimpleTestBase {
 
                assertJson(t, 
"{type:'j',format:'g',items:{type:'h'},collectionFormat:'c','default':'a',maximum:123.0,exclusiveMaximum:true,minimum:123.0,exclusiveMinimum:true,maxLength:123,minLength:123,pattern:'i',maxItems:123,minItems:123,uniqueItems:true,'enum':['b'],multipleOf:123.0,'$ref':'ref'}");
 
-               assertEquals("a", t.get("default", String.class));
-               assertEquals("['b']", t.get("enum", String.class));
-               assertEquals("c", t.get("collectionFormat", String.class));
-               assertEquals("true", t.get("exclusiveMaximum", String.class));
-               assertEquals("true", t.get("exclusiveMinimum", String.class));
-               assertEquals("g", t.get("format", String.class));
-               assertEquals("{type:'h'}", t.get("items", String.class));
-               assertEquals("123.0", t.get("maximum", String.class));
-               assertEquals("123", t.get("maxItems", String.class));
-               assertEquals("123", t.get("maxLength", String.class));
-               assertEquals("123.0", t.get("minimum", String.class));
-               assertEquals("123", t.get("minItems", String.class));
-               assertEquals("123", t.get("minLength", String.class));
-               assertEquals("123.0", t.get("multipleOf", String.class));
-               assertEquals("i", t.get("pattern", String.class));
-               assertEquals("j", t.get("type", String.class));
-               assertEquals("true", t.get("uniqueItems", String.class));
-               assertEquals("ref", t.get("$ref", String.class));
+               assertMapped(t, (obj,prop) -> obj.get(prop, String.class),
+                       
"default,enum,collectionFormat,exclusiveMaximum,exclusiveMinimum,format,items,maximum,maxItems,maxLength,minimum,minItems,minLength,multipleOf,pattern,type,uniqueItems,$ref",
+                       
"a,['b'],c,true,true,g,{type:'h'},123.0,123,123,123.0,123,123,123.0,i,j,true,ref");
 
                assertType(StringBuilder.class, t.get("default", Object.class));
                assertType(Set.class, t.get("enum", Object.class));
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/dto/swagger/License_Test.java 
b/juneau-utest/src/test/java/org/apache/juneau/dto/swagger/License_Test.java
index 7c4d2220d..2e2dfd7de 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/dto/swagger/License_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/dto/swagger/License_Test.java
@@ -32,9 +32,16 @@ class License_Test extends SimpleTestBase {
         */
        @Test void a01_gettersAndSetters() {
                var t = new License();
-               assertEquals("foo", t.setName("foo").getName());
+
+               // General
+               assertBean(
+                       t.setName("a").setUrl(URI.create("http://b";)),
+                       "name,url",
+                       "a,http://b";
+               );
+
+               // Edge cases for nulls.
                assertNull(t.setName(null).getName());
-               assertString("foo", t.setUrl(URI.create("foo")).getUrl());
        }
 
        /**
@@ -48,25 +55,32 @@ class License_Test extends SimpleTestBase {
                        .set("url", URI.create("b"))
                        .set("$ref", "ref");
 
-               assertJson(t, "{name:'a',url:'b','$ref':'ref'}");
+               // Comprehensive object state validation
+               assertBean(t,
+                       "name,url,$ref",
+                       "a,b,ref");
 
                t
                        .set("name", "a")
                        .set("url", "b")
                        .set("$ref", "ref");
 
-               assertJson(t, "{name:'a',url:'b','$ref':'ref'}");
+               assertBean(t,
+                       "name,url,$ref",
+                       "a,b,ref");
 
                t
                        .set("name", new StringBuilder("a"))
                        .set("url", new StringBuilder("b"))
                        .set("$ref", new StringBuilder("ref"));
 
-               assertJson(t, "{name:'a',url:'b','$ref':'ref'}");
+               assertBean(t,
+                       "name,url,$ref",
+                       "a,b,ref");
 
-               assertEquals("a", t.get("name", String.class));
-               assertEquals("b", t.get("url", String.class));
-               assertEquals("ref", t.get("$ref", String.class));
+               assertMapped(t, (obj,prop) -> obj.get(prop, String.class),
+                       "name,url,$ref",
+                       "a,b,ref");
 
                assertType(String.class, t.get("name", Object.class));
                assertType(URI.class, t.get("url", Object.class));
@@ -94,19 +108,21 @@ class License_Test extends SimpleTestBase {
                        .set("$ref", "ref")
                        .copy();
 
-               assertJson(t, "{name:'a',url:'b','$ref':'ref'}");
+               assertBean(t,
+                       "name,url,$ref",
+                       "a,b,ref");
        }
 
        @Test void b03_keySet() {
                var t = new License();
 
-               assertJson(t.keySet(), "[]");
+               assertSet(t.keySet());
 
                t
                        .set("name", "a")
                        .set("url", URI.create("b"))
                        .set("$ref", "ref");
 
-               assertJson(t.keySet(), "['name','url','$ref']");
+               assertSet(t.keySet(), "name,url,$ref");
        }
 }
\ No newline at end of file
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/dto/swagger/Operation_Test.java 
b/juneau-utest/src/test/java/org/apache/juneau/dto/swagger/Operation_Test.java
index 7e46f379b..21b2a97ef 100644
--- 
a/juneau-utest/src/test/java/org/apache/juneau/dto/swagger/Operation_Test.java
+++ 
b/juneau-utest/src/test/java/org/apache/juneau/dto/swagger/Operation_Test.java
@@ -33,33 +33,32 @@ class Operation_Test extends SimpleTestBase {
         */
        @Test void a01_gettersAndSetters() {
                var t = new Operation();
-               assertJson(t.setTags(set("foo","bar")).getTags(), 
"['foo','bar']");
-               assertJson(t.setTags("bar","baz").getTags(), "['bar','baz']");
-               assertJson(t.setTags(set()).getTags(), "[]");
+
+               // General
+               assertBean(
+                       
t.setSummary("a").setDescription("b").setExternalDocs(externalDocumentation("c")).setOperationId("d")
+                       
.setOperationId("e").setDeprecated(true).setTags(set("f1","f2")).setConsumes(set(MediaType.of("text/foo")))
+                       
.setProduces(set(MediaType.of("text/foo"))).setParameters(set(parameterInfo("g1","g2"))).setResponses(map("1",responseInfo("h")))
+                       
.setSchemes(set("foo")).setSecurity(alist(map("foo",alist("bar")))),
+                       
"summary,description,externalDocs{url},operationId,deprecated,tags,consumes,produces,parameters{0{in,name}},responses{1{description}},schemes,security",
+                       
"a,b,{c},e,true,[f1,f2],[text/foo],[text/foo],{{g1,g2}},{{h}},[foo],[{foo=[bar]}]"
+               );
+
+               // Edge cases for collections.
+               assertSet(t.setTags(set()).getTags());
                assertNull(t.setTags((Collection<String>)null).getTags());
-               assertEquals("foo", t.setSummary("foo").getSummary());
-               assertEquals("foo", t.setDescription("foo").getDescription());
-               
assertJson(t.setExternalDocs(externalDocumentation("foo")).getExternalDocs(), 
"{url:'foo'}");
-               assertEquals("foo", t.setOperationId("foo").getOperationId());
-               
assertJson(t.setConsumes(set(MediaType.of("text/foo"))).getConsumes(), 
"['text/foo']");
-               assertJson(t.setConsumes(set()).getConsumes(), "[]");
+               assertSet(t.setConsumes(set()).getConsumes());
                
assertNull(t.setConsumes((Collection<MediaType>)null).getConsumes());
-               
assertJson(t.setProduces(set(MediaType.of("text/foo"))).getProduces(), 
"['text/foo']");
-               assertJson(t.setProduces(set()).getProduces(), "[]");
+               assertSet(t.setProduces(set()).getProduces());
                
assertNull(t.setProduces((Collection<MediaType>)null).getProduces());
-               
assertJson(t.setParameters(set(parameterInfo("foo","bar"))).getParameters(), 
"[{'in':'foo',name:'bar'}]");
-               assertJson(t.setParameters(set()).getParameters(), "[]");
+               assertList(t.setParameters(set()).getParameters());
                
assertNull(t.setParameters((Collection<ParameterInfo>)null).getParameters());
-               
assertJson(t.setResponses(map("123",responseInfo("bar"))).getResponses(), 
"{'123':{description:'bar'}}");
-               assertJson(t.setResponses(map()).getResponses(), "{}");
+               assertMap(t.setResponses(map()).getResponses());
                
assertNull(t.setResponses((Map<String,ResponseInfo>)null).getResponses());
-               assertJson(t.setSchemes(set("foo")).getSchemes(), "['foo']");
-               assertJson(t.setSchemes(set()).getSchemes(), "[]");
+               assertSet(t.setSchemes(set()).getSchemes());
                assertNull(t.setSchemes((Set<String>)null).getSchemes());
-               
assertJson(t.setSecurity(alist(map("foo",alist("bar")))).getSecurity(), 
"[{foo:['bar']}]");
-               assertJson(t.setSecurity(alist()).getSecurity(), "[]");
+               assertList(t.setSecurity(alist()).getSecurity());
                
assertNull(t.setSecurity((List<Map<String,List<String>>>)null).getSecurity());
-               assertTrue(t.setDeprecated(true).getDeprecated());
        }
 
        /**
@@ -81,9 +80,13 @@ class Operation_Test extends SimpleTestBase {
                        .set("security", set(map("i1",alist("i2"))))
                        .set("summary", "j")
                        .set("tags", set("k"))
-                       .set("$ref", "ref");
+                       .set("$ref", "l");  // Not a bean property but accessed 
through get(String) and set(String,Object).
 
-               assertJson(t, 
"{operationId:'d',summary:'j',description:'b',tags:['k'],externalDocs:{url:'c'},consumes:['text/a'],produces:['text/f'],parameters:[{'in':'e1',name:'e2'}],responses:{'1':{description:'g'}},schemes:['h'],deprecated:true,security:[{i1:['i2']}],'$ref':'ref'}");
+               assertBean(
+                       t,
+                       
"consumes,deprecated,description,externalDocs{url},operationId,parameters{0{in,name}},produces,responses{1{description}},schemes,security,summary,tags,$ref",
+                       
"[text/a],true,b,{c},d,{{e1,e2}},[text/f],{{g}},[h],[{i1=[i2]}],j,[k],l"
+               );
 
                t
                        .set("consumes", "['text/a']")
@@ -98,9 +101,13 @@ class Operation_Test extends SimpleTestBase {
                        .set("security", "[{i1:['i2']}]")
                        .set("summary", "j")
                        .set("tags", "['k']")
-                       .set("$ref", "ref");
+                       .set("$ref", "l");
 
-               assertJson(t, 
"{operationId:'d',summary:'j',description:'b',tags:['k'],externalDocs:{url:'c'},consumes:['text/a'],produces:['text/f'],parameters:[{'in':'e1',name:'e2'}],responses:{'1':{description:'g'}},schemes:['h'],deprecated:true,security:[{i1:['i2']}],'$ref':'ref'}");
+               assertBean(
+                       t,
+                       
"consumes,deprecated,description,externalDocs{url},operationId,parameters{0{in,name}},produces,responses{1{description}},schemes,security,summary,tags,$ref",
+                       
"[text/a],true,b,{c},d,{{e1,e2}},[text/f],{{g}},[h],[{i1=[i2]}],j,[k],l"
+               );
 
                t
                        .set("consumes", new StringBuilder("['text/a']"))
@@ -115,23 +122,19 @@ class Operation_Test extends SimpleTestBase {
                        .set("security", new StringBuilder("[{i1:['i2']}]"))
                        .set("summary", new StringBuilder("j"))
                        .set("tags", new StringBuilder("['k']"))
-                       .set("$ref", new StringBuilder("ref"));
-
-               assertJson(t, 
"{operationId:'d',summary:'j',description:'b',tags:['k'],externalDocs:{url:'c'},consumes:['text/a'],produces:['text/f'],parameters:[{'in':'e1',name:'e2'}],responses:{'1':{description:'g'}},schemes:['h'],deprecated:true,security:[{i1:['i2']}],'$ref':'ref'}");
-
-               assertEquals("['text/a']", t.get("consumes", String.class));
-               assertEquals("true", t.get("deprecated", String.class));
-               assertEquals("b", t.get("description", String.class));
-               assertEquals("{url:'c'}", t.get("externalDocs", String.class));
-               assertEquals("d", t.get("operationId", String.class));
-               assertEquals("[{'in':'e1',name:'e2'}]", t.get("parameters", 
String.class));
-               assertEquals("['text/f']", t.get("produces", String.class));
-               assertEquals("{'1':{description:'g'}}", t.get("responses", 
String.class));
-               assertEquals("['h']", t.get("schemes", String.class));
-               assertEquals("[{i1:['i2']}]", t.get("security", String.class));
-               assertEquals("j", t.get("summary", String.class));
-               assertEquals("['k']", t.get("tags", String.class));
-               assertEquals("ref", t.get("$ref", String.class));
+                       .set("$ref", new StringBuilder("l"));
+
+               assertBean(
+                       t,
+                       
"consumes,deprecated,description,externalDocs{url},operationId,parameters{0{in,name}},produces,responses{1{description}},schemes,security,summary,tags,$ref",
+                       
"[text/a],true,b,{c},d,{{e1,e2}},[text/f],{{g}},[h],[{i1=[i2]}],j,[k],l"
+               );
+
+               assertMapped(t,
+                       (obj,prop) -> obj.get(prop, String.class),
+                       
"consumes,deprecated,description,externalDocs,operationId,parameters,produces,responses,schemes,security,summary,tags,$ref",
+                       
"['text/a'],true,b,{url:'c'},d,[{'in':'e1',name:'e2'}],['text/f'],{'1':{description:'g'}},['h'],[{i1:['i2']}],j,['k'],l"
+               );
 
                assertType(Set.class, t.get("consumes", Object.class));
                assertType(MediaType.class, t.get("consumes", 
List.class).get(0));
@@ -181,16 +184,20 @@ class Operation_Test extends SimpleTestBase {
                        .set("security", set(map("i1",alist("i2"))))
                        .set("summary", "j")
                        .set("tags", set("k"))
-                       .set("$ref", "ref")
+                       .set("$ref", "l")
                        .copy();
 
-               assertJson(t, 
"{operationId:'d',summary:'j',description:'b',tags:['k'],externalDocs:{url:'c'},consumes:['text/a'],produces:['text/f'],parameters:[{'in':'e1',name:'e2'}],responses:{'1':{description:'g'}},schemes:['h'],deprecated:true,security:[{i1:['i2']}],'$ref':'ref'}");
+               assertBean(
+                       t,
+                       
"consumes,deprecated,description,externalDocs{url},operationId,parameters{0{in,name}},produces,responses{1{description}},schemes,security,summary,tags,$ref",
+                       
"[text/a],true,b,{c},d,{{e1,e2}},[text/f],{{g}},[h],[{i1=[i2]}],j,[k],l"
+               );
        }
 
        @Test void b03_keySet() {
                var t = new Operation();
 
-               assertJson(t.keySet(), "[]");
+               assertSet(t.keySet());
 
                t
                        .set("consumes", set(MediaType.of("text/a")))
@@ -207,8 +214,9 @@ class Operation_Test extends SimpleTestBase {
                        .set("tags", set("k"))
                        .set("$ref", "ref");
 
-               assertJson(t.keySet(),
-                       
"['consumes','deprecated','description','externalDocs','operationId','parameters','produces','responses','schemes','security','summary','tags','$ref']"
+               assertSet(
+                       t.keySet(),
+                       
"consumes","deprecated","description","externalDocs","operationId","parameters","produces","responses","schemes","security","summary","tags","$ref"
                );
        }
 }
\ No newline at end of file
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/dto/swagger/ParameterInfo_Test.java
 
b/juneau-utest/src/test/java/org/apache/juneau/dto/swagger/ParameterInfo_Test.java
index 91e966415..54fd3cba4 100644
--- 
a/juneau-utest/src/test/java/org/apache/juneau/dto/swagger/ParameterInfo_Test.java
+++ 
b/juneau-utest/src/test/java/org/apache/juneau/dto/swagger/ParameterInfo_Test.java
@@ -33,23 +33,23 @@ class ParameterInfo_Test extends SimpleTestBase {
         */
        @Test void a01_gettersAndSetters() {
                var t = new ParameterInfo();
-               assertEquals("foo", t.setName("foo").getName());
+               assertBean(t.setName("foo"), "name", "foo");
                assertNull(t.setName(null).getName());
-               assertEquals("foo", t.setIn("foo").getIn());
+               assertBean(t.setIn("foo"), "in", "foo");
                assertNull(t.setIn(null).getIn());
-               assertEquals("foo", t.setDescription("foo").getDescription());
+               assertBean(t.setDescription("foo"), "description", "foo");
                assertNull(t.setDescription(null).getDescription());
                assertTrue(t.setRequired(true).getRequired());
                
assertJson(t.setSchema(schemaInfo().setTitle("foo")).getSchema(), 
"{title:'foo'}");
-               assertEquals("foo", t.setType("foo").getType());
+               assertBean(t.setType("foo"), "type", "foo");
                assertNull(t.setType(null).getType());
-               assertEquals("foo", t.setFormat("foo").getFormat());
+               assertBean(t.setFormat("foo"), "format", "foo");
                assertNull(t.setFormat(null).getFormat());
                assertTrue(t.setAllowEmptyValue(true).getAllowEmptyValue());
                assertJson(t.setItems(items("foo")).getItems(), "{type:'foo'}");
-               assertEquals("foo", 
t.setCollectionFormat("foo").getCollectionFormat());
+               assertBean(t.setCollectionFormat("foo"), "collectionFormat", 
"foo");
                assertNull(t.setCollectionFormat(null).getCollectionFormat());
-               assertEquals("foo", t.setDefault("foo").getDefault());
+               assertBean(t.setDefault("foo"), "default", "foo");
                assertString("foo", t.setDefault(new 
StringBuilder("foo")).getDefault());
                assertNull(t.setDefault(null).getDefault());
                assertEquals(123, t.setMaximum(123).getMaximum());
@@ -60,7 +60,7 @@ class ParameterInfo_Test extends SimpleTestBase {
                assertTrue(t.setExclusiveMinimum(true).getExclusiveMinimum());
                assertEquals(123, t.setMaxLength(123).getMaxLength());
                assertEquals(123, t.setMinLength(123).getMinLength());
-               assertEquals("foo", t.setPattern("foo").getPattern());
+               assertBean(t.setPattern("foo"), "pattern", "foo");
                assertNull(t.setPattern(null).getPattern());
                assertEquals(123, t.setMaxItems(123).getMaxItems());
                assertEquals(123, t.setMinItems(123).getMinItems());
@@ -164,30 +164,9 @@ class ParameterInfo_Test extends SimpleTestBase {
 
                assertJson(t, 
"{'in':'f',name:'h',type:'k',description:'d',required:true,schema:{title:'j'},format:'e',allowEmptyValue:true,items:{type:'g'},collectionFormat:'c','default':'a',maximum:123.0,exclusiveMaximum:true,minimum:123.0,exclusiveMinimum:true,maxLength:123,minLength:123,pattern:'i',maxItems:123,minItems:123,uniqueItems:true,'enum':['b'],multipleOf:123.0,'$ref':'ref'}");
 
-               assertEquals("a", t.get("default", String.class));
-               assertEquals("['b']", t.get("enum", String.class));
-               assertEquals("true", t.get("allowEmptyValue", String.class));
-               assertEquals("c", t.get("collectionFormat", String.class));
-               assertEquals("d", t.get("description", String.class));
-               assertEquals("true", t.get("exclusiveMaximum", String.class));
-               assertEquals("true", t.get("exclusiveMinimum", String.class));
-               assertEquals("e", t.get("format", String.class));
-               assertEquals("f", t.get("in", String.class));
-               assertEquals("{type:'g'}", t.get("items", String.class));
-               assertEquals("123.0", t.get("maximum", String.class));
-               assertEquals("123", t.get("maxItems", String.class));
-               assertEquals("123", t.get("maxLength", String.class));
-               assertEquals("123.0", t.get("minimum", String.class));
-               assertEquals("123", t.get("minItems", String.class));
-               assertEquals("123", t.get("minLength", String.class));
-               assertEquals("123.0", t.get("multipleOf", String.class));
-               assertEquals("h", t.get("name", String.class));
-               assertEquals("i", t.get("pattern", String.class));
-               assertEquals("true", t.get("required", String.class));
-               assertEquals("{title:'j'}", t.get("schema", String.class));
-               assertEquals("k", t.get("type", String.class));
-               assertEquals("true", t.get("uniqueItems", String.class));
-               assertEquals("ref", t.get("$ref", String.class));
+               assertMapped(t, (obj,prop) -> obj.get(prop, String.class),
+                       
"default,enum,allowEmptyValue,collectionFormat,description,exclusiveMaximum,exclusiveMinimum,format,in,items,maximum,maxItems,maxLength,minimum,minItems,minLength,multipleOf,name,pattern,required,schema,type,uniqueItems,$ref",
+                       
"a,['b'],true,c,d,true,true,e,f,{type:'g'},123.0,123,123,123.0,123,123,123.0,h,i,true,{title:'j'},k,true,ref");
 
                assertType(StringBuilder.class, t.get("default", Object.class));
                assertType(Set.class, t.get("enum", Object.class));
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/dto/swagger/ResponseInfo_Test.java
 
b/juneau-utest/src/test/java/org/apache/juneau/dto/swagger/ResponseInfo_Test.java
index c7ea93b4f..96351c115 100644
--- 
a/juneau-utest/src/test/java/org/apache/juneau/dto/swagger/ResponseInfo_Test.java
+++ 
b/juneau-utest/src/test/java/org/apache/juneau/dto/swagger/ResponseInfo_Test.java
@@ -33,18 +33,23 @@ class ResponseInfo_Test extends SimpleTestBase {
         */
        @Test void a01_gettersAndSetters() {
                var t = new ResponseInfo();
-               assertEquals("foo", t.setDescription("foo").getDescription());
+
+               // General
+               assertBean(
+                       
t.setDescription("a").setSchema(schemaInfo().setTitle("b")).setHeaders(map("c",headerInfo("d"))).setExamples(map("e","f","g",alist("h"))),
+                       "description,schema{title},headers{c{type}},examples",
+                       "a,{b},{{d}},{e=f,g=[h]}"
+               );
+
+               // Edge cases for collections and nulls.
                assertNull(t.setDescription(null).getDescription());
-               
assertJson(t.setSchema(schemaInfo().setTitle("foo")).getSchema(), 
"{title:'foo'}");
-               
assertJson(t.setHeaders(map("foo",headerInfo("bar"))).getHeaders(), 
"{foo:{type:'bar'}}");
-               assertType(HeaderInfo.class, 
t.setHeaders(map("foo",headerInfo("bar"))).getHeaders().get("foo"));
-               assertJson(t.setHeaders(map()).getHeaders(), "{}");
+               assertMap(t.setHeaders(map()).getHeaders());
                
assertNull(t.setHeaders((Map<String,HeaderInfo>)null).getHeaders());
-               
assertJson(t.setExamples(map("foo","bar","baz",alist("qux"))).getExamples(), 
"{foo:'bar',baz:['qux']}");
-               assertJson(t.setExamples(map()).getExamples(), "{}");
+               assertMap(t.setExamples(map()).getExamples());
                
assertNull(t.setExamples((Map<String,Object>)null).getExamples());
-               
assertJson(t.setExamples(map("foo","bar","baz",alist("qux"))).getExamples(), 
"{foo:'bar',baz:['qux']}");
-               assertJson(t.setExamples(map()).addExample("text/a", 
"a").addExample("text/b", null).addExample(null, "c").getExamples(), 
"{'text/a':'a','text/b':null,null:'c'}");
+
+               // Examples addExample method.
+               assertMap(t.setExamples(map()).addExample("text/a", 
"a").addExample("text/b", null).addExample(null, "c").getExamples(), 
"text/a=a", "text/b=null", "null=c");
        }
 
        /**
@@ -60,7 +65,10 @@ class ResponseInfo_Test extends SimpleTestBase {
                        .set("schema", schemaInfo().setType("d"))
                        .set("$ref", "ref");
 
-               assertJson(t, 
"{description:'a',schema:{type:'d'},headers:{a:{type:'a1'}},examples:{foo:'bar',baz:['qux']},'$ref':'ref'}");
+               // Comprehensive object state validation
+               assertBean(t,
+                       
"description,schema{type},headers{a{type}},examples,$ref",
+                       "a,{d},{{a1}},{foo=bar,baz=[qux]},ref");
 
                t
                        .set("description", "a")
@@ -69,7 +77,9 @@ class ResponseInfo_Test extends SimpleTestBase {
                        .set("schema", "{type:'d'}")
                        .set("$ref", "ref");
 
-               assertJson(t, 
"{description:'a',schema:{type:'d'},headers:{a:{type:'a1'}},examples:{foo:'bar',baz:['qux']},'$ref':'ref'}");
+               assertBean(t,
+                       
"description,schema{type},headers{a{type}},examples,$ref",
+                       "a,{d},{{a1}},{foo=bar,baz=[qux]},ref");
 
                t
                        .set("description", new StringBuilder("a"))
@@ -78,13 +88,13 @@ class ResponseInfo_Test extends SimpleTestBase {
                        .set("schema", new StringBuilder("{type:'d'}"))
                        .set("$ref", new StringBuilder("ref"));
 
-               assertJson(t, 
"{description:'a',schema:{type:'d'},headers:{a:{type:'a1'}},examples:{foo:'bar',baz:['qux']},'$ref':'ref'}");
+               assertBean(t,
+                       
"description,schema{type},headers{a{type}},examples,$ref",
+                       "a,{d},{{a1}},{foo=bar,baz=[qux]},ref");
 
-               assertEquals("a", t.get("description", String.class));
-               assertEquals("{foo:'bar',baz:['qux']}", t.get("examples", 
String.class));
-               assertEquals("{a:{type:'a1'}}", t.get("headers", String.class));
-               assertEquals("{type:'d'}", t.get("schema", String.class));
-               assertEquals("ref", t.get("$ref", String.class));
+               assertMapped(t, (obj,prop) -> obj.get(prop, String.class),
+                       "description,examples,headers,schema,$ref",
+                       
"a,{foo:'bar',baz:['qux']},{a:{type:'a1'}},{type:'d'},ref");
 
                assertType(String.class, t.get("description", Object.class));
                assertType(Map.class, t.get("examples", Object.class));
@@ -117,13 +127,15 @@ class ResponseInfo_Test extends SimpleTestBase {
                        .set("$ref", "ref")
                        .copy();
 
-               assertJson(t, 
"{description:'a',schema:{type:'d'},headers:{a:{type:'a1'}},examples:{foo:'bar',baz:['qux']},'$ref':'ref'}");
+               assertBean(t,
+                       
"description,schema{type},headers{a{type}},examples,$ref",
+                       "a,{d},{{a1}},{foo=bar,baz=[qux]},ref");
        }
 
        @Test void b03_keySet() {
                var t = new ResponseInfo();
 
-               assertJson(t.keySet(), "[]");
+               assertSet(t.keySet());
 
                t
                        .set("description", "a")
@@ -132,6 +144,6 @@ class ResponseInfo_Test extends SimpleTestBase {
                        .set("schema", schemaInfo().setType("d"))
                        .set("$ref", "ref");
 
-               assertJson(t.keySet(), 
"['description','examples','headers','schema','$ref']");
+               assertSet(t.keySet(), 
"description,examples,headers,schema,$ref");
        }
 }
\ No newline at end of file
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/dto/swagger/SecurityScheme_Test.java
 
b/juneau-utest/src/test/java/org/apache/juneau/dto/swagger/SecurityScheme_Test.java
index f83fdf594..eb99d8162 100644
--- 
a/juneau-utest/src/test/java/org/apache/juneau/dto/swagger/SecurityScheme_Test.java
+++ 
b/juneau-utest/src/test/java/org/apache/juneau/dto/swagger/SecurityScheme_Test.java
@@ -32,22 +32,24 @@ class SecurityScheme_Test extends SimpleTestBase {
         */
        @Test void a01_gettersAndSetters() {
                var t = new SecurityScheme();
-               assertEquals("foo", t.setType("foo").getType());
+
+               // General
+               assertBean(
+                       
t.setType("a").setDescription("b").setName("c").setIn("d").setFlow("e")
+                       
.setAuthorizationUrl("f").setTokenUrl("g").setScopes(map("h1","h2")),
+                       
"type,description,name,in,flow,authorizationUrl,tokenUrl,scopes",
+                       "a,b,c,d,e,f,g,{h1=h2}"
+               );
+
+               // Edge cases for nulls and collections.
                assertNull(t.setType(null).getType());
-               assertEquals("foo", t.setDescription("foo").getDescription());
                assertNull(t.setDescription(null).getDescription());
-               assertEquals("foo", t.setName("foo").getName());
                assertNull(t.setName(null).getName());
-               assertEquals("foo", t.setIn("foo").getIn());
                assertNull(t.setIn(null).getIn());
-               assertEquals("foo", t.setFlow("foo").getFlow());
                assertNull(t.setFlow(null).getFlow());
-               assertEquals("foo", 
t.setAuthorizationUrl("foo").getAuthorizationUrl());
                assertNull(t.setAuthorizationUrl(null).getAuthorizationUrl());
-               assertEquals("foo", t.setTokenUrl("foo").getTokenUrl());
                assertNull(t.setTokenUrl(null).getTokenUrl());
-               assertJson(t.setScopes(map("foo","bar")).getScopes(), 
"{foo:'bar'}");
-               assertJson(t.setScopes(map()).getScopes(), "{}");
+               assertMap(t.setScopes(map()).getScopes());
                assertNull(t.setScopes((Map<String,String>)null).getScopes());
        }
 
@@ -68,7 +70,10 @@ class SecurityScheme_Test extends SimpleTestBase {
                        .set("type", "g")
                        .set("$ref", "ref");
 
-               assertJson(t, 
"{type:'g',description:'b',name:'e','in':'d',flow:'c',authorizationUrl:'a',tokenUrl:'f',scopes:{foo:'bar'},'$ref':'ref'}");
+               // Comprehensive object state validation
+               assertBean(t,
+                       
"type,description,name,in,flow,authorizationUrl,tokenUrl,scopes,$ref",
+                       "g,b,e,d,c,a,f,{foo=bar},ref");
 
                t
                        .set("authorizationUrl", "a")
@@ -81,7 +86,9 @@ class SecurityScheme_Test extends SimpleTestBase {
                        .set("type", "g")
                        .set("$ref", "ref");
 
-               assertJson(t, 
"{type:'g',description:'b',name:'e','in':'d',flow:'c',authorizationUrl:'a',tokenUrl:'f',scopes:{foo:'bar'},'$ref':'ref'}");
+               assertBean(t,
+                       
"type,description,name,in,flow,authorizationUrl,tokenUrl,scopes,$ref",
+                       "g,b,e,d,c,a,f,{foo=bar},ref");
 
                t
                        .set("authorizationUrl", new StringBuilder("a"))
@@ -94,17 +101,13 @@ class SecurityScheme_Test extends SimpleTestBase {
                        .set("type", new StringBuilder("g"))
                        .set("$ref", new StringBuilder("ref"));
 
-               assertJson(t, 
"{type:'g',description:'b',name:'e','in':'d',flow:'c',authorizationUrl:'a',tokenUrl:'f',scopes:{foo:'bar'},'$ref':'ref'}");
+               assertBean(t,
+                       
"type,description,name,in,flow,authorizationUrl,tokenUrl,scopes,$ref",
+                       "g,b,e,d,c,a,f,{foo=bar},ref");
 
-               assertEquals("a", t.get("authorizationUrl", String.class));
-               assertEquals("b", t.get("description", String.class));
-               assertEquals("c", t.get("flow", String.class));
-               assertEquals("d", t.get("in", String.class));
-               assertEquals("e", t.get("name", String.class));
-               assertEquals("{foo:'bar'}", t.get("scopes", String.class));
-               assertEquals("f", t.get("tokenUrl", String.class));
-               assertEquals("g", t.get("type", String.class));
-               assertEquals("ref", t.get("$ref", String.class));
+               assertMapped(t, (obj,prop) -> obj.get(prop, String.class),
+                       
"authorizationUrl,description,flow,in,name,scopes,tokenUrl,type,$ref",
+                       "a,b,c,d,e,{foo:'bar'},f,g,ref");
 
                assertType(String.class, t.get("authorizationUrl", 
Object.class));
                assertType(String.class, t.get("description", Object.class));
@@ -144,13 +147,15 @@ class SecurityScheme_Test extends SimpleTestBase {
                        .set("$ref", "ref")
                        .copy();
 
-               assertJson(t, 
"{type:'g',description:'b',name:'e','in':'d',flow:'c',authorizationUrl:'a',tokenUrl:'f',scopes:{foo:'bar'},'$ref':'ref'}");
+               assertBean(t,
+                       
"type,description,name,in,flow,authorizationUrl,tokenUrl,scopes,$ref",
+                       "g,b,e,d,c,a,f,{foo=bar},ref");
        }
 
        @Test void b03_keySet() {
                var t = new SecurityScheme();
 
-               assertJson(t.keySet(), "[]");
+               assertSet(t.keySet());
 
                t
                        .set("authorizationUrl", "a")
@@ -163,6 +168,6 @@ class SecurityScheme_Test extends SimpleTestBase {
                        .set("type", "g")
                        .set("$ref", "ref");
 
-               assertJson(t.keySet(), 
"['authorizationUrl','description','flow','in','name','scopes','tokenUrl','type','$ref']");
+               assertSet(t.keySet(), 
"authorizationUrl,description,flow,in,name,scopes,tokenUrl,type,$ref");
        }
 }
\ No newline at end of file
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/dto/swagger/Tag_Test.java 
b/juneau-utest/src/test/java/org/apache/juneau/dto/swagger/Tag_Test.java
index 0fe078a40..5df98afa1 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/dto/swagger/Tag_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/dto/swagger/Tag_Test.java
@@ -32,11 +32,17 @@ class Tag_Test extends SimpleTestBase {
         */
        @Test void a01_gettersAndSetters() {
                var t = new Tag();
-               assertEquals("foo", t.setName("foo").getName());
+
+               // General
+               assertBean(
+                       
t.setName("a").setDescription("b").setExternalDocs(externalDocumentation("c")),
+                       "name,description,externalDocs{url}",
+                       "a,b,{c}"
+               );
+
+               // Edge cases for nulls.
                assertNull(t.setName(null).getName());
-               assertEquals("foo", t.setDescription("foo").getDescription());
                assertNull(t.setDescription(null).getDescription());
-               
assertJson(t.setExternalDocs(externalDocumentation("foo")).getExternalDocs(), 
"{url:'foo'}");
        }
 
        /**
@@ -51,7 +57,10 @@ class Tag_Test extends SimpleTestBase {
                        .set("name", "c")
                        .set("$ref", "ref");
 
-               assertJson(t, 
"{name:'c',description:'a',externalDocs:{url:'b'},'$ref':'ref'}");
+               // Comprehensive object state validation
+               assertBean(t,
+                       "name,description,externalDocs{url},$ref",
+                       "c,a,{b},ref");
 
                t
                        .set("description", "a")
@@ -59,7 +68,9 @@ class Tag_Test extends SimpleTestBase {
                        .set("name", "c")
                        .set("$ref", "ref");
 
-               assertJson(t, 
"{name:'c',description:'a',externalDocs:{url:'b'},'$ref':'ref'}");
+               assertBean(t,
+                       "name,description,externalDocs{url},$ref",
+                       "c,a,{b},ref");
 
                t
                        .set("description", new StringBuilder("a"))
@@ -67,12 +78,13 @@ class Tag_Test extends SimpleTestBase {
                        .set("name", new StringBuilder("c"))
                        .set("$ref", new StringBuilder("ref"));
 
-               assertJson(t, 
"{name:'c',description:'a',externalDocs:{url:'b'},'$ref':'ref'}");
+               assertBean(t,
+                       "name,description,externalDocs{url},$ref",
+                       "c,a,{b},ref");
 
-               assertEquals("a", t.get("description", String.class));
-               assertEquals("{url:'b'}", t.get("externalDocs", String.class));
-               assertEquals("c", t.get("name", String.class));
-               assertEquals("ref", t.get("$ref", String.class));
+               assertMapped(t, (obj,prop) -> obj.get(prop, String.class),
+                       "description,externalDocs,name,$ref",
+                       "a,{url:'b'},c,ref");
 
                assertType(String.class, t.get("description", Object.class));
                assertType(ExternalDocumentation.class, t.get("externalDocs", 
Object.class));
@@ -102,13 +114,15 @@ class Tag_Test extends SimpleTestBase {
                        .set("$ref", "ref")
                        .copy();
 
-               assertJson(t, 
"{name:'c',description:'a',externalDocs:{url:'b'},'$ref':'ref'}");
+               assertBean(t,
+                       "name,description,externalDocs{url},$ref",
+                       "c,a,{b},ref");
        }
 
        @Test void b03_keySet() {
                var t = new Tag();
 
-               assertJson(t.keySet(), "[]");
+               assertSet(t.keySet());
 
                t
                        .set("description", "a")
@@ -116,6 +130,6 @@ class Tag_Test extends SimpleTestBase {
                        .set("name", "c")
                        .set("$ref", "ref");
 
-               assertJson(t.keySet(), 
"['description','externalDocs','name','$ref']");
+               assertSet(t.keySet(), "description,externalDocs,name,$ref");
        }
 }
\ No newline at end of file
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/dto/swagger/Xml_Test.java 
b/juneau-utest/src/test/java/org/apache/juneau/dto/swagger/Xml_Test.java
index a583aa996..e9b1c9b73 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/dto/swagger/Xml_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/dto/swagger/Xml_Test.java
@@ -30,14 +30,18 @@ class Xml_Test extends SimpleTestBase {
         */
        @Test void a01_gettersAndSetters() {
                var t = new Xml();
-               assertEquals("foo", t.setName("foo").getName());
+
+               // General
+               assertBean(
+                       
t.setName("a").setNamespace("b").setPrefix("c").setAttribute(true).setWrapped(true),
+                       "name,namespace,prefix,attribute,wrapped",
+                       "a,b,c,true,true"
+               );
+
+               // Edge cases for nulls.
                assertNull(t.setName(null).getName());
-               assertEquals("foo", t.setNamespace("foo").getNamespace());
                assertNull(t.setNamespace(null).getNamespace());
-               assertEquals("foo", t.setPrefix("foo").getPrefix());
                assertNull(t.setPrefix(null).getPrefix());
-               assertTrue(t.setAttribute(true).getAttribute());
-               assertTrue(t.setWrapped(true).getWrapped());
        }
 
        /**
@@ -54,7 +58,10 @@ class Xml_Test extends SimpleTestBase {
                        .set("wrapped", true)
                        .set("$ref", "ref");
 
-               assertJson(t, 
"{name:'a',namespace:'b',prefix:'c',attribute:true,wrapped:true,'$ref':'ref'}");
+               // Comprehensive object state validation
+               assertBean(t,
+                       "name,namespace,prefix,attribute,wrapped,$ref",
+                       "a,b,c,true,true,ref");
 
                t
                        .set("attribute", "true")
@@ -64,7 +71,9 @@ class Xml_Test extends SimpleTestBase {
                        .set("wrapped", "true")
                        .set("$ref", "ref");
 
-               assertJson(t, 
"{name:'a',namespace:'b',prefix:'c',attribute:true,wrapped:true,'$ref':'ref'}");
+               assertBean(t,
+                       "name,namespace,prefix,attribute,wrapped,$ref",
+                       "a,b,c,true,true,ref");
 
                t
                        .set("attribute", new StringBuilder("true"))
@@ -74,14 +83,13 @@ class Xml_Test extends SimpleTestBase {
                        .set("wrapped", new StringBuilder("true"))
                        .set("$ref", new StringBuilder("ref"));
 
-               assertJson(t, 
"{name:'a',namespace:'b',prefix:'c',attribute:true,wrapped:true,'$ref':'ref'}");
+               assertBean(t,
+                       "name,namespace,prefix,attribute,wrapped,$ref",
+                       "a,b,c,true,true,ref");
 
-               assertEquals("true", t.get("attribute", String.class));
-               assertEquals("a", t.get("name", String.class));
-               assertEquals("b", t.get("namespace", String.class));
-               assertEquals("c", t.get("prefix", String.class));
-               assertEquals("true", t.get("wrapped", String.class));
-               assertEquals("ref", t.get("$ref", String.class));
+               assertMapped(t, (obj,prop) -> obj.get(prop, String.class),
+                       "attribute,name,namespace,prefix,wrapped,$ref",
+                       "true,a,b,c,true,ref");
 
                assertType(Boolean.class, t.get("attribute", Object.class));
                assertType(String.class, t.get("name", Object.class));
@@ -115,13 +123,15 @@ class Xml_Test extends SimpleTestBase {
                        .set("$ref", "ref")
                        .copy();
 
-               assertJson(t, 
"{name:'a',namespace:'b',prefix:'c',attribute:true,wrapped:true,'$ref':'ref'}");
+               assertBean(t,
+                       "name,namespace,prefix,attribute,wrapped,$ref",
+                       "a,b,c,true,true,ref");
        }
 
        @Test void b03_keySet() {
                var t = new Xml();
 
-               assertJson(t.keySet(), "[]");
+               assertSet(t.keySet());
 
                t
                        .set("attribute", true)
@@ -131,6 +141,6 @@ class Xml_Test extends SimpleTestBase {
                        .set("wrapped", true)
                        .set("$ref", "ref");
 
-               assertJson(t.keySet(), 
"['attribute','name','namespace','prefix','wrapped','$ref']");
+               assertSet(t.keySet(), 
"attribute,name,namespace,prefix,wrapped,$ref");
        }
 }
\ No newline at end of file
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/http/remote/RrpcInterface_Test.java
 
b/juneau-utest/src/test/java/org/apache/juneau/http/remote/RrpcInterface_Test.java
index 9512f7e19..4fc710d53 100644
--- 
a/juneau-utest/src/test/java/org/apache/juneau/http/remote/RrpcInterface_Test.java
+++ 
b/juneau-utest/src/test/java/org/apache/juneau/http/remote/RrpcInterface_Test.java
@@ -564,89 +564,89 @@ class RrpcInterface_Test extends SimpleTestBase {
 
                                @Override
                                public void setInt3dArray(int[][][] v) {
-                                       assertJson(v, "[[[1,2],null],null]");
+                                       assertArray(v, "[[1,2],null]", null);
                                }
 
                                @Override
                                public void setInteger3dArray(Integer[][][] v) {
-                                       assertJson(v, "[[[1,null],null],null]");
+                                       assertArray(v, "[[1,null],null]", null);
                                }
 
                                @Override
                                public void setString3dArray(String[][][] v) {
-                                       assertJson(v, 
"[[['foo',null],null],null]");
+                                       assertArray(v, "[[foo,null],null]", 
null);
                                }
 
                                @Override
                                public void setIntegerList(List<Integer> v) {
-                                       assertJson(v, "[1,null]");
+                                       assertList(v, "1", null);
                                        assertType(Integer.class, v.get(0));
                                }
 
                                @Override
                                public void 
setInteger3dList(List<List<List<Integer>>> v) {
-                                       assertJson(v, "[[[1,null],null],null]");
+                                       assertList(v, "[[1,null],null]", null);
                                        assertType(Integer.class, 
v.get(0).get(0).get(0));
                                }
 
                                @Override
                                public void 
setInteger1d3dList(List<Integer[][][]> v) {
-                                       assertJson(v, 
"[[[[1,null],null],null],null]");
+                                       assertList(v, "[[[1,null],null],null]", 
null);
                                        assertType(Integer[][][].class, 
v.get(0));
                                        assertType(Integer.class, 
v.get(0)[0][0][0]);
                                }
 
                                @Override
                                public void setInt1d3dList(List<int[][][]> v) {
-                                       assertJson(v, 
"[[[[1,2],null],null],null]");
+                                       assertList(v, "[[[1,2],null],null]", 
null);
                                        assertType(int[][][].class, v.get(0));
                                }
 
                                @Override
                                public void setStringList(List<String> v) {
-                                       assertJson(v, "['foo','bar',null]");
+                                       assertList(v, "foo", "bar", null);
                                }
 
                                // Beans
 
                                @Override
                                public void setBean(ABean v) {
-                                       assertJson(v, "{a:1,b:'foo'}");
+                                       assertBean(v, "a,b", "1,foo");
                                }
 
                                @Override
                                public void setBean3dArray(ABean[][][] v) {
-                                       assertJson(v, 
"[[[{a:1,b:'foo'},null],null],null]");
+                                       assertArray(v, 
"[[{a:1,b:'foo'},null],null]",null);
                                }
 
                                @Override
                                public void setBeanList(List<ABean> v) {
-                                       assertJson(v, "[{a:1,b:'foo'}]");
+                                       assertList(v, ">{a:1,b:'foo'}");  // 
'>' tells assertList to treat comma literally.
                                }
 
                                @Override
                                public void setBean1d3dList(List<ABean[][][]> 
v) {
-                                       assertJson(v, 
"[[[[{a:1,b:'foo'},null],null],null],null]");
+                                       assertList(v, 
"[[[{a:1,b:'foo'},null],null],null]", null);
                                }
 
                                @Override
                                public void setBeanMap(Map<String,ABean> v) {
-                                       assertJson(v, "{foo:{a:1,b:'foo'}}");
+                                       assertMap(v, ">foo={a:1,b:'foo'}");
                                }
 
                                @Override
                                public void 
setBeanListMap(Map<String,List<ABean>> v) {
-                                       assertJson(v, "{foo:[{a:1,b:'foo'}]}");
+                                       assertMap(v, ">foo=[{a:1,b:'foo'}]");
                                }
 
                                @Override
                                public void 
setBean1d3dListMap(Map<String,List<ABean[][][]>> v) {
-                                       assertJson(v, 
"{foo:[[[[{a:1,b:'foo'},null],null],null],null]}");
+                                       assertMap(v, 
">foo=[[[[{a:1,b:'foo'},null],null],null],null]");
                                }
 
                                @Override
                                public void 
setBeanListMapIntegerKeys(Map<Integer,List<ABean>> v) {
-                                       assertJson(v, "{'1':[{a:1,b:'foo'}]}"); 
 // Note: JsonSerializer serializes key as string.
+                                       assertMap(v, ">1=[{a:1,b:'foo'}]");
                                        assertType(Integer.class, 
v.keySet().iterator().next());
                                }
 
@@ -654,49 +654,49 @@ class RrpcInterface_Test extends SimpleTestBase {
 
                                @Override
                                public void setTypedBean(TypedBean v) {
-                                       assertJson(v, "{a:1,b:'foo'}");
+                                       assertBean(v, "a,b", "1,foo");
                                        assertType(TypedBeanImpl.class, v);
                                }
 
                                @Override
                                public void setTypedBean3dArray(TypedBean[][][] 
v) {
-                                       assertJson(v, 
"[[[{a:1,b:'foo'},null],null],null]");
+                                       assertArray(v, 
"[[a:1;b:foo,null],null]" ,null);  // Testing serialization here.
                                        assertType(TypedBeanImpl.class, 
v[0][0][0]);
                                }
 
                                @Override
                                public void setTypedBeanList(List<TypedBean> v) 
{
-                                       assertJson(v, "[{a:1,b:'foo'}]");
+                                       assertList(v, "a:1;b:foo");
                                        assertType(TypedBeanImpl.class, 
v.get(0));
                                }
 
                                @Override
                                public void 
setTypedBean1d3dList(List<TypedBean[][][]> v) {
-                                       assertJson(v, 
"[[[[{a:1,b:'foo'},null],null],null],null]");
+                                       assertList(v, 
"[[[a:1;b:foo,null],null],null]", null);
                                        assertType(TypedBeanImpl.class, 
v.get(0)[0][0][0]);
                                }
 
                                @Override
                                public void 
setTypedBeanMap(Map<String,TypedBean> v) {
-                                       assertJson(v, "{foo:{a:1,b:'foo'}}");
+                                       assertMap(v, "foo=a:1;b:foo");
                                        assertType(TypedBeanImpl.class, 
v.get("foo"));
                                }
 
                                @Override
                                public void 
setTypedBeanListMap(Map<String,List<TypedBean>> v) {
-                                       assertJson(v, "{foo:[{a:1,b:'foo'}]}");
+                                       assertMap(v, "foo=[a:1;b:foo]");
                                        assertType(TypedBeanImpl.class, 
v.get("foo").get(0));
                                }
 
                                @Override
                                public void 
setTypedBean1d3dListMap(Map<String,List<TypedBean[][][]>> v) {
-                                       assertJson(v, 
"{foo:[[[[{a:1,b:'foo'},null],null],null],null]}");
+                                       assertMap(v, 
">foo=[[[[a:1;b:foo,null],null],null],null]");
                                        assertType(TypedBeanImpl.class, 
v.get("foo").get(0)[0][0][0]);
                                }
 
                                @Override
                                public void 
setTypedBeanListMapIntegerKeys(Map<Integer,List<TypedBean>> v) {
-                                       assertJson(v, "{'1':[{a:1,b:'foo'}]}"); 
 // Note: JsonSerializer serializes key as string.
+                                       assertMap(v, "1=[a:1;b:foo]");
                                        assertType(TypedBeanImpl.class, 
v.get(1).get(0));
                                }
 
@@ -709,13 +709,13 @@ class RrpcInterface_Test extends SimpleTestBase {
 
                                @Override
                                public void 
setSwappedObject3dArray(SwappedObject[][][] v) {
-                                       assertJson(v, 
"[[['"+SWAP+"',null],null],null]");
+                                       assertArray(v, 
"[[wasUnswapped:true,null],null]" ,null);
                                        assertTrue(v[0][0][0].wasUnswapped);
                                }
 
                                @Override
                                public void 
setSwappedObjectMap(Map<SwappedObject,SwappedObject> v) {
-                                       assertJson(v, 
"{'"+SWAP+"':'"+SWAP+"'}");
+                                       assertMap(v, 
"wasUnswapped:true=wasUnswapped:true");
                                        var e = v.entrySet().iterator().next();
                                        assertTrue(e.getKey().wasUnswapped);
                                        assertTrue(e.getValue().wasUnswapped);
@@ -723,7 +723,7 @@ class RrpcInterface_Test extends SimpleTestBase {
 
                                @Override
                                public void 
setSwappedObject3dMap(Map<SwappedObject,SwappedObject[][][]> v) {
-                                       assertJson(v, 
"{'"+SWAP+"':[[['"+SWAP+"',null],null],null]}");
+                                       assertMap(v, 
">wasUnswapped:true=[[[wasUnswapped:true,null],null],null]");
                                        var e = v.entrySet().iterator().next();
                                        assertTrue(e.getKey().wasUnswapped);
                                        
assertTrue(e.getValue()[0][0][0].wasUnswapped);
@@ -738,13 +738,13 @@ class RrpcInterface_Test extends SimpleTestBase {
 
                                @Override
                                public void 
setImplicitSwappedObject3dArray(ImplicitSwappedObject[][][] v) {
-                                       assertJson(v, 
"[[['"+SWAP+"',null],null],null]");
+                                       assertArray(v, 
"[["+SWAP+",null],null]", null);
                                        assertTrue(v[0][0][0].wasUnswapped);
                                }
 
                                @Override
                                public void 
setImplicitSwappedObjectMap(Map<ImplicitSwappedObject,ImplicitSwappedObject> v) 
{
-                                       assertJson(v, 
"{'"+SWAP+"':'"+SWAP+"'}");
+                                       assertMap(v, ">"+SWAP+"="+SWAP);
                                        var e = v.entrySet().iterator().next();
                                        assertTrue(e.getKey().wasUnswapped);
                                        assertTrue(e.getValue().wasUnswapped);
@@ -752,7 +752,7 @@ class RrpcInterface_Test extends SimpleTestBase {
 
                                @Override
                                public void 
setImplicitSwappedObject3dMap(Map<ImplicitSwappedObject,ImplicitSwappedObject[][][]>
 v) {
-                                       assertJson(v, 
"{'"+SWAP+"':[[['"+SWAP+"',null],null],null]}");
+                                       assertMap(v, 
">"+SWAP+"=[[["+SWAP+",null],null],null]");
                                        var e = v.entrySet().iterator().next();
                                        assertTrue(e.getKey().wasUnswapped);
                                        
assertTrue(e.getValue()[0][0][0].wasUnswapped);
@@ -767,30 +767,30 @@ class RrpcInterface_Test extends SimpleTestBase {
 
                                @Override
                                public void setEnum3d(TestEnum[][][] v) {
-                                       assertJson(v, 
"[[['TWO',null],null],null]");
+                                       assertArray(v, "[[TWO,null],null]", 
null);
                                }
 
                                @Override
                                public void setEnumList(List<TestEnum> v) {
-                                       assertJson(v, "['TWO',null]");
+                                       assertList(v, "TWO", null);
                                        assertType(TestEnum.class, v.get(0));
                                }
 
                                @Override
                                public void 
setEnum3dList(List<List<List<TestEnum>>> v) {
-                                       assertJson(v, 
"[[['TWO',null],null],null]");
+                                       assertList(v, "[[TWO,null],null]", 
null);
                                        assertType(TestEnum.class, 
v.get(0).get(0).get(0));
                                }
 
                                @Override
                                public void 
setEnum1d3dList(List<TestEnum[][][]> v) {
-                                       assertJson(v, 
"[[[['TWO',null],null],null],null]");
+                                       assertList(v, 
"[[[TWO,null],null],null]", null);
                                        assertType(TestEnum[][][].class, 
v.get(0));
                                }
 
                                @Override
                                public void setEnumMap(Map<TestEnum,TestEnum> 
v) {
-                                       assertJson(v, "{ONE:'TWO'}");
+                                       assertMap(v, "ONE=TWO");
                                        var e = v.entrySet().iterator().next();
                                        assertType(TestEnum.class, e.getKey());
                                        assertType(TestEnum.class, 
e.getValue());
@@ -798,7 +798,7 @@ class RrpcInterface_Test extends SimpleTestBase {
 
                                @Override
                                public void 
setEnum3dArrayMap(Map<TestEnum,TestEnum[][][]> v) {
-                                       assertJson(v, 
"{ONE:[[['TWO',null],null],null]}");
+                                       assertMap(v, 
">ONE=[[[TWO,null],null],null]");
                                        var e = v.entrySet().iterator().next();
                                        assertType(TestEnum.class, e.getKey());
                                        assertType(TestEnum[][][].class, 
e.getValue());
@@ -806,7 +806,7 @@ class RrpcInterface_Test extends SimpleTestBase {
 
                                @Override
                                public void 
setEnum1d3dListMap(Map<TestEnum,List<TestEnum[][][]>> v) {
-                                       assertJson(v, 
"{ONE:[[[['TWO',null],null],null],null]}");
+                                       assertMap(v, 
">ONE=[[[[TWO,null],null],null],null]");
                                        
Map.Entry<TestEnum,List<TestEnum[][][]>> e = v.entrySet().iterator().next();
                                        assertType(TestEnum.class, e.getKey());
                                        assertType(TestEnum[][][].class, 
e.getValue().get(0));
@@ -818,107 +818,107 @@ class RrpcInterface_Test extends SimpleTestBase {
 
                                @Override
                                public void setMultiParamsInts(int x1,int[][][] 
x2,int[][][] x2n,List<int[][][]> x3,List<int[][][]> x3n) {
-                                       assertJson(x1, "1");
-                                       assertJson(x2, "[[[1,2],null],null]");
+                                       assertEquals(1, x1);
+                                       assertArray(x2, "[[1,2],null]" ,null);
                                        assertNull(x2n);
-                                       assertJson(x3, 
"[[[[1,2],null],null],null]");
+                                       assertList(x3, "[[[1,2],null],null]", 
null);
                                        assertType(int[][][].class, x3.get(0));
                                        assertNull(x3n);
                                }
 
                                @Override
                                public void setMultiParamsInteger(Integer 
x1,Integer x1n,Integer[][][] x2,Integer[][][] x2n,List<Integer[][][]> 
x3,List<Integer[][][]> x3n) {
-                                       assertJson(x1, "1");
-                                       assertJson(x2, 
"[[[1,null],null],null]");
+                                       assertEquals((Integer)1, x1);
+                                       assertArray(x2, "[[1,null],null]", 
null);
                                        assertNull(x2n);
-                                       assertJson(x3, 
"[[[[1,null],null],null],null]");
+                                       assertList(x3, 
"[[[1,null],null],null]", null);
                                        assertType(Integer[][][].class, 
x3.get(0));
                                        assertNull(x3n);
                                }
 
                                @Override
                                public void setMultiParamsFloat(float 
x1,float[][][] x2,float[][][] x2n,List<float[][][]> x3,List<float[][][]> x3n) {
-                                       assertJson(x1, "1.0");
-                                       assertJson(x2, 
"[[[1.0,2.0],null],null]");
+                                       assertEquals(1.0f, x1, 0.1f);
+                                       assertArray(x2, "[[1.0,2.0],null]", 
null);
                                        assertNull(x2n);
-                                       assertJson(x3, 
"[[[[1.0,2.0],null],null],null]");
+                                       assertList(x3, 
"[[[1.0,2.0],null],null]", null);
                                        assertType(float[][][].class, 
x3.get(0));
                                        assertNull(x3n);
                                }
 
                                @Override
                                public void setMultiParamsFloatObject(Float 
x1,Float x1n,Float[][][] x2,Float[][][] x2n,List<Float[][][]> 
x3,List<Float[][][]> x3n) {
-                                       assertJson(x1, "1.0");
-                                       assertJson(x2, 
"[[[1.0,null],null],null]");
+                                       assertEquals(1.0f, x1, 0.1f);
+                                       assertArray(x2, "[[1.0,null],null]", 
null);
                                        assertNull(x2n);
-                                       assertJson(x3, 
"[[[[1.0,null],null],null],null]");
+                                       assertList(x3, 
"[[[1.0,null],null],null]", null);
                                        assertType(Float[][][].class, 
x3.get(0));
                                        assertNull(x3n);
                                }
 
                                @Override
                                public void setMultiParamsString(String 
x1,String[][][] x2,String[][][] x2n,List<String[][][]> x3,List<String[][][]> 
x3n) {
-                                       assertJson(x1, "'foo'");
-                                       assertJson(x2, 
"[[['foo',null],null],null]");
+                                       assertEquals("foo", x1);
+                                       assertArray(x2, "[[foo,null],null]", 
null);
                                        assertNull(x2n);
-                                       assertJson(x3, 
"[[[['foo',null],null],null],null]");
+                                       assertList(x3, 
"[[[foo,null],null],null]", null);
                                        assertType(String[][][].class, 
x3.get(0));
                                        assertNull(x3n);
                                }
 
                                @Override
                                public void setMultiParamsBean(ABean 
x1,ABean[][][] x2,ABean[][][] x2n,List<ABean[][][]> x3,List<ABean[][][]> 
x3n,Map<String,ABean> x4,Map<String,ABean> x4n,Map<String,List<ABean[][][]>> 
x5,Map<String,List<ABean[][][]>> x5n) {
-                                       assertJson(x1, "{a:1,b:'foo'}");
-                                       assertJson(x2, 
"[[[{a:1,b:'foo'},null],null],null]");
+                                       assertBean(x1, "a,b", "1,foo");
+                                       assertArray(x2, 
"[[{a:1,b:'foo'},null],null]", null);  // ABean toString converts it to JSON.
                                        assertNull(x2n);
-                                       assertJson(x3, 
"[[[[{a:1,b:'foo'},null],null],null],null]");
+                                       assertList(x3, 
"[[[{a:1,b:'foo'},null],null],null]", null);
                                        assertType(ABean[][][].class, 
x3.get(0));
                                        assertNull(x3n);
-                                       assertJson(x4, "{foo:{a:1,b:'foo'}}");
+                                       assertMap(x4, ">foo={a:1,b:'foo'}");
                                        assertNull(x4n);
-                                       assertJson(x5, 
"{foo:[[[[{a:1,b:'foo'},null],null],null],null]}");
+                                       assertMap(x5, 
">foo=[[[[{a:1,b:'foo'},null],null],null],null]");
                                        assertNull(x5n);
                                }
 
                                @Override
                                public void 
setMultiParamsSwappedObject(SwappedObject x1,SwappedObject[][][] 
x2,SwappedObject[][][] x2n,List<SwappedObject[][][]> 
x3,List<SwappedObject[][][]> x3n,Map<SwappedObject,SwappedObject> 
x4,Map<SwappedObject,SwappedObject> 
x4n,Map<SwappedObject,List<SwappedObject[][][]>> 
x5,Map<SwappedObject,List<SwappedObject[][][]>> x5n) {
-                                       assertJson(x1, "'"+SWAP+"'");
-                                       assertJson(x2, 
"[[['"+SWAP+"',null],null],null]");
+                                       assertTrue(x1.wasUnswapped);
+                                       assertArray(x2, 
"[[wasUnswapped:true,null],null]", null);
                                        assertNull(x2n);
-                                       assertJson(x3, 
"[[[['"+SWAP+"',null],null],null],null]");
+                                       assertList(x3, 
"[[[wasUnswapped:true,null],null],null]", null);
                                        assertType(SwappedObject[][][].class, 
x3.get(0));
                                        assertNull(x3n);
-                                       assertJson(x4, 
"{'"+SWAP+"':'"+SWAP+"'}");
+                                       assertMap(x4, 
"wasUnswapped:true=wasUnswapped:true");
                                        assertNull(x4n);
-                                       assertJson(x5, 
"{'"+SWAP+"':[[[['"+SWAP+"',null],null],null],null]}");
+                                       assertMap(x5, 
">wasUnswapped:true=[[[[wasUnswapped:true,null],null],null],null]");
                                        assertNull(x5n);
                                }
 
                                @Override
                                public void 
setMultiParamsImplicitSwappedObject(ImplicitSwappedObject 
x1,ImplicitSwappedObject[][][] x2,ImplicitSwappedObject[][][] 
x2n,List<ImplicitSwappedObject[][][]> x3,List<ImplicitSwappedObject[][][]> 
x3n,Map<ImplicitSwappedObject,ImplicitSwappedObject> 
x4,Map<ImplicitSwappedObject,ImplicitSwappedObject> 
x4n,Map<ImplicitSwappedObject,List<ImplicitSwappedObject[][][]>> 
x5,Map<ImplicitSwappedObject,List<ImplicitSwappedObject[][][]>> x5n) {
-                                       assertJson(x1, "'"+SWAP+"'");
-                                       assertJson(x2, 
"[[['"+SWAP+"',null],null],null]");
+                                       assertTrue(x1.wasUnswapped);
+                                       assertArray(x2, 
"[["+SWAP+",null],null]", null);
                                        assertNull(x2n);
-                                       assertJson(x3, 
"[[[['"+SWAP+"',null],null],null],null]");
+                                       assertList(x3, 
"[[["+SWAP+",null],null],null]", null);
                                        
assertType(ImplicitSwappedObject[][][].class, x3.get(0));
                                        assertNull(x3n);
-                                       assertJson(x4, 
"{'"+SWAP+"':'"+SWAP+"'}");
+                                       assertMap(x4, ">"+SWAP+"="+SWAP);
                                        assertNull(x4n);
-                                       assertJson(x5, 
"{'"+SWAP+"':[[[['"+SWAP+"',null],null],null],null]}");
+                                       assertMap(x5, 
">"+SWAP+"=[[[["+SWAP+",null],null],null],null]");
                                        assertNull(x5n);
                                }
 
                                @Override
                                public void setMultiParamsEnum(TestEnum 
x1,TestEnum[][][] x2,TestEnum[][][] x2n,List<TestEnum[][][]> 
x3,List<TestEnum[][][]> x3n,Map<TestEnum,TestEnum> x4,Map<TestEnum,TestEnum> 
x4n,Map<TestEnum,List<TestEnum[][][]>> x5,Map<TestEnum,List<TestEnum[][][]>> 
x5n) {
-                                       assertJson(x1, "'TWO'");
-                                       assertJson(x2, 
"[[['TWO',null],null],null]");
+                                       assertEquals(TestEnum.TWO, x1);
+                                       assertArray(x2, "[[TWO,null],null]", 
null);
                                        assertNull(x2n);
-                                       assertJson(x3, 
"[[[['TWO',null],null],null],null]");
+                                       assertList(x3, 
"[[[TWO,null],null],null]", null);
                                        assertType(TestEnum[][][].class, 
x3.get(0));
                                        assertNull(x3n);
-                                       assertJson(x4, "{ONE:'TWO'}");
+                                       assertMap(x4, "ONE=TWO");
                                        assertNull(x4n);
-                                       assertJson(x5, 
"{ONE:[[[['TWO',null],null],null],null]}");
+                                       assertMap(x5, 
">ONE=[[[[TWO,null],null],null],null]");
                                        assertNull(x5n);
                                }
                        };
@@ -981,26 +981,26 @@ class RrpcInterface_Test extends SimpleTestBase {
        @ParameterizedTest
        @MethodSource("input")
        void a09_returnInt3dArray(Input input) {
-               assertJson(input.proxy.returnInt3dArray(), 
"[[[1,2],null],null]");
+               assertArray(input.proxy.returnInt3dArray(), "[[1,2],null]", 
null);
        }
 
        @ParameterizedTest
        @MethodSource("input")
        void a10_returnInteger3dArray(Input input) {
-               assertJson(input.proxy.returnInteger3dArray(), 
"[[[1,null],null],null]");
+               assertArray(input.proxy.returnInteger3dArray(), 
"[[1,null],null]", null);
        }
 
        @ParameterizedTest
        @MethodSource("input")
        void a11_returnString3dArray(Input input) {
-               assertJson(input.proxy.returnString3dArray(), 
"[[['foo','bar',null],null],null]");
+               assertArray(input.proxy.returnString3dArray(), 
"[[foo,bar,null],null]", null);
        }
 
        @ParameterizedTest
        @MethodSource("input")
        void a12_returnIntegerList(Input input) {
                var x = input.proxy.returnIntegerList();
-               assertJson(x, "[1,null]");
+               assertList(x, "1", null);
                assertType(Integer.class, x.get(0));
        }
 
@@ -1008,7 +1008,7 @@ class RrpcInterface_Test extends SimpleTestBase {
        @MethodSource("input")
        void a13_returnInteger3dList(Input input) {
                var x = input.proxy.returnInteger3dList();
-               assertJson(x, "[[[1,null],null],null]");
+               assertList(x, "[[1,null],null]", null);
                assertType(Integer.class, x.get(0).get(0).get(0));
        }
 
@@ -1016,7 +1016,7 @@ class RrpcInterface_Test extends SimpleTestBase {
        @MethodSource("input")
        void a14_returnInteger1d3dList(Input input) {
                var x = input.proxy.returnInteger1d3dList();
-               assertJson(x, "[[[[1,null],null],null],null]");
+               assertList(x, "[[[1,null],null],null]", null);
                assertType(Integer.class, x.get(0)[0][0][0]);
        }
 
@@ -1024,14 +1024,14 @@ class RrpcInterface_Test extends SimpleTestBase {
        @MethodSource("input")
        void a15_returnInt1d3dList(Input input) {
                var x = input.proxy.returnInt1d3dList();
-               assertJson(x, "[[[[1,2],null],null],null]");
+               assertList(x, "[[[1,2],null],null]", null);
                assertType(int[][][].class, x.get(0));
        }
 
        @ParameterizedTest
        @MethodSource("input")
        void a16_returnStringList(Input input) {
-               assertJson(input.proxy.returnStringList(), 
"['foo','bar',null]");
+               assertList(input.proxy.returnStringList(), "foo", "bar", null);
        }
 
        // Beans
@@ -1040,7 +1040,7 @@ class RrpcInterface_Test extends SimpleTestBase {
        @MethodSource("input")
        void b01_returnBean(Input input) {
                var x = input.proxy.returnBean();
-               assertJson(x, "{a:1,b:'foo'}");
+               assertBean(x, "a,b", "1,foo");
                assertType(ABean.class, x);
        }
 
@@ -1048,7 +1048,7 @@ class RrpcInterface_Test extends SimpleTestBase {
        @MethodSource("input")
        void b02_returnBean3dArray(Input input) {
                var x = input.proxy.returnBean3dArray();
-               assertJson(x, "[[[{a:1,b:'foo'},null],null],null]");
+               assertArray(x, "[[{a:1,b:'foo'},null],null]", null);
                assertType(ABean.class, x[0][0][0]);
        }
 
@@ -1056,7 +1056,7 @@ class RrpcInterface_Test extends SimpleTestBase {
        @MethodSource("input")
        void b03_returnBeanList(Input input) {
                var x = input.proxy.returnBeanList();
-               assertJson(x, "[{a:1,b:'foo'}]");
+               assertList(x, ">{a:1,b:'foo'}");
                assertType(ABean.class, x.get(0));
        }
 
@@ -1064,7 +1064,7 @@ class RrpcInterface_Test extends SimpleTestBase {
        @MethodSource("input")
        void b04_returnBean1d3dList(Input input) {
                var x = input.proxy.returnBean1d3dList();
-               assertJson(x, "[[[[{a:1,b:'foo'},null],null],null],null]");
+               assertList(x, "[[[{a:1,b:'foo'},null],null],null]", null);
                assertType(ABean.class, x.get(0)[0][0][0]);
        }
 
@@ -1072,7 +1072,7 @@ class RrpcInterface_Test extends SimpleTestBase {
        @MethodSource("input")
        void b05_returnBeanMap(Input input) {
                var x = input.proxy.returnBeanMap();
-               assertJson(x, "{foo:{a:1,b:'foo'}}");
+               assertMap(x, ">foo={a:1,b:'foo'}");
                assertType(ABean.class, x.get("foo"));
        }
 
@@ -1080,7 +1080,7 @@ class RrpcInterface_Test extends SimpleTestBase {
        @MethodSource("input")
        void b06_returnBeanListMap(Input input) {
                var x = input.proxy.returnBeanListMap();
-               assertJson(x, "{foo:[{a:1,b:'foo'}]}");
+               assertMap(x, ">foo=[{a:1,b:'foo'}]");
                assertType(ABean.class, x.get("foo").get(0));
        }
 
@@ -1088,7 +1088,7 @@ class RrpcInterface_Test extends SimpleTestBase {
        @MethodSource("input")
        void b07_returnBean1d3dListMap(Input input) {
                var x = input.proxy.returnBean1d3dListMap();
-               assertJson(x, 
"{foo:[[[[{a:1,b:'foo'},null],null],null],null]}");
+               assertMap(x, ">foo=[[[[{a:1,b:'foo'},null],null],null],null]");
                assertType(ABean.class, x.get("foo").get(0)[0][0][0]);
        }
 
@@ -1097,7 +1097,7 @@ class RrpcInterface_Test extends SimpleTestBase {
        void b08_returnBeanListMapIntegerKeys(Input input) {
                // Note: JsonSerializer serializes key as string.
                var x = input.proxy.returnBeanListMapIntegerKeys();
-               assertJson(x, "{'1':[{a:1,b:'foo'}]}");
+               assertMap(x, ">1=[{a:1,b:'foo'}]");
                assertType(Integer.class, x.keySet().iterator().next());
        }
 
@@ -1107,7 +1107,7 @@ class RrpcInterface_Test extends SimpleTestBase {
        @MethodSource("input")
        void c01_returnTypedBean(Input input) {
                var x = input.proxy.returnTypedBean();
-               assertJson(x, "{a:1,b:'foo'}");
+               assertBean(x, "a,b", "1,foo");
                assertType(TypedBeanImpl.class, x);
        }
 
@@ -1115,7 +1115,7 @@ class RrpcInterface_Test extends SimpleTestBase {
        @MethodSource("input")
        void c02_returnTypedBean3dArray(Input input) {
                var x = input.proxy.returnTypedBean3dArray();
-               assertJson(x, "[[[{a:1,b:'foo'},null],null],null]");
+               assertArray(x, "[[a:1;b:foo,null],null]", null);
                assertType(TypedBeanImpl.class, x[0][0][0]);
        }
 
@@ -1123,7 +1123,7 @@ class RrpcInterface_Test extends SimpleTestBase {
        @MethodSource("input")
        void c03_returnTypedBeanList(Input input) {
                var x = input.proxy.returnTypedBeanList();
-               assertJson(x, "[{a:1,b:'foo'}]");
+               assertList(x, "a:1;b:foo");
                assertType(TypedBeanImpl.class, x.get(0));
        }
 
@@ -1131,7 +1131,7 @@ class RrpcInterface_Test extends SimpleTestBase {
        @MethodSource("input")
        void c04_returnTypedBean1d3dList(Input input) {
                var x = input.proxy.returnTypedBean1d3dList();
-               assertJson(x, "[[[[{a:1,b:'foo'},null],null],null],null]");
+               assertList(x, "[[[a:1;b:foo,null],null],null]", null);
                assertType(TypedBeanImpl.class, x.get(0)[0][0][0]);
        }
 
@@ -1139,7 +1139,7 @@ class RrpcInterface_Test extends SimpleTestBase {
        @MethodSource("input")
        void c05_returnTypedBeanMap(Input input) {
                var x = input.proxy.returnTypedBeanMap();
-               assertJson(x, "{foo:{a:1,b:'foo'}}");
+               assertMap(x, "foo=a:1;b:foo");
                assertType(TypedBeanImpl.class, x.get("foo"));
        }
 
@@ -1147,7 +1147,7 @@ class RrpcInterface_Test extends SimpleTestBase {
        @MethodSource("input")
        void c06_returnTypedBeanListMap(Input input) {
                var x = input.proxy.returnTypedBeanListMap();
-               assertJson(x, "{foo:[{a:1,b:'foo'}]}");
+               assertMap(x, "foo=[a:1;b:foo]");
                assertType(TypedBeanImpl.class, x.get("foo").get(0));
        }
 
@@ -1155,7 +1155,7 @@ class RrpcInterface_Test extends SimpleTestBase {
        @MethodSource("input")
        void c07_returnTypedBean1d3dListMap(Input input) {
                var x = input.proxy.returnTypedBean1d3dListMap();
-               assertJson(x, 
"{foo:[[[[{a:1,b:'foo'},null],null],null],null]}");
+               assertMap(x, ">foo=[[[[a:1;b:foo,null],null],null],null]");
                assertType(TypedBeanImpl.class, x.get("foo").get(0)[0][0][0]);
        }
 
@@ -1164,7 +1164,7 @@ class RrpcInterface_Test extends SimpleTestBase {
        void c08_returnTypedBeanListMapIntegerKeys(Input input) {
                // Note: JsonSerializer serializes key as string.
                var x = input.proxy.returnTypedBeanListMapIntegerKeys();
-               assertJson(x, "{'1':[{a:1,b:'foo'}]}");
+               assertMap(x, "1=[a:1;b:foo]");
                assertType(TypedBeanImpl.class, x.get(1).get(0));
        }
 
@@ -1174,7 +1174,6 @@ class RrpcInterface_Test extends SimpleTestBase {
        @MethodSource("input")
        void d01_returnSwappedObject(Input input) {
                var x = input.proxy.returnSwappedObject();
-               assertJson(x, "'"+SWAP+"'");
                assertTrue(x.wasUnswapped);
        }
 
@@ -1182,7 +1181,7 @@ class RrpcInterface_Test extends SimpleTestBase {
        @MethodSource("input")
        void d02_returnSwappedObject3dArray(Input input) {
                var x = input.proxy.returnSwappedObject3dArray();
-               assertJson(x, "[[['"+SWAP+"',null],null],null]");
+               assertArray(x, "[[wasUnswapped:true,null],null]", null);
                assertTrue(x[0][0][0].wasUnswapped);
        }
 
@@ -1190,7 +1189,7 @@ class RrpcInterface_Test extends SimpleTestBase {
        @MethodSource("input")
        void d03_returnSwappedObjectMap(Input input) {
                var x = input.proxy.returnSwappedObjectMap();
-               assertJson(x, "{'"+SWAP+"':'"+SWAP+"'}");
+               assertMap(x, "wasUnswapped:true=wasUnswapped:true");
                var e = x.entrySet().iterator().next();
                assertTrue(e.getKey().wasUnswapped);
                assertTrue(e.getValue().wasUnswapped);
@@ -1200,7 +1199,7 @@ class RrpcInterface_Test extends SimpleTestBase {
        @MethodSource("input")
        void d04_returnSwappedObject3dMap(Input input) {
                var x = input.proxy.returnSwappedObject3dMap();
-               assertJson(x, "{'"+SWAP+"':[[['"+SWAP+"',null],null],null]}");
+               assertMap(x, 
">wasUnswapped:true=[[[wasUnswapped:true,null],null],null]");
                var e = x.entrySet().iterator().next();
                assertTrue(e.getKey().wasUnswapped);
                assertTrue(e.getValue()[0][0][0].wasUnswapped);
@@ -1212,7 +1211,6 @@ class RrpcInterface_Test extends SimpleTestBase {
        @MethodSource("input")
        void e01_returnImplicitSwappedObject(Input input) {
                var x = input.proxy.returnImplicitSwappedObject();
-               assertJson(x, "'"+SWAP+"'");
                assertTrue(x.wasUnswapped);
        }
 
@@ -1220,7 +1218,7 @@ class RrpcInterface_Test extends SimpleTestBase {
        @MethodSource("input")
        void e02_returnImplicitSwappedObject3dArray(Input input) {
                var x = input.proxy.returnImplicitSwappedObject3dArray();
-               assertJson(x, "[[['"+SWAP+"',null],null],null]");
+               assertArray(x, "[["+SWAP+",null],null]", null);
                assertTrue(x[0][0][0].wasUnswapped);
        }
 
@@ -1228,7 +1226,7 @@ class RrpcInterface_Test extends SimpleTestBase {
        @MethodSource("input")
        void e03_returnImplicitSwappedObjectMap(Input input) {
                var x = input.proxy.returnImplicitSwappedObjectMap();
-               assertJson(x, "{'"+SWAP+"':'"+SWAP+"'}");
+               assertMap(x, ">"+SWAP+"="+SWAP);
                var e = x.entrySet().iterator().next();
                assertTrue(e.getKey().wasUnswapped);
                assertTrue(e.getValue().wasUnswapped);
@@ -1238,7 +1236,7 @@ class RrpcInterface_Test extends SimpleTestBase {
        @MethodSource("input")
        void e04_returnImplicitSwappedObject3dMap(Input input) {
                var x = input.proxy.returnImplicitSwappedObject3dMap();
-               assertJson(x, "{'"+SWAP+"':[[['"+SWAP+"',null],null],null]}");
+               assertMap(x, ">"+SWAP+"=[[["+SWAP+",null],null],null]");
                var e = x.entrySet().iterator().next();
                assertTrue(e.getKey().wasUnswapped);
                assertTrue(e.getValue()[0][0][0].wasUnswapped);
@@ -1250,14 +1248,14 @@ class RrpcInterface_Test extends SimpleTestBase {
        @MethodSource("input")
        void f01_returnEnum(Input input) {
                var x = input.proxy.returnEnum();
-               assertJson(x, "'TWO'");
+               assertEquals(TestEnum.TWO, x);
        }
 
        @ParameterizedTest
        @MethodSource("input")
        void f02_returnEnum3d(Input input) {
                var x = input.proxy.returnEnum3d();
-               assertJson(x, "[[['TWO',null],null],null]");
+               assertArray(x, "[[TWO,null],null]", null);
                assertType(TestEnum.class, x[0][0][0]);
        }
 
@@ -1265,7 +1263,7 @@ class RrpcInterface_Test extends SimpleTestBase {
        @MethodSource("input")
        void f03_returnEnumList(Input input) {
                var x = input.proxy.returnEnumList();
-               assertJson(x, "['TWO',null]");
+               assertList(x, "TWO", null);
                assertType(TestEnum.class, x.get(0));
        }
 
@@ -1273,7 +1271,7 @@ class RrpcInterface_Test extends SimpleTestBase {
        @MethodSource("input")
        void f04_returnEnum3dList(Input input) {
                var x = input.proxy.returnEnum3dList();
-               assertJson(x, "[[['TWO',null],null],null]");
+               assertList(x, "[[TWO,null],null]", null);
                assertType(TestEnum.class, x.get(0).get(0).get(0));
        }
 
@@ -1281,7 +1279,7 @@ class RrpcInterface_Test extends SimpleTestBase {
        @MethodSource("input")
        void f05_returnEnum1d3dList(Input input) {
                var x = input.proxy.returnEnum1d3dList();
-               assertJson(x, "[[[['TWO',null],null],null],null]");
+               assertList(x, "[[[TWO,null],null],null]", null);
                assertType(TestEnum[][][].class, x.get(0));
        }
 
@@ -1289,7 +1287,7 @@ class RrpcInterface_Test extends SimpleTestBase {
        @MethodSource("input")
        void f06_returnEnumMap(Input input) {
                var x = input.proxy.returnEnumMap();
-               assertJson(x, "{ONE:'TWO'}");
+               assertMap(x, "ONE=TWO");
                var e = x.entrySet().iterator().next();
                assertType(TestEnum.class, e.getKey());
                assertType(TestEnum.class, e.getValue());
@@ -1299,7 +1297,7 @@ class RrpcInterface_Test extends SimpleTestBase {
        @MethodSource("input")
        void f07_returnEnum3dArrayMap(Input input) {
                var x = input.proxy.returnEnum3dArrayMap();
-               assertJson(x, "{ONE:[[['TWO',null],null],null]}");
+               assertMap(x, ">ONE=[[[TWO,null],null],null]");
                var e = x.entrySet().iterator().next();
                assertType(TestEnum.class, e.getKey());
                assertType(TestEnum[][][].class, e.getValue());
@@ -1309,7 +1307,7 @@ class RrpcInterface_Test extends SimpleTestBase {
        @MethodSource("input")
        void f08_returnEnum1d3dListMap(Input input) {
                var x = input.proxy.returnEnum1d3dListMap();
-               assertJson(x, "{ONE:[[[['TWO',null],null],null],null]}");
+               assertMap(x, ">ONE=[[[[TWO,null],null],null],null]");
                assertType(TestEnum[][][].class, x.get(TestEnum.ONE).get(0));
        }
 
@@ -1771,4 +1769,4 @@ class RrpcInterface_Test extends SimpleTestBase {
                Map<TestEnum,List<TestEnum[][][]>> x5n = null;
                
TestUtils.assertNotThrown(()->input.proxy.setMultiParamsEnum(x1,x2,x2n,x3,x3n,x4,x4n,x5,x5n));
        }
-}
+}
\ No newline at end of file
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/rest/Swagger_Test.java 
b/juneau-utest/src/test/java/org/apache/juneau/rest/Swagger_Test.java
index 666837d57..a42d0be43 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/rest/Swagger_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/rest/Swagger_Test.java
@@ -602,11 +602,11 @@ class Swagger_Test extends SimpleTestBase {
 
        @Test void d04a_externalDocs_Swagger_externalDocs() throws Exception {
                var x = getSwagger(new D4()).getExternalDocs();
-               assertJson(x, "{description:'b-description',url:'b-url'}");
+               assertBean(x, "description,url", "b-description,b-url");
        }
        @Test void d04b_externalDocs_Swagger_externalDocs_withFile() throws 
Exception {
                var x = getSwaggerWithFile(new D4()).getExternalDocs();
-               assertJson(x, "{description:'b-description',url:'b-url'}");
+               assertBean(x, "description,url", "b-description,b-url");
        }
 
        @Rest(
@@ -839,8 +839,8 @@ class Swagger_Test extends SimpleTestBase {
        }
 
        @Test void f04_operation_tags_swaggerOnAnnotation() throws Exception {
-               assertSet(getSwagger(new 
F4()).getPaths().get("/path/{foo}").get("get").getTags(), "c-tag-1", "c-tag-2");
-               assertSet(getSwaggerWithFile(new 
F4()).getPaths().get("/path/{foo}").get("get").getTags(), "c-tag-1", "c-tag-2");
+               assertSet(getSwagger(new 
F4()).getPaths().get("/path/{foo}").get("get").getTags(), "c-tag-1,c-tag-2");
+               assertSet(getSwaggerWithFile(new 
F4()).getPaths().get("/path/{foo}").get("get").getTags(), "c-tag-1,c-tag-2");
        }
 
        @Rest(swagger=@Swagger("paths:{'/path/{foo}':{get:{tags:['a-tag']}}}"))
@@ -852,8 +852,8 @@ class Swagger_Test extends SimpleTestBase {
        }
 
        @Test void f05_operation_tags_swaggerOnAnnotation() throws Exception {
-               assertSet(getSwagger(new 
F5()).getPaths().get("/path/{foo}").get("get").getTags(), "c-tag-1", "c-tag-2");
-               assertSet(getSwaggerWithFile(new 
F5()).getPaths().get("/path/{foo}").get("get").getTags(), "c-tag-1", "c-tag-2");
+               assertSet(getSwagger(new 
F5()).getPaths().get("/path/{foo}").get("get").getTags(), "c-tag-1,c-tag-2");
+               assertSet(getSwaggerWithFile(new 
F5()).getPaths().get("/path/{foo}").get("get").getTags(), "c-tag-1,c-tag-2");
        }
 
        @Rest(messages="BasicRestInfoProviderTest", 
swagger=@Swagger("paths:{'/path/{foo}':{get:{tags:'a-tags'}}}"))
@@ -1005,8 +1005,8 @@ class Swagger_Test extends SimpleTestBase {
        }
 
        @Test void h04_operation_consumes_swaggerOnAnnotation() throws 
Exception {
-               assertSet(getSwagger(new 
H4()).getPaths().get("/path/{foo}").get("get").getConsumes(), "c-consumes-1", 
"c-consumes-2");
-               assertSet(getSwaggerWithFile(new 
H4()).getPaths().get("/path/{foo}").get("get").getConsumes(), "c-consumes-1", 
"c-consumes-2");
+               assertSet(getSwagger(new 
H4()).getPaths().get("/path/{foo}").get("get").getConsumes(), 
"c-consumes-1,c-consumes-2");
+               assertSet(getSwaggerWithFile(new 
H4()).getPaths().get("/path/{foo}").get("get").getConsumes(), 
"c-consumes-1,c-consumes-2");
        }
 
        
@Rest(swagger=@Swagger("paths:{'/path/{foo}':{get:{consumes:['a-consumes']}}}"))
@@ -1018,8 +1018,8 @@ class Swagger_Test extends SimpleTestBase {
        }
 
        @Test void h05_operation_consumes_swaggerOnAnnotation() throws 
Exception {
-               assertSet(getSwagger(new 
H5()).getPaths().get("/path/{foo}").get("get").getConsumes(), "c-consumes-1", 
"c-consumes-2");
-               assertSet(getSwaggerWithFile(new 
H5()).getPaths().get("/path/{foo}").get("get").getConsumes(), "c-consumes-1", 
"c-consumes-2");
+               assertSet(getSwagger(new 
H5()).getPaths().get("/path/{foo}").get("get").getConsumes(), 
"c-consumes-1,c-consumes-2");
+               assertSet(getSwaggerWithFile(new 
H5()).getPaths().get("/path/{foo}").get("get").getConsumes(), 
"c-consumes-1,c-consumes-2");
        }
 
        @Rest(messages="BasicRestInfoProviderTest", 
swagger=@Swagger("paths:{'/path/{foo}':{get:{consumes:['a-consumes']}}}"))
@@ -1061,8 +1061,8 @@ class Swagger_Test extends SimpleTestBase {
        }
 
        @Test void h08_operation_consumes_parsersOnClassAndMethod() throws 
Exception {
-               assertSet(getSwagger(new 
H8()).getPaths().get("/path2/{foo}").get("put").getConsumes(), "text/xml", 
"application/xml");
-               assertSet(getSwaggerWithFile(new 
H8()).getPaths().get("/path2/{foo}").get("put").getConsumes(), "text/xml", 
"application/xml");
+               assertSet(getSwagger(new 
H8()).getPaths().get("/path2/{foo}").get("put").getConsumes(), 
"text/xml,application/xml");
+               assertSet(getSwaggerWithFile(new 
H8()).getPaths().get("/path2/{foo}").get("put").getConsumes(), 
"text/xml,application/xml");
        }
 
        
@Rest(parsers={JsonParser.class},swagger=@Swagger("paths:{'/path2/{foo}':{put:{consumes:['a-consumes']}}}"))
@@ -1131,8 +1131,8 @@ class Swagger_Test extends SimpleTestBase {
        }
 
        @Test void i04_operation_produces_swaggerOnAnnotation() throws 
Exception {
-               assertSet(getSwagger(new 
I4()).getPaths().get("/path/{foo}").get("get").getProduces(), "c-produces-1", 
"c-produces-2");
-               assertSet(getSwaggerWithFile(new 
I4()).getPaths().get("/path/{foo}").get("get").getProduces(), "c-produces-1", 
"c-produces-2");
+               assertSet(getSwagger(new 
I4()).getPaths().get("/path/{foo}").get("get").getProduces(), 
"c-produces-1,c-produces-2");
+               assertSet(getSwaggerWithFile(new 
I4()).getPaths().get("/path/{foo}").get("get").getProduces(), 
"c-produces-1,c-produces-2");
        }
 
        
@Rest(swagger=@Swagger("paths:{'/path/{foo}':{get:{produces:['a-produces']}}}"))
@@ -1144,8 +1144,8 @@ class Swagger_Test extends SimpleTestBase {
        }
 
        @Test void i05_operation_produces_swaggerOnAnnotation() throws 
Exception {
-               assertSet(getSwagger(new 
I5()).getPaths().get("/path/{foo}").get("get").getProduces(), "c-produces-1", 
"c-produces-2");
-               assertSet(getSwaggerWithFile(new 
I5()).getPaths().get("/path/{foo}").get("get").getProduces(), "c-produces-1", 
"c-produces-2");
+               assertSet(getSwagger(new 
I5()).getPaths().get("/path/{foo}").get("get").getProduces(), 
"c-produces-1,c-produces-2");
+               assertSet(getSwaggerWithFile(new 
I5()).getPaths().get("/path/{foo}").get("get").getProduces(), 
"c-produces-1,c-produces-2");
        }
 
        @Rest(messages="BasicRestInfoProviderTest", 
swagger=@Swagger("paths:{'/path/{foo}':{get:{produces:['a-produces']}}}"))
@@ -1860,6 +1860,6 @@ class Swagger_Test extends SimpleTestBase {
                var o = s.getOperation("/", "get");
 
                var ri = o.getResponse("200");
-               assertEquals("{\n\tf1: 1,\n\tf2: 2\n}", 
ri.getExamples().get("application/json5"));
+               assertMap(ri.getExamples(), "application/json5", "{\n\tf1: 
1,\n\tf2: 2\n}");
        }
 }
\ No newline at end of file
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/rest/annotation/Swagger_FormData_Test.java
 
b/juneau-utest/src/test/java/org/apache/juneau/rest/annotation/Swagger_FormData_Test.java
index 8f0b43435..217bdd870 100644
--- 
a/juneau-utest/src/test/java/org/apache/juneau/rest/annotation/Swagger_FormData_Test.java
+++ 
b/juneau-utest/src/test/java/org/apache/juneau/rest/annotation/Swagger_FormData_Test.java
@@ -115,16 +115,16 @@ class Swagger_FormData_Test extends SimpleTestBase {
                var s = getSwagger(B.class);
                var x = s.getParameterInfo("/a","get","formData","F");
 
-               assertJson(x, "{'in':'formData',name:'F',type:'string'}");
+               assertBean(x, "in,name,type", "formData,F,string");
 
                x = s.getParameterInfo("/b","put","formData","F");
-               assertJson(x, 
"{'in':'formData',name:'F',type:'object',schema:{properties:{f1:{type:'string'}}}}");
+               assertBean(x, "in,name,type,schema{properties{f1{type}}}", 
"formData,F,object,{{{string}}}");
 
                x = s.getParameterInfo("/c","post","formData","F");
-               assertJson(x, 
"{'in':'formData',name:'F',type:'array',items:{type:'string'}}");
+               assertBean(x, "in,name,type,items{type}", 
"formData,F,array,{string}");
 
                x = s.getParameterInfo("/d","delete","formData","F");
-               assertJson(x, "{'in':'formData',name:'F',type:'string'}");
+               assertBean(x, "in,name,type", "formData,F,string");
        }
 
        @Rest
@@ -206,21 +206,21 @@ class Swagger_FormData_Test extends SimpleTestBase {
                var s = getSwagger(E.class);
                var x = s.getParameterInfo("/a","get","formData","F");
 
-               assertJson(x, "{'in':'formData',name:'F',type:'string'}");
+               assertBean(x, "in,name,type", "formData,F,string");
 
                x = s.getParameterInfo("/b","put","formData","F");
-               assertJson(x, 
"{'in':'formData',name:'F',type:'object',schema:{properties:{f1:{type:'string'}}}}");
+               assertBean(x, "in,name,type,schema{properties{f1{type}}}", 
"formData,F,object,{{{string}}}");
 
                x = s.getParameterInfo("/c","post","formData","F");
-               assertJson(x, 
"{'in':'formData',name:'F',type:'array',items:{type:'string'}}");
+               assertBean(x, "in,name,type,items{type}", 
"formData,F,array,{string}");
 
                x = s.getParameterInfo("/d","delete","formData","F");
-               assertJson(x, "{'in':'formData',name:'F',type:'string'}");
+               assertBean(x, "in,name,type", "formData,F,string");
 
                x = s.getParameterInfo("/e","get","formData","F");
-               assertJson(x, 
"{'in':'formData',name:'F',type:'integer',format:'int32'}");
+               assertBean(x, "in,name,type,format", 
"formData,F,integer,int32");
 
                x = s.getParameterInfo("/f","get","formData","F");
-               assertJson(x, "{'in':'formData',name:'F',type:'boolean'}");
+               assertBean(x, "in,name,type", "formData,F,boolean");
        }
 }
\ No newline at end of file
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/rest/annotation/Swagger_Header_Test.java
 
b/juneau-utest/src/test/java/org/apache/juneau/rest/annotation/Swagger_Header_Test.java
index 2f1cc65b8..f3fde451b 100644
--- 
a/juneau-utest/src/test/java/org/apache/juneau/rest/annotation/Swagger_Header_Test.java
+++ 
b/juneau-utest/src/test/java/org/apache/juneau/rest/annotation/Swagger_Header_Test.java
@@ -108,16 +108,16 @@ class Swagger_Header_Test extends SimpleTestBase {
                var s = getSwagger(B.class);
                var x = s.getParameterInfo("/a","get","header","H");
 
-               assertJson(x, "{'in':'header',name:'H',type:'string'}");
+               assertBean(x, "in,name,type", "header,H,string");
 
                x = s.getParameterInfo("/b","put","header","H");
-               assertJson(x, 
"{'in':'header',name:'H',type:'object',schema:{properties:{f1:{type:'string'}}}}");
+               assertBean(x, "in,name,type,schema{properties{f1{type}}}", 
"header,H,object,{{{string}}}");
 
                x = s.getParameterInfo("/c","post","header","H");
-               assertJson(x, 
"{'in':'header',name:'H',type:'array',items:{type:'string'}}");
+               assertBean(x, "in,name,type,items{type}", 
"header,H,array,{string}");
 
                x = s.getParameterInfo("/d","delete","header","H");
-               assertJson(x, "{'in':'header',name:'H',type:'string'}");
+               assertBean(x, "in,name,type", "header,H,string");
        }
 
        @Rest
@@ -200,21 +200,21 @@ class Swagger_Header_Test extends SimpleTestBase {
                var s = getSwagger(E.class);
                var x = s.getParameterInfo("/a","get","header","H");
 
-               assertJson(x, "{'in':'header',name:'H',type:'string'}");
+               assertBean(x, "in,name,type", "header,H,string");
 
                x = s.getParameterInfo("/b","put","header","H");
-               assertJson(x, 
"{'in':'header',name:'H',type:'object',schema:{properties:{f1:{type:'string'}}}}");
+               assertBean(x, "in,name,type,schema{properties{f1{type}}}", 
"header,H,object,{{{string}}}");
 
                x = s.getParameterInfo("/c","post","header","H");
-               assertJson(x, 
"{'in':'header',name:'H',type:'array',items:{type:'string'}}");
+               assertBean(x, "in,name,type,items{type}", 
"header,H,array,{string}");
 
                x = s.getParameterInfo("/d","delete","header","H");
-               assertJson(x, "{'in':'header',name:'H',type:'string'}");
+               assertBean(x, "in,name,type", "header,H,string");
 
                x = s.getParameterInfo("/e","get","header","H");
-               assertJson(x, 
"{'in':'header',name:'H',type:'integer',format:'int32'}");
+               assertBean(x, "in,name,type,format", "header,H,integer,int32");
 
                x = s.getParameterInfo("/f","get","header","H");
-               assertJson(x, "{'in':'header',name:'H',type:'boolean'}");
+               assertBean(x, "in,name,type", "header,H,boolean");
        }
 }
\ No newline at end of file
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/rest/annotation/Swagger_Path_Test.java
 
b/juneau-utest/src/test/java/org/apache/juneau/rest/annotation/Swagger_Path_Test.java
index 42b752cc2..ab74da61d 100644
--- 
a/juneau-utest/src/test/java/org/apache/juneau/rest/annotation/Swagger_Path_Test.java
+++ 
b/juneau-utest/src/test/java/org/apache/juneau/rest/annotation/Swagger_Path_Test.java
@@ -13,7 +13,6 @@
 package org.apache.juneau.rest.annotation;
 
 import static org.apache.juneau.TestUtils.*;
-import static org.junit.jupiter.api.Assertions.*;
 
 import java.util.*;
 
@@ -107,27 +106,19 @@ class Swagger_Path_Test extends SimpleTestBase {
                var s = getSwagger(A.class);
                var x = s.getParameterInfo("/a/{P}","get","path","P");
 
-               assertBean(x, "name,description,type", "P,a\nb,string");
-               assertJson(x.getEnum(), "['a','b']");
-               assertJson(x, 
"{'in':'path',name:'P',type:'string',description:'a\\nb',required:true,'enum':['a','b']}");
+               assertBean(x, "in,name,type,description,required,enum", 
"path,P,string,a\nb,true,[a,b]");
 
                x = s.getParameterInfo("/b/{P}","put","path","P");
-               assertBean(x, "name,description,type", "P,a\nb,string");
-               assertJson(x.getEnum(), "['a','b']");
-               assertJson(x, 
"{'in':'path',name:'P',type:'string',description:'a\\nb',required:true,'enum':['a','b']}");
+               assertBean(x, "in,name,type,description,required,enum", 
"path,P,string,a\nb,true,[a,b]");
 
                x = s.getParameterInfo("/c/{P}","post","path","P");
-               assertBean(x, "name,description,type", "P,b\nc,string");
-               assertJson(x.getEnum(), "['b','c']");
-               assertJson(x, 
"{'in':'path',name:'P',type:'string',description:'b\\nc',required:true,'enum':['b','c']}");
+               assertBean(x, "in,name,type,description,required,enum", 
"path,P,string,b\nc,true,[b,c]");
 
                x = s.getParameterInfo("/d/{P}","delete","path","P");
-               assertEquals("P", x.getName());
-               assertJson(x, 
"{'in':'path',name:'P',type:'string',required:true}");
+               assertBean(x, "in,name,type,required", "path,P,string,true");
 
                x = s.getParameterInfo("/e/{P}","get","path","P");
-               assertJson(x.getEnum(), "['a','b']");
-               assertJson(x, 
"{'in':'path',name:'P',type:'string',required:true,'enum':['a','b']}");
+               assertBean(x, "in,name,type,required,enum", 
"path,P,string,true,[a,b]");
        }
 
        @Rest
@@ -162,16 +153,16 @@ class Swagger_Path_Test extends SimpleTestBase {
                var s = getSwagger(B.class);
                var x = s.getParameterInfo("/a/{P}","get","path","P");
 
-               assertJson(x, 
"{'in':'path',name:'P',type:'string',required:true}");
+               assertBean(x, "in,name,type,required", "path,P,string,true");
 
                x = s.getParameterInfo("/b/{P}","put","path","P");
-               assertJson(x, 
"{'in':'path',name:'P',type:'object',required:true,schema:{properties:{f1:{type:'string'}}}}");
+               assertBean(x, 
"in,name,type,required,schema{properties{f1{type}}}", 
"path,P,object,true,{{{string}}}");
 
                x = s.getParameterInfo("/c/{P}","post","path","P");
-               assertJson(x, 
"{'in':'path',name:'P',type:'array',required:true,items:{type:'string'}}");
+               assertBean(x, "in,name,type,required,items{type}", 
"path,P,array,true,{string}");
 
                x = s.getParameterInfo("/d/{P}","delete","path","P");
-               assertJson(x, 
"{'in':'path',name:'P',type:'string',required:true}");
+               assertBean(x, "in,name,type,required", "path,P,string,true");
        }
 
        @Rest
@@ -214,22 +205,18 @@ class Swagger_Path_Test extends SimpleTestBase {
                var s = getSwagger(D.class);
                var x = s.getParameterInfo("/a/{P}","get","path","P");
 
-               assertEquals("a", x.getDescription());
-               assertEquals("string", x.getType());
+               assertBean(x, "description,type", "a,string");
 
                x = s.getParameterInfo("/b/{P}","put","path","P");
-               assertEquals("a", x.getDescription());
-               assertEquals("string", x.getType());
+               assertBean(x, "description,type", "a,string");
 
                x = s.getParameterInfo("/c/{P}","post","path","P");
-               assertEquals("b", x.getDescription());
-               assertEquals("string", x.getType());
+               assertBean(x, "description,type", "b,string");
 
                x = s.getParameterInfo("/d/{P}","delete","path","P");
-               assertEquals("P", x.getName());
 
                x = s.getParameterInfo("/e/{P}","get","path","P");
-               assertJson(x.getEnum(), "['a','b']");
+               assertSet(x.getEnum(), "a,b");
        }
 
        @Rest
@@ -265,21 +252,21 @@ class Swagger_Path_Test extends SimpleTestBase {
                var s = getSwagger(E.class);
                var x = s.getParameterInfo("/a/{P}","get","path","P");
 
-               assertJson(x, 
"{'in':'path',name:'P',type:'string',required:true}");
+               assertBean(x, "in,name,type,required", "path,P,string,true");
 
                x = s.getParameterInfo("/b/{P}","put","path","P");
-               assertJson(x, 
"{'in':'path',name:'P',type:'object',required:true,schema:{properties:{f1:{type:'string'}}}}");
+               assertBean(x, 
"in,name,type,required,schema{properties{f1{type}}}", 
"path,P,object,true,{{{string}}}");
 
                x = s.getParameterInfo("/c/{P}","post","path","P");
-               assertJson(x, 
"{'in':'path',name:'P',type:'array',required:true,items:{type:'string'}}");
+               assertBean(x, "in,name,type,required,items{type}", 
"path,P,array,true,{string}");
 
                x = s.getParameterInfo("/d/{P}","delete","path","P");
-               assertJson(x, 
"{'in':'path',name:'P',type:'string',required:true}");
+               assertBean(x, "in,name,type,required", "path,P,string,true");
 
                x = s.getParameterInfo("/e/{P}","get","path","P");
-               assertJson(x, 
"{'in':'path',name:'P',type:'integer',required:true,format:'int32'}");
+               assertBean(x, "in,name,type,required,format", 
"path,P,integer,true,int32");
 
                x = s.getParameterInfo("/f/{P}","get","path","P");
-               assertJson(x, 
"{'in':'path',name:'P',type:'boolean',required:true}");
+               assertBean(x, "in,name,type,required", "path,P,boolean,true");
        }
 }
\ No newline at end of file
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/rest/annotation/Swagger_Response_Test.java
 
b/juneau-utest/src/test/java/org/apache/juneau/rest/annotation/Swagger_Response_Test.java
index f57ad4d4e..46b417ec9 100644
--- 
a/juneau-utest/src/test/java/org/apache/juneau/rest/annotation/Swagger_Response_Test.java
+++ 
b/juneau-utest/src/test/java/org/apache/juneau/rest/annotation/Swagger_Response_Test.java
@@ -95,42 +95,24 @@ class Swagger_Response_Test extends SimpleTestBase {
 
        @Test void a01_fromPojo() {
                var s = getSwagger(A.class);
-               var x = s.getResponseInfo("/a","get",200);
 
-               assertEquals("a\nb", x.getDescription());
-               assertJson(x.getSchema(), "{type:'string'}");
-               assertJson(x.getHeaders(), "{foo:{type:'string'}}");
-               assertJson(x.getExamples(), "{foo:'a'}");
+               var x = s.getResponseInfo("/a","get",200);
+               assertBean(x, 
"description,schema{type},headers{foo{type}},examples{foo}", 
"a\nb,{string},{{string}},{a}");
 
                x = s.getResponseInfo("/b","put",200);
-               assertEquals("a\nb", x.getDescription());
-               assertJson(x.getSchema(), "{type:'string'}");
-               assertJson(x.getHeaders(), "{foo:{type:'string'}}");
-               assertJson(x.getExamples(), "{foo:'a'}");
+               assertBean(x, 
"description,schema{type},headers{foo{type}},examples{foo}", 
"a\nb,{string},{{string}},{a}");
 
                x = s.getResponseInfo("/c","post",200);
-               assertEquals("a\nb", x.getDescription());
-               assertJson(x.getSchema(), "{type:'string'}");
-               assertJson(x.getHeaders(), "{foo:{type:'string'}}");
-               assertJson(x.getExamples(), "{foo:'a'}");
+               assertBean(x, 
"description,schema{type},headers{foo{type}},examples{foo}", 
"a\nb,{string},{{string}},{a}");
 
                x = s.getResponseInfo("/d","delete",200);
-               assertEquals("a\nb", x.getDescription());
-               assertJson(x.getSchema(), "{type:'string'}");
-               assertJson(x.getHeaders(), "{foo:{type:'string'}}");
-               assertJson(x.getExamples(), "{foo:'a'}");
+               assertBean(x, 
"description,schema{type},headers{foo{type}},examples{foo}", 
"a\nb,{string},{{string}},{a}");
 
                x = s.getResponseInfo("/e","get",200);
-               assertEquals("a\nb", x.getDescription());
-               assertJson(x.getSchema(), "{type:'string'}");
-               assertJson(x.getHeaders(), "{foo:{type:'string'}}");
-               assertJson(x.getExamples(), "{foo:'a'}");
+               assertBean(x, 
"description,schema{type},headers{foo{type}},examples{foo}", 
"a\nb,{string},{{string}},{a}");
 
                x = s.getResponseInfo("/f","get",200);
-               assertEquals("a\nb", x.getDescription());
-               assertJson(x.getSchema(), "{type:'string'}");
-               assertJson(x.getHeaders(), "{foo:{type:'string'}}");
-               assertJson(x.getExamples(), "{foo:'a'}");
+               assertBean(x, 
"description,schema{type},headers{foo{type}},examples{foo}", 
"a\nb,{string},{{string}},{a}");
 
                x = s.getResponseInfo("/g","get",100);
                assertEquals("Continue", x.getDescription());
@@ -145,10 +127,10 @@ class Swagger_Response_Test extends SimpleTestBase {
                assertEquals("Continue", x.getDescription());
 
                x = s.getResponseInfo("/k","get",200);
-               assertJson(x.getHeaders(), "{foo:{type:'object'}}");
+               assertMap(x.getHeaders(), "foo{type}", "{object}");
 
                x = s.getResponseInfo("/l","get",200);
-               assertJson(x.getHeaders(), "{foo:{type:'object'}}");
+               assertMap(x.getHeaders(), "foo{type}", "{object}");
        }
 
        @Rest
@@ -191,28 +173,28 @@ class Swagger_Response_Test extends SimpleTestBase {
                var s = getSwagger(B.class);
                var x = s.getResponseInfo("/a","get",200);
 
-               assertJson(x.getSchema(), "{type:'number'}");
+               assertBean(x.getSchema(), "type", "number");
 
                x = s.getResponseInfo("/b","put",200);
-               assertJson(x.getSchema(), "{type:'number'}");
+               assertBean(x.getSchema(), "type", "number");
 
                x = s.getResponseInfo("/c","post",200);
-               assertJson(x.getSchema(), 
"{type:'object',properties:{f1:{type:'string'}}}");
+               assertBean(x.getSchema(), "type,properties{f1{type}}", 
"object,{{string}}");
 
                x = s.getResponseInfo("/d","delete",200);
-               assertJson(x.getSchema(), 
"{type:'object',properties:{f1:{type:'string'}}}");
+               assertBean(x.getSchema(), "type,properties{f1{type}}", 
"object,{{string}}");
 
                x = s.getResponseInfo("/e","get",200);
-               assertJson(x.getSchema(), 
"{type:'array',items:{type:'string'}}");
+               assertBean(x.getSchema(), "type,items{type}", "array,{string}");
 
                x = s.getResponseInfo("/f","get",200);
-               assertJson(x.getSchema(), 
"{type:'array',items:{type:'string'}}");
+               assertBean(x.getSchema(), "type,items{type}", "array,{string}");
 
                x = s.getResponseInfo("/g","get",200);
-               assertJson(x.getSchema(), "{type:'string'}");
+               assertBean(x.getSchema(), "type", "string");
 
                x = s.getResponseInfo("/h","get",200);
-               assertJson(x.getSchema(), "{type:'string'}");
+               assertBean(x.getSchema(), "type", "string");
        }
 
        @Rest
@@ -244,10 +226,10 @@ class Swagger_Response_Test extends SimpleTestBase {
 
                sc.getResponseInfo("/b","put",200);
 
-               assertJson(x.getExamples(), "{foo:'b'}");
+               assertMap(x.getExamples(), "foo", "b");
 
                x = sc.getResponseInfo("/d","delete",200);
-               assertJson(x.getExamples(), "{foo:'b'}");
+               assertMap(x.getExamples(), "foo", "b");
        }
 
        @Rest
@@ -299,24 +281,15 @@ class Swagger_Response_Test extends SimpleTestBase {
 
        @Test void d01_fromThrowable() {
                var s = getSwagger(D.class);
-               var x = s.getResponseInfo("/a","get",500);
 
-               assertEquals("a\nb", x.getDescription());
-               assertJson(x.getSchema(), "{type:'string'}");
-               assertJson(x.getHeaders(), "{foo:{type:'string'}}");
-               assertJson(x.getExamples(), "{foo:'a'}");
+               var x = s.getResponseInfo("/a","get",500);
+               assertBean(x, 
"description,schema{type},headers{foo{type}},examples{foo}", 
"a\nb,{string},{{string}},{a}");
 
                x = s.getResponseInfo("/b","put",500);
-               assertEquals("a\nb", x.getDescription());
-               assertJson(x.getSchema(), "{type:'string'}");
-               assertJson(x.getHeaders(), "{foo:{type:'string'}}");
-               assertJson(x.getExamples(), "{foo:'a'}");
+               assertBean(x, 
"description,schema{type},headers{foo{type}},examples{foo}", 
"a\nb,{string},{{string}},{a}");
 
                x = s.getResponseInfo("/c","post",500);
-               assertEquals("a\nb", x.getDescription());
-               assertJson(x.getSchema(), "{type:'string'}");
-               assertJson(x.getHeaders(), "{foo:{type:'string'}}");
-               assertJson(x.getExamples(), "{foo:'a'}");
+               assertBean(x, 
"description,schema{type},headers{foo{type}},examples{foo}", 
"a\nb,{string},{{string}},{a}");
 
                x = s.getResponseInfo("/d","delete",100);
                assertEquals("Continue", x.getDescription());
@@ -325,7 +298,7 @@ class Swagger_Response_Test extends SimpleTestBase {
                assertEquals("Continue", x.getDescription());
 
                x = s.getResponseInfo("/f","get",500);
-               assertJson(x.getHeaders(), "{foo:{type:'number'}}");
+               assertBean(x, "headers{foo{type}}", "{{number}}");
        }
 
        @Rest
@@ -342,7 +315,7 @@ class Swagger_Response_Test extends SimpleTestBase {
                var s = getSwagger(E.class);
 
                var x = s.getResponseInfo("/a","get",500);
-               assertJson(x.getSchema(), "{type:'number'}");
+               assertBean(x, "schema{type}", "{number}");
        }
 
        
//-----------------------------------------------------------------------------------------------------------------
@@ -359,10 +332,10 @@ class Swagger_Response_Test extends SimpleTestBase {
                public void b() throws F2 { /* no-op */ }
        }
 
-       @Test void f01_exampeFromThrowable() {
+       @Test void f01_exampleFromThrowable() {
                var s = getSwagger(F.class);
                var x = s.getResponseInfo("/b","put",500);
 
-               assertJson(x.getExamples(), "{foo:'b'}");
+               assertBean(x, "examples{foo}", "{b}");
        }
 }
\ No newline at end of file
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/testutils/pojos/SwappedObject.java
 
b/juneau-utest/src/test/java/org/apache/juneau/testutils/pojos/SwappedObject.java
index 566226296..29b5dba1f 100644
--- 
a/juneau-utest/src/test/java/org/apache/juneau/testutils/pojos/SwappedObject.java
+++ 
b/juneau-utest/src/test/java/org/apache/juneau/testutils/pojos/SwappedObject.java
@@ -17,4 +17,9 @@ import org.apache.juneau.annotation.*;
 @Swap(SwappedObjectSwap.class)
 public class SwappedObject {
        public boolean wasUnswapped;
+
+       @Override
+       public String toString() {
+               return "wasUnswapped:" + wasUnswapped;
+       }
 }
\ No newline at end of file
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/testutils/pojos/TypedBeanImpl.java
 
b/juneau-utest/src/test/java/org/apache/juneau/testutils/pojos/TypedBeanImpl.java
index 882e602ef..cc73893ff 100644
--- 
a/juneau-utest/src/test/java/org/apache/juneau/testutils/pojos/TypedBeanImpl.java
+++ 
b/juneau-utest/src/test/java/org/apache/juneau/testutils/pojos/TypedBeanImpl.java
@@ -26,4 +26,9 @@ public class TypedBeanImpl implements TypedBean {
        public static TypedBeanImpl get() {
                return new TypedBeanImpl().init();
        }
+
+       @Override
+       public String toString() {
+               return "a:" + a + ";b:" + b;
+       }
 }
\ No newline at end of file
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/uon/UonParser_Test.java 
b/juneau-utest/src/test/java/org/apache/juneau/uon/UonParser_Test.java
index 03eb3f66c..8aeda2a41 100755
--- a/juneau-utest/src/test/java/org/apache/juneau/uon/UonParser_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/uon/UonParser_Test.java
@@ -482,8 +482,7 @@ class UonParser_Test extends SimpleTestBase {
                var p2 = UonParser.DEFAULT;
                var s = "(f1=foo,f2=123)";
                var t = p2.parse(s, A.class);
-               assertEquals("foo", t.f1);
-               assertEquals(123, t.f2);
+               assertBean(t, "f1,f2", "foo,123");
        }
 
        public static class A {
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/urlencoding/CommonParser_UrlEncodingTest.java
 
b/juneau-utest/src/test/java/org/apache/juneau/urlencoding/CommonParser_UrlEncodingTest.java
index ed5fdfb99..70f1b627c 100755
--- 
a/juneau-utest/src/test/java/org/apache/juneau/urlencoding/CommonParser_UrlEncodingTest.java
+++ 
b/juneau-utest/src/test/java/org/apache/juneau/urlencoding/CommonParser_UrlEncodingTest.java
@@ -39,20 +39,15 @@ class CommonParser_UrlEncodingTest extends SimpleTestBase {
 
                in = "a=1&b='foo+bar'";
                m = (Map)p.parse(in, Object.class);
-               assertEquals(1, m.get("a"));
-               assertEquals("foo bar", m.get("b"));
+               assertMap(m, "a,b", "1,foo bar");
 
                in = "a=1&b='foo+bar'&c=false";
                m = (Map)p.parse(in, Object.class);
-               assertEquals(1, m.get("a"));
-               assertEquals("foo bar", m.get("b"));
-               assertEquals(false, m.get("c"));
+               assertMap(m, "a,b,c", "1,foo bar,false");
 
                in = "a=1&b='foo%20bar'&c=false";
                m = (Map)p.parse(in, Object.class);
-               assertEquals(1, m.get("a"));
-               assertEquals("foo bar", m.get("b"));
-               assertEquals(false, m.get("c"));
+               assertMap(m, "a,b,c", "1,foo bar,false");
 
                var jm = 
(JsonMap)p.parse("x=@((attribute=value),(attribute=~'value~'))", Object.class);
                assertEquals("value", 
jm.getList("x").getMap(0).getString("attribute"));

Reply via email to