THRIFT-5560: use JUnit 5 for all Java lib tests (#2574)

diff --git a/lib/java/gradle.properties b/lib/java/gradle.properties
index 8d4f0e4..dfa29fe 100644
--- a/lib/java/gradle.properties
+++ b/lib/java/gradle.properties
@@ -30,7 +30,7 @@
 slf4j.version=1.7.35
 servlet.version=4.0.1
 tomcat.embed.version=9.0.43
-junit.version=4.13.2
+junit.version=5.8.2
 mockito.version=1.10.19
 javax.annotation.version=1.3.2
 commons-lang3.version=3.12
diff --git a/lib/java/gradle/environment.gradle b/lib/java/gradle/environment.gradle
index 12fee15..2f49a0d 100644
--- a/lib/java/gradle/environment.gradle
+++ b/lib/java/gradle/environment.gradle
@@ -71,7 +71,7 @@
     compile "javax.annotation:javax.annotation-api:${javaxAnnotationVersion}"
     compile "org.apache.commons:commons-lang3:3.12.0"
 
-    testCompile "junit:junit:${junitVersion}"
+    testImplementation "org.junit.jupiter:junit-jupiter:${junitVersion}"
     testCompile "org.mockito:mockito-all:${mockitoVersion}"
     testRuntime "org.slf4j:slf4j-log4j12:${slf4jVersion}"
 }
diff --git a/lib/java/gradle/unitTests.gradle b/lib/java/gradle/unitTests.gradle
index 10a5539..0f09aa9 100644
--- a/lib/java/gradle/unitTests.gradle
+++ b/lib/java/gradle/unitTests.gradle
@@ -68,8 +68,15 @@
     include '**/Test*.class'
     exclude '**/Test*\$*.class'
 
+    // https://junit.org/junit5/docs/current/user-guide/#running-tests-build-gradle
+    useJUnitPlatform() {
+        // https://junit.org/junit5/docs/current/user-guide/#writing-tests-parallel-execution
+        systemProperty("junit.jupiter.execution.parallel.enabled", "true")
+        systemProperty("junit.jupiter.execution.parallel.mode.default", "concurrent")
+        systemProperty("junit.jupiter.execution.parallel.mode.classes.default", "concurrent")
+    }
+
     maxHeapSize = '512m'
-    forkEvery = 1
 
     systemProperties = [
         'build.test': "${compileTestJava.destinationDir}",
diff --git a/lib/java/src/test/java/org/apache/thrift/Fixtures.java b/lib/java/src/test/java/org/apache/thrift/Fixtures.java
index 61f40a5..a8b0518 100644
--- a/lib/java/src/test/java/org/apache/thrift/Fixtures.java
+++ b/lib/java/src/test/java/org/apache/thrift/Fixtures.java
@@ -33,15 +33,44 @@
 import thrift.test.OneOfEach;
 
 public class Fixtures {
-  public static final OneOfEach oneOfEach;
-  public static final Nesting nesting;
-  public static final HolyMoley holyMoley;
-  public static final CompactProtoTestStruct compactProtoTestStruct;
+
+  public static OneOfEach getOneOfEach() {
+    return oneOfEach.deepCopy();
+  }
+
+  public static Nesting getNesting() {
+    return nesting.deepCopy();
+  }
+
+  public static HolyMoley getHolyMoley() {
+    return holyMoley.deepCopy();
+  }
+
+  public static CompactProtoTestStruct getCompactProtoTestStruct() {
+    return compactProtoTestStruct.deepCopy();
+  }
+
+  public static byte[] getPersistentBytesOneOfEach() {
+    return persistentBytesOneOfEach.clone();
+  }
+
+  public static byte[] getPersistentBytesHolyMoley() {
+    return persistentBytesHolyMoley.clone();
+  }
+
+  public static byte[] getPersistentBytesNesting() {
+    return persistentBytesNesting.clone();
+  }
+
+  private static final OneOfEach oneOfEach;
+  private static final Nesting nesting;
+  private static final HolyMoley holyMoley;
+  private static final CompactProtoTestStruct compactProtoTestStruct;
 
   // These byte arrays are serialized versions of the above structs.
   // They were serialized in binary protocol using thrift 0.6.x and are used to
   // test backwards compatibility with respect to the standard scheme.
-  public static final byte[] persistentBytesOneOfEach = new byte[] { (byte) 0x02, (byte) 0x00,
+  private static final byte[] persistentBytesOneOfEach = new byte[] { (byte) 0x02, (byte) 0x00,
     (byte) 0x01, (byte) 0x01, (byte) 0x02, (byte) 0x00, (byte) 0x02,
     (byte) 0x00, (byte) 0x03, (byte) 0x00, (byte) 0x03, (byte) 0xD6,
     (byte) 0x06, (byte) 0x00, (byte) 0x04, (byte) 0x69, (byte) 0x78,
@@ -81,7 +110,7 @@
     (byte) 0x00, (byte) 0x00, (byte) 0x02, (byte) 0x00, (byte) 0x00,
     (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
     (byte) 0x03, (byte) 0x00 };
-  public static final byte[] persistentBytesNesting = new byte[] { (byte) 0x0C, (byte) 0x00,
+  private static final byte[] persistentBytesNesting = new byte[] { (byte) 0x0C, (byte) 0x00,
     (byte) 0x01, (byte) 0x08, (byte) 0x00, (byte) 0x01, (byte) 0x00,
     (byte) 0x00, (byte) 0x7A, (byte) 0x69, (byte) 0x0B, (byte) 0x00,
     (byte) 0x02, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x13,
@@ -129,7 +158,7 @@
     (byte) 0x00, (byte) 0x00, (byte) 0x02, (byte) 0x00, (byte) 0x00,
     (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
     (byte) 0x03, (byte) 0x00, (byte) 0x00 };
-  public static final byte[] persistentBytesHolyMoley = new byte[] { (byte) 0x0F, (byte) 0x00,
+  private static final byte[] persistentBytesHolyMoley = new byte[] { (byte) 0x0F, (byte) 0x00,
     (byte) 0x01, (byte) 0x0C, (byte) 0x00, (byte) 0x00, (byte) 0x00,
     (byte) 0x02, (byte) 0x02, (byte) 0x00, (byte) 0x01, (byte) 0x01,
     (byte) 0x02, (byte) 0x00, (byte) 0x02, (byte) 0x00, (byte) 0x03,
@@ -278,33 +307,33 @@
       nesting = new Nesting(bonk, oneOfEach);
 
       holyMoley = new HolyMoley();
-      List<OneOfEach> big = new ArrayList<OneOfEach>();
+      List<OneOfEach> big = new ArrayList<>();
       big.add(new OneOfEach(oneOfEach));
       big.add(nesting.my_ooe);
       holyMoley.setBig(big);
       holyMoley.getBig().get(0).setA_bite((byte) 0x22);
       holyMoley.getBig().get(0).setA_bite((byte) 0x23);
 
-      holyMoley.setContain(new HashSet<List<String>>());
-      ArrayList<String> stage1 = new ArrayList<String>(2);
+      holyMoley.setContain(new HashSet<>());
+      ArrayList<String> stage1 = new ArrayList<>(2);
       stage1.add("and a one");
       stage1.add("and a two");
       holyMoley.getContain().add(stage1);
-      stage1 = new ArrayList<String>(3);
+      stage1 = new ArrayList<>(3);
       stage1.add("then a one, two");
       stage1.add("three!");
       stage1.add("FOUR!!");
       holyMoley.getContain().add(stage1);
-      stage1 = new ArrayList<String>(0);
+      stage1 = new ArrayList<>(0);
       holyMoley.getContain().add(stage1);
 
-      ArrayList<Bonk> stage2 = new ArrayList<Bonk>();
-      holyMoley.setBonks(new HashMap<String, List<Bonk>>());
+      ArrayList<Bonk> stage2 = new ArrayList<>();
+      holyMoley.setBonks(new HashMap<>());
       // one empty
       holyMoley.getBonks().put("zero", stage2);
 
       // one with two
-      stage2 = new ArrayList<Bonk>();
+      stage2 = new ArrayList<>();
       Bonk b = new Bonk();
       b.setType(1);
       b.setMessage("Wait.");
@@ -316,7 +345,7 @@
       holyMoley.getBonks().put("two", stage2);
 
       // one with three
-      stage2 = new ArrayList<Bonk>();
+      stage2 = new ArrayList<>();
       b = new Bonk();
       b.setType(3);
       b.setMessage("quoth");
diff --git a/lib/java/src/test/java/org/apache/thrift/TestDeepCopy.java b/lib/java/src/test/java/org/apache/thrift/TestDeepCopy.java
index acafaef..8fd9a97 100644
--- a/lib/java/src/test/java/org/apache/thrift/TestDeepCopy.java
+++ b/lib/java/src/test/java/org/apache/thrift/TestDeepCopy.java
@@ -1,11 +1,14 @@
 package org.apache.thrift;
 
-import junit.framework.TestCase;
+import org.junit.jupiter.api.Test;
 import thrift.test.DeepCopyBar;
 import thrift.test.DeepCopyFoo;
 
-public class TestDeepCopy extends TestCase {
+import static org.junit.jupiter.api.Assertions.assertNotSame;
 
+public class TestDeepCopy  {
+
+  @Test
   public void testDeepCopy() throws Exception {
     final DeepCopyFoo foo = new DeepCopyFoo();
 
diff --git a/lib/java/src/test/java/org/apache/thrift/TestEnumContainers.java b/lib/java/src/test/java/org/apache/thrift/TestEnumContainers.java
index 683246b..b7b2913 100644
--- a/lib/java/src/test/java/org/apache/thrift/TestEnumContainers.java
+++ b/lib/java/src/test/java/org/apache/thrift/TestEnumContainers.java
@@ -19,7 +19,7 @@
 
 package org.apache.thrift;
 
-import junit.framework.TestCase;
+import org.junit.jupiter.api.Test;
 import thrift.test.enumcontainers.EnumContainersTestConstants;
 import thrift.test.enumcontainers.GodBean;
 import thrift.test.enumcontainers.GreekGodGoddess;
@@ -29,8 +29,14 @@
 import java.util.HashMap;
 import java.util.HashSet;
 
-public class TestEnumContainers extends TestCase {
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertNotSame;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
+public class TestEnumContainers  {
+
+    @Test
     public void testEnumContainers() throws Exception {
         final GodBean b1 = new GodBean();
         b1.addToGoddess(GreekGodGoddess.HERA);
@@ -51,11 +57,11 @@
             deserializer.deserialize(b3, bytes);
         }
 
-        assertTrue(b1.getGoddess() != b2.getGoddess());
-        assertTrue(b1.getPower() != b2.getPower());
+        assertNotSame(b1.getGoddess(), b2.getGoddess());
+        assertNotSame(b1.getPower(), b2.getPower());
 
-        assertTrue(b1.getGoddess() != b3.getGoddess());
-        assertTrue(b1.getPower() != b3.getPower());
+        assertNotSame(b1.getGoddess(), b3.getGoddess());
+        assertNotSame(b1.getPower(), b3.getPower());
 
         for (GodBean each : new GodBean[]{b1, b2, b3}) {
             assertTrue(each.getGoddess().contains(GreekGodGoddess.HERA));
@@ -71,6 +77,7 @@
         }
     }
 
+    @Test
     public void testEnumConstants() {
         assertEquals("lightning bolt", EnumContainersTestConstants.ATTRIBUTES.get(GreekGodGoddess.ZEUS));
         assertTrue(EnumContainersTestConstants.ATTRIBUTES instanceof EnumMap);
diff --git a/lib/java/src/test/java/org/apache/thrift/TestFullCamel.java b/lib/java/src/test/java/org/apache/thrift/TestFullCamel.java
index fc98898..4566204 100644
--- a/lib/java/src/test/java/org/apache/thrift/TestFullCamel.java
+++ b/lib/java/src/test/java/org/apache/thrift/TestFullCamel.java
@@ -19,20 +19,19 @@
 
 package org.apache.thrift;
 
-import java.util.HashSet;
-
-import junit.framework.TestCase;
-
 import org.apache.thrift.protocol.TBinaryProtocol;
-import org.apache.thrift.protocol.TType;
-
+import org.junit.jupiter.api.Test;
 import thrift.test.fullcamel.OneOfEachZZ;
 import thrift.test.fullcamel.UnderscoreSrv;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
 // Sanity check for the code generated by 'fullcamel'.
 //
-public class TestFullCamel extends TestCase {
+public class TestFullCamel  {
 
+  @Test
   public void testCamelCaseSyntax() throws Exception {
     TSerializer   binarySerializer   = new   TSerializer(new TBinaryProtocol.Factory());
     TDeserializer binaryDeserializer = new TDeserializer(new TBinaryProtocol.Factory());
@@ -42,10 +41,11 @@
     obj.setImFalse(true);
     byte[] serBytes = binarySerializer.serialize(obj);
     binaryDeserializer.deserialize(obj, serBytes);
-    assertTrue( obj.getABite() == (byte) 0xae );
-    assertTrue( obj.isImFalse() == true );
+    assertEquals((byte) 0xae, obj.getABite());
+    assertTrue(obj.isImFalse());
   }
 
+  @Test
   public void testCamelCaseRpcMethods() throws Exception {
     final UnderscoreSrv.Iface srv = new UnderscoreSrv.Iface() {
       @Override
diff --git a/lib/java/src/test/java/org/apache/thrift/TestMultiplexedProcessor.java b/lib/java/src/test/java/org/apache/thrift/TestMultiplexedProcessor.java
index 85e7966..7b00cca 100644
--- a/lib/java/src/test/java/org/apache/thrift/TestMultiplexedProcessor.java
+++ b/lib/java/src/test/java/org/apache/thrift/TestMultiplexedProcessor.java
@@ -19,40 +19,41 @@
 
 package org.apache.thrift;
 
+import org.apache.thrift.protocol.TMessage;
+import org.apache.thrift.protocol.TMessageType;
+import org.apache.thrift.protocol.TProtocol;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertThrows;
 import static org.mockito.Matchers.any;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
-import org.apache.thrift.protocol.TMessage;
-import org.apache.thrift.protocol.TMessageType;
-import org.apache.thrift.protocol.TProtocol;
-import org.junit.Before;
-import org.junit.Test;
-
 public class TestMultiplexedProcessor {
   private TMultiplexedProcessor mp;
   private TProtocol iprot;
   private TProtocol oprot;
 
-  @Before
+  @BeforeEach
   public void setUp() throws Exception {
     mp = new TMultiplexedProcessor();
     iprot = mock(TProtocol.class);
     oprot = mock(TProtocol.class);
   }
 
-  @Test(expected = TException.class)
+  @Test
   public void testWrongMessageType() throws TException {
     when (iprot.readMessageBegin()).thenReturn(new TMessage("service:func", TMessageType.REPLY, 42));
-    mp.process(iprot, oprot);
+    assertThrows(TException.class, ()->mp.process(iprot, oprot));
   }
 
-  @Test(expected = TException.class)
+  @Test
   public void testNoSuchService() throws TException {
     when(iprot.readMessageBegin()).thenReturn(new TMessage("service:func", TMessageType.CALL, 42));
 
-    mp.process(iprot, oprot);
+    assertThrows(TException.class, ()->mp.process(iprot, oprot));
   }
 
   static class StubProcessor implements TProcessor {
diff --git a/lib/java/src/test/java/org/apache/thrift/TestOptionType.java b/lib/java/src/test/java/org/apache/thrift/TestOptionType.java
index ddde9d3..6365203 100644
--- a/lib/java/src/test/java/org/apache/thrift/TestOptionType.java
+++ b/lib/java/src/test/java/org/apache/thrift/TestOptionType.java
@@ -19,10 +19,16 @@
 
 package org.apache.thrift;
 
-import junit.framework.TestCase;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
 // Tests and documents behavior for the "Option<T>" type
-public class TestOptionType extends TestCase {
+public class TestOptionType  {
+    @Test
     public void testSome() {
         String name = "Chuck Norris";
         Option<String> option = Option.fromNullable(name);
@@ -34,6 +40,7 @@
         assertEquals(option.get(),"Chuck Norris");
     }
 
+    @Test
     public void testNone() throws Exception {
         String name = null;
         Option<String> option = Option.fromNullable(name);
@@ -43,23 +50,18 @@
         assertEquals("None", option.toString());
         assertEquals(option.or("default value"), "default value");
         // Expect exception
-        try {
-            Object value = option.get();
-            fail("Expected IllegalStateException, got no exception");
-        } catch (IllegalStateException ex) {
-
-        } catch(Exception ex) {
-            fail("Expected IllegalStateException, got some other exception: "+ex.toString());
-        }
+        assertThrows(IllegalStateException.class, option::get);
     }
 
+    @Test
     public void testMakeSome() throws Exception {
         Option<String> some = Option.some("wee");
-        assertTrue(some instanceof Option.Some);
+        assertTrue(some.isDefined());
     }
 
+    @Test
     public void testMakeNone() throws Exception {
         Option<Integer> none = Option.none();
-        assertTrue(none instanceof Option.None);
+        assertFalse(none.isDefined());
     }
 }
diff --git a/lib/java/src/test/java/org/apache/thrift/TestOptionals.java b/lib/java/src/test/java/org/apache/thrift/TestOptionals.java
index b34e06d..38322ee 100644
--- a/lib/java/src/test/java/org/apache/thrift/TestOptionals.java
+++ b/lib/java/src/test/java/org/apache/thrift/TestOptionals.java
@@ -19,70 +19,78 @@
 
 package org.apache.thrift;
 
-import junit.framework.TestCase;
-
-import thrift.test.Opt4;
+import org.junit.jupiter.api.Test;
 import thrift.test.Opt30;
+import thrift.test.Opt4;
 import thrift.test.Opt64;
 import thrift.test.Opt80;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
 // Exercises the isSet methods using structs from ManyOptionals.thrift
-public class TestOptionals extends TestCase {
+public class TestOptionals  {
+  @Test
   public void testEncodingUtils() throws Exception {
     assertEquals((short)0x8, EncodingUtils.setBit((short)0, 3, true));
     assertEquals((short)0, EncodingUtils.setBit((short)0x8, 3, false));
-    assertEquals(true, EncodingUtils.testBit((short)0x8, 3));
-    assertEquals(false, EncodingUtils.testBit((short)0x8, 4));
+    assertTrue(EncodingUtils.testBit((short) 0x8, 3));
+    assertFalse(EncodingUtils.testBit((short) 0x8, 4));
 
     assertEquals(Short.MIN_VALUE, EncodingUtils.setBit((short)0, 15, true));
     assertEquals((short)0, EncodingUtils.setBit(Short.MIN_VALUE, 15, false));
-    assertEquals(true, EncodingUtils.testBit(Short.MIN_VALUE, 15));
-    assertEquals(false, EncodingUtils.testBit(Short.MIN_VALUE, 14));
+    assertTrue(EncodingUtils.testBit(Short.MIN_VALUE, 15));
+    assertFalse(EncodingUtils.testBit(Short.MIN_VALUE, 14));
   }
 
+  @Test
   public void testOpt4() throws Exception {
     Opt4 x = new Opt4();
-    assertEquals(false, x.isSetDef1());
+    assertFalse(x.isSetDef1());
     x.setDef1(3);
-    assertEquals(true, x.isSetDef1());
-    assertEquals(false, x.isSetDef2());
+    assertTrue(x.isSetDef1());
+    assertFalse(x.isSetDef2());
 
     Opt4 copy = new Opt4(x);
-    assertEquals(true, copy.isSetDef1());
+    assertTrue(copy.isSetDef1());
     copy.unsetDef1();
-    assertEquals(false, copy.isSetDef1());
-    assertEquals(true, x.isSetDef1());
+    assertFalse(copy.isSetDef1());
+    assertTrue(x.isSetDef1());
   }
 
+  @Test
   public void testOpt30() throws Exception {
     Opt30 x = new Opt30();
-    assertEquals(false, x.isSetDef1());
+    assertFalse(x.isSetDef1());
     x.setDef1(3);
-    assertEquals(true, x.isSetDef1());
-    assertEquals(false, x.isSetDef2());
+    assertTrue(x.isSetDef1());
+    assertFalse(x.isSetDef2());
   }
 
+  @Test
   public void testOpt64() throws Exception {
     Opt64 x = new Opt64();
-    assertEquals(false, x.isSetDef1());
+    assertFalse(x.isSetDef1());
     x.setDef1(3);
-    assertEquals(true, x.isSetDef1());
-    assertEquals(false, x.isSetDef2());
+    assertTrue(x.isSetDef1());
+    assertFalse(x.isSetDef2());
     x.setDef64(22);
-    assertEquals(true, x.isSetDef64());
-    assertEquals(false, x.isSetDef63());
+    assertTrue(x.isSetDef64());
+    assertFalse(x.isSetDef63());
   }
 
+  @Test
   public void testOpt80() throws Exception {
     Opt80 x = new Opt80();
-    assertEquals(false, x.isSetDef1());
+    assertFalse(x.isSetDef1());
     x.setDef1(3);
-    assertEquals(true, x.isSetDef1());
-    assertEquals(false, x.isSetDef2());
+    assertTrue(x.isSetDef1());
+    assertFalse(x.isSetDef2());
 
     Opt80 copy = new Opt80(x);
     copy.unsetDef1();
-    assertEquals(false, copy.isSetDef1());
-    assertEquals(true, x.isSetDef1());
+    assertFalse(copy.isSetDef1());
+    assertTrue(x.isSetDef1());
   }
 }
diff --git a/lib/java/src/test/java/org/apache/thrift/TestOptionalsWithJdk8.java b/lib/java/src/test/java/org/apache/thrift/TestOptionalsWithJdk8.java
index 93daced..2f3cf3b 100644
--- a/lib/java/src/test/java/org/apache/thrift/TestOptionalsWithJdk8.java
+++ b/lib/java/src/test/java/org/apache/thrift/TestOptionalsWithJdk8.java
@@ -19,12 +19,18 @@
 
 package org.apache.thrift;
 
-import junit.framework.TestCase;
+import org.junit.jupiter.api.Test;
 import thrift.test.optiontypejdk8.Person;
 
-// Tests and documents behavior for the JDK8 "Option<T>" type
-public class TestOptionalsWithJdk8 extends TestCase {
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
+// Tests and documents behavior for the JDK8 "Option<T>" type
+public class TestOptionalsWithJdk8  {
+
+    @Test
     public void testConstruction() {
         Person person = new Person(1L, "name");
         assertFalse(person.getAge().isPresent());
@@ -42,6 +48,7 @@
         assertEquals(Integer.valueOf(0), person.getPetsSize().orElse(0));
     }
 
+    @Test
     public void testEmpty() {
         Person person = new Person();
         person.setPhone("phone");
diff --git a/lib/java/src/test/java/org/apache/thrift/TestRenderedDoubleConstants.java b/lib/java/src/test/java/org/apache/thrift/TestRenderedDoubleConstants.java
index d691fe3..b38f39c 100644
--- a/lib/java/src/test/java/org/apache/thrift/TestRenderedDoubleConstants.java
+++ b/lib/java/src/test/java/org/apache/thrift/TestRenderedDoubleConstants.java
@@ -19,38 +19,41 @@
 
 package org.apache.thrift;
 
-import java.util.List;
-import junit.framework.TestCase;
-import static org.junit.Assert.*;
-import org.junit.Test;
+
+import org.junit.jupiter.api.Test;
 import thrift.test.DoubleConstantsTestConstants;
 
-public class TestRenderedDoubleConstants extends TestCase {
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+public class TestRenderedDoubleConstants {
     private static final double EPSILON = 0.0000001;
     private static final String ASSERTION_MESSAGE_FOR_RENDERED_DOUBLE_CONSTANTS_TEST =
-        "failed to verify a double constant generated by Thrift (expected = %f, got = %f)";
+            "failed to verify a double constant generated by Thrift (expected = %f, got = %f)";
     private static final String ASSERTION_MESSAGE_FOR_RENDERED_DOUBLE_LIST_TEST =
-        "failed to verify a list item by Thrift (expected = %f, got = %f)";
+            "failed to verify a list item by Thrift (expected = %f, got = %f)";
     private static final String ASSERTION_MESSAGE_FOR_TYPE_CHECKS =
-        "the rendered variable with name %s is not of double type";
+            "the rendered variable with name %s is not of double type";
 
     // to make sure lists containing doubles are generated correctly
+    @Test
     public void testRenderedDoubleList() throws Exception {
         final double[] EXPECTED_LIST =
-            {1d,-100d,100d,9223372036854775807d,-9223372036854775807d,3.14159265359,1000000.1,-1000000.1,1.7e+308,
-             -1.7e+308,9223372036854775816.43,-9223372036854775816.43};
+                {1d, -100d, 100d, 9223372036854775807d, -9223372036854775807d, 3.14159265359, 1000000.1, -1000000.1, 1.7e+308,
+                        -1.7e+308, 9223372036854775816.43, -9223372036854775816.43};
         assertEquals(EXPECTED_LIST.length, DoubleConstantsTestConstants.DOUBLE_LIST_TEST.size());
         for (int i = 0; i < EXPECTED_LIST.length; ++i) {
             assertEquals(
-                String.format(
-                    ASSERTION_MESSAGE_FOR_RENDERED_DOUBLE_LIST_TEST,
                     EXPECTED_LIST[i],
-                    DoubleConstantsTestConstants.DOUBLE_LIST_TEST.get(i)),
-                EXPECTED_LIST[i], DoubleConstantsTestConstants.DOUBLE_LIST_TEST.get(i), EPSILON);
+                    DoubleConstantsTestConstants.DOUBLE_LIST_TEST.get(i), EPSILON, String.format(
+                            ASSERTION_MESSAGE_FOR_RENDERED_DOUBLE_LIST_TEST,
+                            EXPECTED_LIST[i],
+                            DoubleConstantsTestConstants.DOUBLE_LIST_TEST.get(i)));
         }
     }
 
     // to make sure the variables inside Thrift files are generated correctly
+    @Test
     public void testRenderedDoubleConstants() throws Exception {
         final double EXPECTED_DOUBLE_ASSIGNED_TO_INT_CONSTANT = 1.0;
         final double EXPECTED_DOUBLE_ASSIGNED_TO_NEGATIVE_INT_CONSTANT = -100.0;
@@ -64,116 +67,115 @@
         final double EXPECTED_DOUBLE_ASSIGNED_TO_SMALL_DOUBLE = -1.7e+308;
         final double EXPECTED_DOUBLE_ASSIGNED_TO_NEGATIVE_BUT_LARGE_FRACTIONAL_DOUBLE = -9223372036854775816.43;
         assertEquals(
-            String.format(
-                ASSERTION_MESSAGE_FOR_RENDERED_DOUBLE_CONSTANTS_TEST,
                 EXPECTED_DOUBLE_ASSIGNED_TO_INT_CONSTANT,
-                DoubleConstantsTestConstants.DOUBLE_ASSIGNED_TO_INT_CONSTANT_TEST),
-            EXPECTED_DOUBLE_ASSIGNED_TO_INT_CONSTANT,
-            DoubleConstantsTestConstants.DOUBLE_ASSIGNED_TO_INT_CONSTANT_TEST, EPSILON);
+                DoubleConstantsTestConstants.DOUBLE_ASSIGNED_TO_INT_CONSTANT_TEST, EPSILON,
+                String.format(
+                        ASSERTION_MESSAGE_FOR_RENDERED_DOUBLE_CONSTANTS_TEST,
+                        EXPECTED_DOUBLE_ASSIGNED_TO_INT_CONSTANT,
+                        DoubleConstantsTestConstants.DOUBLE_ASSIGNED_TO_INT_CONSTANT_TEST));
         assertEquals(
-            String.format(
-                ASSERTION_MESSAGE_FOR_RENDERED_DOUBLE_CONSTANTS_TEST,
                 EXPECTED_DOUBLE_ASSIGNED_TO_NEGATIVE_INT_CONSTANT,
-                DoubleConstantsTestConstants.DOUBLE_ASSIGNED_TO_NEGATIVE_INT_CONSTANT_TEST),
-            EXPECTED_DOUBLE_ASSIGNED_TO_NEGATIVE_INT_CONSTANT,
-            DoubleConstantsTestConstants.DOUBLE_ASSIGNED_TO_NEGATIVE_INT_CONSTANT_TEST, EPSILON);
+                DoubleConstantsTestConstants.DOUBLE_ASSIGNED_TO_NEGATIVE_INT_CONSTANT_TEST, EPSILON,
+                String.format(
+                        ASSERTION_MESSAGE_FOR_RENDERED_DOUBLE_CONSTANTS_TEST,
+                        EXPECTED_DOUBLE_ASSIGNED_TO_NEGATIVE_INT_CONSTANT,
+                        DoubleConstantsTestConstants.DOUBLE_ASSIGNED_TO_NEGATIVE_INT_CONSTANT_TEST));
         assertEquals(
-            String.format(
-                ASSERTION_MESSAGE_FOR_RENDERED_DOUBLE_CONSTANTS_TEST,
                 EXPECTED_DOUBLE_ASSIGNED_TO_LARGEST_INT_CONSTANT,
-                DoubleConstantsTestConstants.DOUBLE_ASSIGNED_TO_LARGEST_INT_CONSTANT_TEST),
-            EXPECTED_DOUBLE_ASSIGNED_TO_LARGEST_INT_CONSTANT,
-            DoubleConstantsTestConstants.DOUBLE_ASSIGNED_TO_LARGEST_INT_CONSTANT_TEST, EPSILON);
+                DoubleConstantsTestConstants.DOUBLE_ASSIGNED_TO_LARGEST_INT_CONSTANT_TEST, EPSILON,
+                String.format(
+                        ASSERTION_MESSAGE_FOR_RENDERED_DOUBLE_CONSTANTS_TEST,
+                        EXPECTED_DOUBLE_ASSIGNED_TO_LARGEST_INT_CONSTANT,
+                        DoubleConstantsTestConstants.DOUBLE_ASSIGNED_TO_LARGEST_INT_CONSTANT_TEST));
         assertEquals(
-            String.format(
-                ASSERTION_MESSAGE_FOR_RENDERED_DOUBLE_CONSTANTS_TEST,
                 EXPECTED_DOUBLE_ASSIGNED_TO_SMALLEST_INT_CONSTANT,
-                DoubleConstantsTestConstants.DOUBLE_ASSIGNED_TO_SMALLEST_INT_CONSTANT_TEST),
-            EXPECTED_DOUBLE_ASSIGNED_TO_SMALLEST_INT_CONSTANT,
-            DoubleConstantsTestConstants.DOUBLE_ASSIGNED_TO_SMALLEST_INT_CONSTANT_TEST, EPSILON);
+                DoubleConstantsTestConstants.DOUBLE_ASSIGNED_TO_SMALLEST_INT_CONSTANT_TEST, EPSILON,
+                String.format(
+                        ASSERTION_MESSAGE_FOR_RENDERED_DOUBLE_CONSTANTS_TEST,
+                        EXPECTED_DOUBLE_ASSIGNED_TO_SMALLEST_INT_CONSTANT,
+                        DoubleConstantsTestConstants.DOUBLE_ASSIGNED_TO_SMALLEST_INT_CONSTANT_TEST));
         assertEquals(
-            String.format(
-                ASSERTION_MESSAGE_FOR_RENDERED_DOUBLE_CONSTANTS_TEST,
                 EXPECTED_DOUBLE_ASSIGNED_TO_DOUBLE_WITH_MANY_DECIMALS,
-                DoubleConstantsTestConstants.DOUBLE_ASSIGNED_TO_DOUBLE_WITH_MANY_DECIMALS_TEST),
-            EXPECTED_DOUBLE_ASSIGNED_TO_DOUBLE_WITH_MANY_DECIMALS,
-            DoubleConstantsTestConstants.DOUBLE_ASSIGNED_TO_DOUBLE_WITH_MANY_DECIMALS_TEST, EPSILON);
+                DoubleConstantsTestConstants.DOUBLE_ASSIGNED_TO_DOUBLE_WITH_MANY_DECIMALS_TEST, EPSILON,
+                String.format(
+                        ASSERTION_MESSAGE_FOR_RENDERED_DOUBLE_CONSTANTS_TEST,
+                        EXPECTED_DOUBLE_ASSIGNED_TO_DOUBLE_WITH_MANY_DECIMALS,
+                        DoubleConstantsTestConstants.DOUBLE_ASSIGNED_TO_DOUBLE_WITH_MANY_DECIMALS_TEST));
         assertEquals(
-            String.format(
-                ASSERTION_MESSAGE_FOR_RENDERED_DOUBLE_CONSTANTS_TEST,
                 EXPECTED_DOUBLE_ASSIGNED_TO_FRACTIONAL_DOUBLE,
-                DoubleConstantsTestConstants.DOUBLE_ASSIGNED_TO_FRACTIONAL_DOUBLE_TEST),
-            EXPECTED_DOUBLE_ASSIGNED_TO_FRACTIONAL_DOUBLE,
-            DoubleConstantsTestConstants.DOUBLE_ASSIGNED_TO_FRACTIONAL_DOUBLE_TEST, EPSILON);
+                DoubleConstantsTestConstants.DOUBLE_ASSIGNED_TO_FRACTIONAL_DOUBLE_TEST, EPSILON,
+                String.format(
+                        ASSERTION_MESSAGE_FOR_RENDERED_DOUBLE_CONSTANTS_TEST,
+                        EXPECTED_DOUBLE_ASSIGNED_TO_FRACTIONAL_DOUBLE,
+                        DoubleConstantsTestConstants.DOUBLE_ASSIGNED_TO_FRACTIONAL_DOUBLE_TEST));
         assertEquals(
-            String.format(
-                ASSERTION_MESSAGE_FOR_RENDERED_DOUBLE_CONSTANTS_TEST,
                 EXPECTED_DOUBLE_ASSIGNED_TO_NEGATIVE_FRACTIONAL_DOUBLE,
-                DoubleConstantsTestConstants.DOUBLE_ASSIGNED_TO_NEGATIVE_FRACTIONAL_DOUBLE_TEST),
-            EXPECTED_DOUBLE_ASSIGNED_TO_NEGATIVE_FRACTIONAL_DOUBLE,
-            DoubleConstantsTestConstants.DOUBLE_ASSIGNED_TO_NEGATIVE_FRACTIONAL_DOUBLE_TEST, EPSILON);
+                DoubleConstantsTestConstants.DOUBLE_ASSIGNED_TO_NEGATIVE_FRACTIONAL_DOUBLE_TEST, EPSILON, String.format(
+                        ASSERTION_MESSAGE_FOR_RENDERED_DOUBLE_CONSTANTS_TEST,
+                        EXPECTED_DOUBLE_ASSIGNED_TO_NEGATIVE_FRACTIONAL_DOUBLE,
+                        DoubleConstantsTestConstants.DOUBLE_ASSIGNED_TO_NEGATIVE_FRACTIONAL_DOUBLE_TEST));
         assertEquals(
-            String.format(
-                ASSERTION_MESSAGE_FOR_RENDERED_DOUBLE_CONSTANTS_TEST,
                 EXPECTED_DOUBLE_ASSIGNED_TO_LARGE_DOUBLE,
-                DoubleConstantsTestConstants.DOUBLE_ASSIGNED_TO_LARGE_DOUBLE_TEST),
-            EXPECTED_DOUBLE_ASSIGNED_TO_LARGE_DOUBLE,
-            DoubleConstantsTestConstants.DOUBLE_ASSIGNED_TO_LARGE_DOUBLE_TEST, EPSILON);
+                DoubleConstantsTestConstants.DOUBLE_ASSIGNED_TO_LARGE_DOUBLE_TEST, EPSILON,
+                String.format(
+                        ASSERTION_MESSAGE_FOR_RENDERED_DOUBLE_CONSTANTS_TEST,
+                        EXPECTED_DOUBLE_ASSIGNED_TO_LARGE_DOUBLE,
+                        DoubleConstantsTestConstants.DOUBLE_ASSIGNED_TO_LARGE_DOUBLE_TEST));
         assertEquals(
-            String.format(
-                ASSERTION_MESSAGE_FOR_RENDERED_DOUBLE_CONSTANTS_TEST,
                 EXPECTED_DOUBLE_ASSIGNED_TO_LARGE_FRACTIONAL_DOUBLE,
-                DoubleConstantsTestConstants.DOUBLE_ASSIGNED_TO_LARGE_FRACTIONAL_DOUBLE_TEST),
-            EXPECTED_DOUBLE_ASSIGNED_TO_LARGE_FRACTIONAL_DOUBLE,
-            DoubleConstantsTestConstants.DOUBLE_ASSIGNED_TO_LARGE_FRACTIONAL_DOUBLE_TEST, EPSILON);
+                DoubleConstantsTestConstants.DOUBLE_ASSIGNED_TO_LARGE_FRACTIONAL_DOUBLE_TEST, EPSILON,
+                String.format(
+                        ASSERTION_MESSAGE_FOR_RENDERED_DOUBLE_CONSTANTS_TEST,
+                        EXPECTED_DOUBLE_ASSIGNED_TO_LARGE_FRACTIONAL_DOUBLE,
+                        DoubleConstantsTestConstants.DOUBLE_ASSIGNED_TO_LARGE_FRACTIONAL_DOUBLE_TEST));
         assertEquals(
-            String.format(
-                ASSERTION_MESSAGE_FOR_RENDERED_DOUBLE_CONSTANTS_TEST,
                 EXPECTED_DOUBLE_ASSIGNED_TO_SMALL_DOUBLE,
-                DoubleConstantsTestConstants.DOUBLE_ASSIGNED_TO_SMALL_DOUBLE_TEST),
-            EXPECTED_DOUBLE_ASSIGNED_TO_SMALL_DOUBLE,
-            DoubleConstantsTestConstants.DOUBLE_ASSIGNED_TO_SMALL_DOUBLE_TEST, EPSILON);
+                DoubleConstantsTestConstants.DOUBLE_ASSIGNED_TO_SMALL_DOUBLE_TEST, EPSILON,
+                String.format(
+                        ASSERTION_MESSAGE_FOR_RENDERED_DOUBLE_CONSTANTS_TEST,
+                        EXPECTED_DOUBLE_ASSIGNED_TO_SMALL_DOUBLE,
+                        DoubleConstantsTestConstants.DOUBLE_ASSIGNED_TO_SMALL_DOUBLE_TEST));
         assertEquals(
-            String.format(
-                ASSERTION_MESSAGE_FOR_RENDERED_DOUBLE_CONSTANTS_TEST,
                 EXPECTED_DOUBLE_ASSIGNED_TO_NEGATIVE_BUT_LARGE_FRACTIONAL_DOUBLE,
-                DoubleConstantsTestConstants.DOUBLE_ASSIGNED_TO_NEGATIVE_BUT_LARGE_FRACTIONAL_DOUBLE_TEST),
-            EXPECTED_DOUBLE_ASSIGNED_TO_NEGATIVE_BUT_LARGE_FRACTIONAL_DOUBLE,
-            DoubleConstantsTestConstants.DOUBLE_ASSIGNED_TO_NEGATIVE_BUT_LARGE_FRACTIONAL_DOUBLE_TEST, EPSILON);
+                DoubleConstantsTestConstants.DOUBLE_ASSIGNED_TO_NEGATIVE_BUT_LARGE_FRACTIONAL_DOUBLE_TEST, EPSILON,
+                String.format(
+                        ASSERTION_MESSAGE_FOR_RENDERED_DOUBLE_CONSTANTS_TEST,
+                        EXPECTED_DOUBLE_ASSIGNED_TO_NEGATIVE_BUT_LARGE_FRACTIONAL_DOUBLE,
+                        DoubleConstantsTestConstants.DOUBLE_ASSIGNED_TO_NEGATIVE_BUT_LARGE_FRACTIONAL_DOUBLE_TEST));
         assertTrue(
-            String.format(ASSERTION_MESSAGE_FOR_TYPE_CHECKS, "DOUBLE_ASSIGNED_TO_INT_CONSTANT_TEST"),
-            Double.class.isInstance(DoubleConstantsTestConstants.DOUBLE_ASSIGNED_TO_INT_CONSTANT_TEST));
+                Double.class.isInstance(DoubleConstantsTestConstants.DOUBLE_ASSIGNED_TO_INT_CONSTANT_TEST),
+                String.format(ASSERTION_MESSAGE_FOR_TYPE_CHECKS, "DOUBLE_ASSIGNED_TO_INT_CONSTANT_TEST"));
         assertTrue(
-            String.format(ASSERTION_MESSAGE_FOR_TYPE_CHECKS, "DOUBLE_ASSIGNED_TO_NEGATIVE_INT_CONSTANT_TEST"),
-            Double.class.isInstance(DoubleConstantsTestConstants.DOUBLE_ASSIGNED_TO_NEGATIVE_INT_CONSTANT_TEST));
+                Double.class.isInstance(DoubleConstantsTestConstants.DOUBLE_ASSIGNED_TO_NEGATIVE_INT_CONSTANT_TEST),
+                String.format(ASSERTION_MESSAGE_FOR_TYPE_CHECKS, "DOUBLE_ASSIGNED_TO_NEGATIVE_INT_CONSTANT_TEST"));
         assertTrue(
-            String.format(ASSERTION_MESSAGE_FOR_TYPE_CHECKS, "DOUBLE_ASSIGNED_TO_LARGEST_INT_CONSTANT_TEST"),
-            Double.class.isInstance(DoubleConstantsTestConstants.DOUBLE_ASSIGNED_TO_LARGEST_INT_CONSTANT_TEST));
+                Double.class.isInstance(DoubleConstantsTestConstants.DOUBLE_ASSIGNED_TO_LARGEST_INT_CONSTANT_TEST),
+                String.format(ASSERTION_MESSAGE_FOR_TYPE_CHECKS, "DOUBLE_ASSIGNED_TO_LARGEST_INT_CONSTANT_TEST"));
         assertTrue(
-            String.format(ASSERTION_MESSAGE_FOR_TYPE_CHECKS, "DOUBLE_ASSIGNED_TO_SMALLEST_INT_CONSTANT_TEST"),
-            Double.class.isInstance(DoubleConstantsTestConstants.DOUBLE_ASSIGNED_TO_SMALLEST_INT_CONSTANT_TEST));
+                Double.class.isInstance(DoubleConstantsTestConstants.DOUBLE_ASSIGNED_TO_SMALLEST_INT_CONSTANT_TEST),
+                String.format(ASSERTION_MESSAGE_FOR_TYPE_CHECKS, "DOUBLE_ASSIGNED_TO_SMALLEST_INT_CONSTANT_TEST"));
         assertTrue(
-            String.format(ASSERTION_MESSAGE_FOR_TYPE_CHECKS, "DOUBLE_ASSIGNED_TO_DOUBLE_WITH_MANY_DECIMALS_TEST"),
-            Double.class.isInstance(DoubleConstantsTestConstants.DOUBLE_ASSIGNED_TO_DOUBLE_WITH_MANY_DECIMALS_TEST));
+                Double.class.isInstance(DoubleConstantsTestConstants.DOUBLE_ASSIGNED_TO_DOUBLE_WITH_MANY_DECIMALS_TEST),
+                String.format(ASSERTION_MESSAGE_FOR_TYPE_CHECKS, "DOUBLE_ASSIGNED_TO_DOUBLE_WITH_MANY_DECIMALS_TEST"));
         assertTrue(
-            String.format(ASSERTION_MESSAGE_FOR_TYPE_CHECKS, "DOUBLE_ASSIGNED_TO_FRACTIONAL_DOUBLE_TEST"),
-            Double.class.isInstance(DoubleConstantsTestConstants.DOUBLE_ASSIGNED_TO_FRACTIONAL_DOUBLE_TEST));
+                Double.class.isInstance(DoubleConstantsTestConstants.DOUBLE_ASSIGNED_TO_FRACTIONAL_DOUBLE_TEST),
+                String.format(ASSERTION_MESSAGE_FOR_TYPE_CHECKS, "DOUBLE_ASSIGNED_TO_FRACTIONAL_DOUBLE_TEST"));
         assertTrue(
-            String.format(ASSERTION_MESSAGE_FOR_TYPE_CHECKS, "DOUBLE_ASSIGNED_TO_NEGATIVE_FRACTIONAL_DOUBLE_TEST"),
-            Double.class.isInstance(DoubleConstantsTestConstants.DOUBLE_ASSIGNED_TO_NEGATIVE_FRACTIONAL_DOUBLE_TEST));
+                Double.class.isInstance(DoubleConstantsTestConstants.DOUBLE_ASSIGNED_TO_NEGATIVE_FRACTIONAL_DOUBLE_TEST),
+                String.format(ASSERTION_MESSAGE_FOR_TYPE_CHECKS, "DOUBLE_ASSIGNED_TO_NEGATIVE_FRACTIONAL_DOUBLE_TEST"));
         //assertTrue(
         //    String.format(ASSERTION_MESSAGE_FOR_TYPE_CHECKS, "DOUBLE_ASSIGNED_TO_LARGE_DOUBLE_TEST"),
         //    Double.class.isInstance(DoubleConstantsTestConstants.DOUBLE_ASSIGNED_TO_LARGE_DOUBLE_TEST));
         assertTrue(
-            String.format(ASSERTION_MESSAGE_FOR_TYPE_CHECKS, "DOUBLE_ASSIGNED_TO_LARGE_FRACTIONAL_DOUBLE_TEST"),
-            Double.class.isInstance(DoubleConstantsTestConstants.DOUBLE_ASSIGNED_TO_LARGE_FRACTIONAL_DOUBLE_TEST));
+                Double.class.isInstance(DoubleConstantsTestConstants.DOUBLE_ASSIGNED_TO_LARGE_FRACTIONAL_DOUBLE_TEST),
+                String.format(ASSERTION_MESSAGE_FOR_TYPE_CHECKS, "DOUBLE_ASSIGNED_TO_LARGE_FRACTIONAL_DOUBLE_TEST"));
         //assertTrue(
         //    String.format(ASSERTION_MESSAGE_FOR_TYPE_CHECKS, "DOUBLE_ASSIGNED_TO_SMALL_DOUBLE_TEST"),
         //    Double.class.isInstance(DoubleConstantsTestConstants.DOUBLE_ASSIGNED_TO_SMALL_DOUBLE_TEST));
         assertTrue(
-            String.format(
-                ASSERTION_MESSAGE_FOR_TYPE_CHECKS, "DOUBLE_ASSIGNED_TO_NEGATIVE_BUT_LARGE_FRACTIONAL_DOUBLE_TEST"),
-            Double.class.isInstance(
-                DoubleConstantsTestConstants.DOUBLE_ASSIGNED_TO_NEGATIVE_BUT_LARGE_FRACTIONAL_DOUBLE_TEST));
+                Double.class.isInstance(
+                                DoubleConstantsTestConstants.DOUBLE_ASSIGNED_TO_NEGATIVE_BUT_LARGE_FRACTIONAL_DOUBLE_TEST),
+                String.format(
+                                ASSERTION_MESSAGE_FOR_TYPE_CHECKS, "DOUBLE_ASSIGNED_TO_NEGATIVE_BUT_LARGE_FRACTIONAL_DOUBLE_TEST"));
     }
 }
diff --git a/lib/java/src/test/java/org/apache/thrift/TestReuse.java b/lib/java/src/test/java/org/apache/thrift/TestReuse.java
index 2482d39..56dc1d4 100644
--- a/lib/java/src/test/java/org/apache/thrift/TestReuse.java
+++ b/lib/java/src/test/java/org/apache/thrift/TestReuse.java
@@ -19,25 +19,29 @@
 
 package org.apache.thrift;
 
+import org.apache.thrift.protocol.TBinaryProtocol;
+import org.junit.jupiter.api.Test;
+import thrift.test.Reuse;
+
 import java.util.HashSet;
 
-import org.apache.thrift.protocol.TBinaryProtocol;
-
-import thrift.test.Reuse;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertSame;
 
 // Tests reusing objects for deserialization.
 //
 public class TestReuse extends TestStruct {
 
+  @Test
   public void testReuseObject() throws Exception {
     TSerializer   binarySerializer   = new   TSerializer(new TBinaryProtocol.Factory());
     TDeserializer binaryDeserializer = new TDeserializer(new TBinaryProtocol.Factory());
 
     Reuse ru1 = new Reuse();
-    HashSet<String> hs1 = new HashSet<String>();
+    HashSet<String> hs1 = new HashSet<>();
     byte[] serBytes;
-    String st1 = new String("string1");
-    String st2 = new String("string2");
+    String st1 = "string1";
+    String st2 = "string2";
 
     ru1.setVal1(11);
     ru1.setVal2(hs1);
@@ -50,8 +54,8 @@
 
     binaryDeserializer.deserialize(ru1, serBytes);
 
-    assertTrue( ru1.getVal2() == hs1 );
-    assertTrue( hs1.size() == 2 );
+    assertSame(hs1, ru1.getVal2());
+    assertEquals(2, hs1.size());
   }
 
 }
diff --git a/lib/java/src/test/java/org/apache/thrift/TestStruct.java b/lib/java/src/test/java/org/apache/thrift/TestStruct.java
index 3379ed1..84b00b4 100644
--- a/lib/java/src/test/java/org/apache/thrift/TestStruct.java
+++ b/lib/java/src/test/java/org/apache/thrift/TestStruct.java
@@ -18,16 +18,6 @@
  */
 package org.apache.thrift;
 
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutputStream;
-import java.nio.ByteBuffer;
-import java.util.HashMap;
-import java.util.Map;
-
-import junit.framework.TestCase;
-
 import org.apache.thrift.meta_data.FieldMetaData;
 import org.apache.thrift.meta_data.ListMetaData;
 import org.apache.thrift.meta_data.MapMetaData;
@@ -35,7 +25,7 @@
 import org.apache.thrift.meta_data.StructMetaData;
 import org.apache.thrift.protocol.TBinaryProtocol;
 import org.apache.thrift.protocol.TType;
-
+import org.junit.jupiter.api.Test;
 import thrift.test.Bonk;
 import thrift.test.CrazyNesting;
 import thrift.test.HolyMoley;
@@ -48,12 +38,29 @@
 import thrift.test.StructB;
 import thrift.test.Xtruct;
 
-public class TestStruct extends TestCase {
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.nio.ByteBuffer;
+import java.util.HashMap;
+import java.util.Map;
+
+import static org.junit.jupiter.api.Assertions.assertArrayEquals;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+public class TestStruct {
+  @Test
   public void testIdentity() throws Exception {
     TSerializer   binarySerializer   = new   TSerializer(new TBinaryProtocol.Factory());
     TDeserializer binaryDeserializer = new TDeserializer(new TBinaryProtocol.Factory());
 
-    OneOfEach ooe = Fixtures.oneOfEach;
+    OneOfEach ooe = Fixtures.getOneOfEach();
 
     Nesting n = new Nesting();
     n.my_ooe = ooe;
@@ -66,9 +73,9 @@
                                 "\u043e\u0261\u0433\u0430\u03c1\u210e\u0020"+
                                 "\u0391\u0074\u0074\u03b1\u217d\u03ba\u01c3"+
                                 "\u203c";
-    n.my_bonk = Fixtures.nesting.my_bonk;
+    n.my_bonk = Fixtures.getNesting().my_bonk;
 
-    HolyMoley hm = Fixtures.holyMoley;
+    HolyMoley hm = Fixtures.getHolyMoley();
 
     OneOfEach ooe2 = new OneOfEach();
     binaryDeserializer.deserialize(
@@ -96,11 +103,12 @@
     assertEquals(hm.hashCode(), hm2.hashCode());
   }
 
+  @Test
   public void testDeepCopy() throws Exception {
     TSerializer   binarySerializer   = new   TSerializer(new TBinaryProtocol.Factory());
     TDeserializer binaryDeserializer = new TDeserializer(new TBinaryProtocol.Factory());
 
-    HolyMoley hm = Fixtures.holyMoley;
+    HolyMoley hm = Fixtures.getHolyMoley();
 
     byte[] binaryCopy = binarySerializer.serialize(hm);
     HolyMoley hmCopy = new HolyMoley();
@@ -121,6 +129,7 @@
     assertFalse(hm.equals(hmCopy2));
   }
 
+  @Test
   public void testCompareTo() throws Exception {
     Bonk bonk1 = new Bonk();
     Bonk bonk2 = new Bonk();
@@ -150,6 +159,7 @@
     assertEquals(0, bonk1.compareTo(bonk2));
   }
 
+  @Test
   public void testCompareToWithDataStructures() {
     Insanity insanity1 = new Insanity();
     Insanity insanity2 = new Insanity();
@@ -162,7 +172,7 @@
     expectGreaterThan(insanity1, insanity2);
 
     // insanity1.map = {2:1}, insanity2.map = null
-    insanity1.getUserMap().put(Numberz.TWO, 1l);
+    insanity1.getUserMap().put(Numberz.TWO, 1L);
     expectGreaterThan(insanity1, insanity2);
 
     // insanity1.map = {2:1}, insanity2.map = {}
@@ -170,34 +180,35 @@
     expectGreaterThan(insanity1, insanity2);
 
     // insanity1.map = {2:1}, insanity2.map = {2:2}
-    insanity2.getUserMap().put(Numberz.TWO, 2l);
+    insanity2.getUserMap().put(Numberz.TWO, 2L);
     expectLessThan(insanity1, insanity2);
 
     // insanity1.map = {2:1, 3:5}, insanity2.map = {2:2}
-    insanity1.getUserMap().put(Numberz.THREE, 5l);
+    insanity1.getUserMap().put(Numberz.THREE, 5L);
     expectGreaterThan(insanity1, insanity2);
 
     // insanity1.map = {2:1, 3:5}, insanity2.map = {2:1, 4:5}
-    insanity2.getUserMap().put(Numberz.TWO, 1l);
-    insanity2.getUserMap().put(Numberz.FIVE, 5l);
+    insanity2.getUserMap().put(Numberz.TWO, 1L);
+    insanity2.getUserMap().put(Numberz.FIVE, 5L);
     expectLessThan(insanity1, insanity2);
   }
 
   private void expectLessThan(Insanity insanity1, Insanity insanity2) {
     int compareTo = insanity1.compareTo(insanity2);
-    assertTrue(insanity1 + " should be less than " + insanity2 + ", but is: " + compareTo, compareTo < 0);
+    assertTrue(compareTo < 0, insanity1 + " should be less than " + insanity2 + ", but is: " + compareTo);
   }
 
   private void expectGreaterThan(Insanity insanity1, Insanity insanity2) {
     int compareTo = insanity1.compareTo(insanity2);
-    assertTrue(insanity1 + " should be greater than " + insanity2 + ", but is: " + compareTo, compareTo > 0);
+    assertTrue(compareTo > 0, insanity1 + " should be greater than " + insanity2 + ", but is: " + compareTo);
   }
 
   private void expectEquals(Insanity insanity1, Insanity insanity2) {
     int compareTo = insanity1.compareTo(insanity2);
-    assertEquals(insanity1 + " should be equal to " + insanity2 + ", but is: " + compareTo, 0, compareTo);
+    assertEquals(0, compareTo, insanity1 + " should be equal to " + insanity2 + ", but is: " + compareTo);
   }
 
+  @Test
   public void testMetaData() throws Exception {
     Map<CrazyNesting._Fields, FieldMetaData> mdMap = CrazyNesting.metaDataMap;
 
@@ -251,6 +262,7 @@
     assertFalse(vmd.keyMetaData.isTypedef());
   }
 
+  @Test
   public void testToString() throws Exception {
     JavaTestHelper object = new JavaTestHelper();
     object.req_int = 0;
@@ -277,7 +289,7 @@
         "97 6A 95 6C 93 6E 91 70 8F 72 8D 74 8B 76 89 78 87 7A 85 7C 83 "+
         "7E 81)",
         object.toString());
- 
+
     object.req_bin = ByteBuffer.wrap(new byte[] {
       0, -1, 2, -3, 4, -5, 6, -7, 8, -9, 10, -11, 12, -13, 14, -15,
       16, -17, 18, -19, 20, -21, 22, -23, 24, -25, 26, -27, 28, -29,
@@ -304,18 +316,13 @@
     object.req_bin = ByteBuffer.wrap(new byte[] {});
     object.setOpt_binIsSet(true);
 
-    assertEquals("JavaTestHelper(req_int:0, req_obj:, req_bin:)", 
+    assertEquals("JavaTestHelper(req_int:0, req_obj:, req_bin:)",
         object.toString());
   }
 
-  private static void assertArrayEquals(byte[] expected, byte[] actual) {
-    if (!java.util.Arrays.equals(expected, actual)) {
-      fail("Expected byte array did not match actual.");
-    }
-  }
-
+  @Test
   public void testBytesBufferFeatures() throws Exception {
-    
+
     final String testString = "testBytesBufferFeatures";
     final JavaTestHelper o = new JavaTestHelper();
 
@@ -344,11 +351,12 @@
     assertArrayEquals(testString.getBytes(), o.getReq_bin());
   }
 
+  @Test
   public void testJavaSerializable() throws Exception {
     ByteArrayOutputStream baos = new ByteArrayOutputStream();
     ObjectOutputStream oos = new ObjectOutputStream(baos);
-    
-    OneOfEach ooe = Fixtures.oneOfEach;
+
+    OneOfEach ooe = Fixtures.getOneOfEach();
 
     // Serialize ooe the Java way...
     oos.writeObject(ooe);
@@ -362,35 +370,21 @@
     assertEquals(ooe, ooe2);
   }
 
+  @Test
   public void testSubStructValidation() throws Exception {
     StructA valid = new StructA("valid");
     StructA invalid = new StructA();
 
     StructB b = new StructB();
-    try {
-      b.validate();
-      fail();
-    } catch (TException e) {
-      // expected
-    }
+    assertThrows(TException.class, b::validate);
 
     b = new StructB().setAb(valid);
     b.validate();
 
     b = new StructB().setAb(invalid);
-    try {
-      b.validate();
-      fail();
-    } catch (TException e) {
-      // expected
-    }
+    assertThrows(TException.class, b::validate);
 
     b = new StructB().setAb(valid).setAa(invalid);
-    try {
-      b.validate();
-      fail();
-    } catch (TException e) {
-      // expected
-    }
+    assertThrows(TException.class, b::validate);
   }
 }
diff --git a/lib/java/src/test/java/org/apache/thrift/TestTBaseHelper.java b/lib/java/src/test/java/org/apache/thrift/TestTBaseHelper.java
index 8b08555..b877afa 100644
--- a/lib/java/src/test/java/org/apache/thrift/TestTBaseHelper.java
+++ b/lib/java/src/test/java/org/apache/thrift/TestTBaseHelper.java
@@ -18,6 +18,8 @@
  */
 package org.apache.thrift;
 
+import org.junit.jupiter.api.Test;
+
 import java.nio.ByteBuffer;
 import java.util.Arrays;
 import java.util.HashMap;
@@ -26,18 +28,25 @@
 import java.util.Map;
 import java.util.Set;
 
-import junit.framework.TestCase;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotSame;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
-public class TestTBaseHelper extends TestCase {
+
+
+public class TestTBaseHelper  {
+  @Test
   public void testByteArrayComparison() {
     assertTrue(TBaseHelper.compareTo(new byte[]{'a','b'}, new byte[]{'a','c'}) < 0);
   }
 
+  @Test
   public void testSets() {
-    Set<String> a = new HashSet<String>();
-    Set<String> b = new HashSet<String>();
+    Set<String> a = new HashSet<>();
+    Set<String> b = new HashSet<>();
 
-    assertTrue(TBaseHelper.compareTo(a, b) == 0);
+    assertEquals(0, TBaseHelper.compareTo(a, b));
 
     a.add("test");
 
@@ -45,7 +54,7 @@
 
     b.add("test");
 
-    assertTrue(TBaseHelper.compareTo(a, b) == 0);
+    assertEquals(0, TBaseHelper.compareTo(a, b));
 
     b.add("aardvark");
 
@@ -56,40 +65,43 @@
     assertTrue(TBaseHelper.compareTo(a, b) > 0);
   }
 
+  @Test
   public void testNestedStructures() {
-    Set<List<String>> a = new HashSet<List<String>>();
-    Set<List<String>> b = new HashSet<List<String>>();
+    Set<List<String>> a = new HashSet<>();
+    Set<List<String>> b = new HashSet<>();
 
-    a.add(Arrays.asList(new String[] {"a","b"}));
-    b.add(Arrays.asList(new String[] {"a","b", "c"}));
-    a.add(Arrays.asList(new String[] {"a","b"}));
-    b.add(Arrays.asList(new String[] {"a","b", "c"}));
+    a.add(Arrays.asList("a","b"));
+    b.add(Arrays.asList("a","b", "c"));
+    a.add(Arrays.asList("a","b"));
+    b.add(Arrays.asList("a","b", "c"));
 
     assertTrue(TBaseHelper.compareTo(a, b) < 0);
   }
 
+  @Test
   public void testMapsInSets() {
-    Set<Map<String, Long>> a = new HashSet<Map<String, Long>>();
-    Set<Map<String, Long>> b = new HashSet<Map<String, Long>>();
+    Set<Map<String, Long>> a = new HashSet<>();
+    Set<Map<String, Long>> b = new HashSet<>();
 
-    assertTrue(TBaseHelper.compareTo(a, b) == 0);
+    assertEquals(0, TBaseHelper.compareTo(a, b));
 
-    Map<String, Long> innerA = new HashMap<String, Long>();
-    Map<String, Long> innerB = new HashMap<String, Long>();
+    Map<String, Long> innerA = new HashMap<>();
+    Map<String, Long> innerB = new HashMap<>();
     a.add(innerA);
     b.add(innerB);
 
-    innerA.put("a", 1l);
-    innerB.put("a", 2l);
+    innerA.put("a", 1L);
+    innerB.put("a", 2L);
 
     assertTrue(TBaseHelper.compareTo(a, b) < 0);
   }
 
+  @Test
   public void testByteArraysInMaps() {
-    Map<byte[], Long> a = new HashMap<byte[], Long>();
-    Map<byte[], Long> b = new HashMap<byte[], Long>();
+    Map<byte[], Long> a = new HashMap<>();
+    Map<byte[], Long> b = new HashMap<>();
 
-    assertTrue(TBaseHelper.compareTo(a, b) == 0);
+    assertEquals(0, TBaseHelper.compareTo(a, b));
 
     a.put(new byte[]{'a','b'}, 1000L);
     b.put(new byte[]{'a','b'}, 1000L);
@@ -98,38 +110,42 @@
     assertTrue(TBaseHelper.compareTo(a, b) > 0);
   }
 
+  @Test
   public void testMapsWithNulls() {
-    Map<String, String> a = new HashMap<String, String>();
-    Map<String, String> b = new HashMap<String, String>();
+    Map<String, String> a = new HashMap<>();
+    Map<String, String> b = new HashMap<>();
     a.put("a", null);
     a.put("b", null);
     b.put("a", null);
     b.put("b", null);
 
-    assertTrue(TBaseHelper.compareTo(a, b) == 0);
+    assertEquals(0, TBaseHelper.compareTo(a, b));
   }
 
+  @Test
   public void testMapKeyComparison() {
-    Map<String, String> a = new HashMap<String, String>();
-    Map<String, String> b = new HashMap<String, String>();
+    Map<String, String> a = new HashMap<>();
+    Map<String, String> b = new HashMap<>();
     a.put("a", "a");
     b.put("b", "a");
 
     assertTrue(TBaseHelper.compareTo(a, b) < 0);
   }
 
+  @Test
   public void testMapValueComparison() {
-    Map<String, String> a = new HashMap<String, String>();
-    Map<String, String> b = new HashMap<String, String>();
+    Map<String, String> a = new HashMap<>();
+    Map<String, String> b = new HashMap<>();
     a.put("a", "b");
     b.put("a", "a");
 
     assertTrue(TBaseHelper.compareTo(a, b) > 0);
   }
 
+  @Test
   public void testByteArraysInSets() {
-    Set<byte[]> a = new HashSet<byte[]>();
-    Set<byte[]> b = new HashSet<byte[]>();
+    Set<byte[]> a = new HashSet<>();
+    Set<byte[]> b = new HashSet<>();
 
     if (TBaseHelper.compareTo(a, b) != 0)
       throw new RuntimeException("Set compare failed:" + a + " vs. " + b);
@@ -141,20 +157,23 @@
     assertTrue(TBaseHelper.compareTo(a, b) > 0);
   }
 
+  @Test
   public void testByteBufferToByteArray() throws Exception {
     byte[] b1 = {10,9,8,7,6,5,4,3,2,1,0};
     byte[] b2 = TBaseHelper.byteBufferToByteArray(ByteBuffer.wrap(b1));
-    assertEquals("b1 and b2 should be the exact same array (identity) due to fast path", b1, b2);
+    assertEquals(b1, b2, "b1 and b2 should be the exact same array (identity) due to fast path");
 
     byte[] b3 = TBaseHelper.byteBufferToByteArray(ByteBuffer.wrap(b1, 1, 3));
     assertEquals(3, b3.length);
     assertEquals(ByteBuffer.wrap(b1, 1, 3), ByteBuffer.wrap(b3));
   }
 
+  @Test
   public void testRightSize() throws Exception {
     assertNull(TBaseHelper.rightSize(null));
   }
 
+  @Test
   public void testByteBufferToString() {
     byte[] array = new byte[]{1, 2, 3};
     ByteBuffer bb = ByteBuffer.wrap(array, 1, 2);
@@ -172,6 +191,7 @@
     assertEquals("02 03", sb.toString());
   }
 
+  @Test
   public void testCopyBinaryWithByteBuffer() throws Exception {
     byte[] bytes = new byte[]{0, 1, 2, 3, 4, 5};
     ByteBuffer b = ByteBuffer.wrap(bytes);
@@ -198,6 +218,7 @@
     assertNull(TBaseHelper.copyBinary((ByteBuffer)null));
   }
 
+  @Test
   public void testCopyBinaryWithByteArray() throws Exception {
     byte[] bytes = new byte[]{0, 1, 2, 3, 4, 5};
     byte[] copy = TBaseHelper.copyBinary(bytes);
diff --git a/lib/java/src/test/java/org/apache/thrift/TestTDeserializer.java b/lib/java/src/test/java/org/apache/thrift/TestTDeserializer.java
index a4a353d..c3b588e 100644
--- a/lib/java/src/test/java/org/apache/thrift/TestTDeserializer.java
+++ b/lib/java/src/test/java/org/apache/thrift/TestTDeserializer.java
@@ -18,34 +18,35 @@
  */
 package org.apache.thrift;
 
-import java.nio.ByteBuffer;
-
-import junit.framework.TestCase;
-
 import org.apache.thrift.protocol.TBinaryProtocol;
 import org.apache.thrift.protocol.TCompactProtocol;
 import org.apache.thrift.protocol.TJSONProtocol;
 import org.apache.thrift.protocol.TProtocolFactory;
-
+import org.junit.jupiter.api.Test;
 import thrift.test.Backwards;
 import thrift.test.OneOfEach;
 import thrift.test.PrimitiveThenStruct;
 import thrift.test.StructWithAUnion;
 import thrift.test.TestUnion;
 
-public class TestTDeserializer extends TestCase {
+import java.nio.ByteBuffer;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+public class TestTDeserializer  {
 
   private static final TProtocolFactory[] PROTOCOLS = new TProtocolFactory[] {
-    new TBinaryProtocol.Factory(), 
-    new TCompactProtocol.Factory(), 
+    new TBinaryProtocol.Factory(),
+    new TCompactProtocol.Factory(),
     new TJSONProtocol.Factory()
   };
 
+  @Test
   public void testPartialDeserialize() throws Exception {
     //Root:StructWithAUnion
     //  1:Union
     //    1.3:OneOfEach
-    OneOfEach level3OneOfEach = Fixtures.oneOfEach;
+    OneOfEach level3OneOfEach = Fixtures.getOneOfEach();
     TestUnion level2TestUnion = new TestUnion(TestUnion._Fields.STRUCT_FIELD, level3OneOfEach);
     StructWithAUnion level1SWU = new StructWithAUnion(level2TestUnion);
 
@@ -108,15 +109,15 @@
     }
   }
 
-  public static void testPartialDeserialize(TProtocolFactory protocolFactory, TBase input, TBase output, TBase expected, TFieldIdEnum fieldIdPathFirst, TFieldIdEnum ... fieldIdPathRest) throws TException {
+  private void testPartialDeserialize(TProtocolFactory protocolFactory, TBase input, TBase output, TBase expected, TFieldIdEnum fieldIdPathFirst, TFieldIdEnum ... fieldIdPathRest) throws TException {
     byte[] record = serialize(input, protocolFactory);
     TDeserializer deserializer = new TDeserializer(protocolFactory);
     for (int i = 0; i < 2; i++) {
       TBase outputCopy = output.deepCopy();
       deserializer.partialDeserialize(outputCopy, record, fieldIdPathFirst, fieldIdPathRest);
-      assertEquals("on attempt " + i + ", with " + protocolFactory.toString() 
-          + ", expected " + expected + " but got " + outputCopy,
-          expected, outputCopy);
+      assertEquals(expected,
+              outputCopy, "on attempt " + i + ", with " + protocolFactory
+                + ", expected " + expected + " but got " + outputCopy);
     }
   }
 
diff --git a/lib/java/src/test/java/org/apache/thrift/TestTEnumHelper.java b/lib/java/src/test/java/org/apache/thrift/TestTEnumHelper.java
index e2cca40..e61b179 100644
--- a/lib/java/src/test/java/org/apache/thrift/TestTEnumHelper.java
+++ b/lib/java/src/test/java/org/apache/thrift/TestTEnumHelper.java
@@ -18,24 +18,29 @@
  */
 package org.apache.thrift;
 
+import org.junit.jupiter.api.Test;
 import thrift.test.Numberz;
 
-import junit.framework.TestCase;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNull;
 
-public class TestTEnumHelper extends TestCase {
+public class TestTEnumHelper  {
 
+  @Test
   public void testGetByValue_ValidValues() {
     for (Numberz n: Numberz.values()) {
       int value = n.getValue();
       assertEquals(n, TEnumHelper.getByValue(Numberz.class, value));
-    } 
+    }
   }
 
+  @Test
   public void testGetByValue_InvalidValue() {
-    assertEquals(null, TEnumHelper.getByValue(Numberz.class, 0));
+    assertNull(TEnumHelper.getByValue(Numberz.class, 0));
   }
 
+  @Test
   public void testGetByValue_InvalidClass() {
-    assertEquals(null, TEnumHelper.getByValue(TEnum.class, 0));
+    assertNull(TEnumHelper.getByValue(TEnum.class, 0));
   }
 }
diff --git a/lib/java/src/test/java/org/apache/thrift/TestTUnion.java b/lib/java/src/test/java/org/apache/thrift/TestTUnion.java
index f1e6f0e..36e87c0 100644
--- a/lib/java/src/test/java/org/apache/thrift/TestTUnion.java
+++ b/lib/java/src/test/java/org/apache/thrift/TestTUnion.java
@@ -18,6 +18,19 @@
  */
 package org.apache.thrift;
 
+import org.apache.thrift.protocol.TBinaryProtocol;
+import org.apache.thrift.protocol.TProtocol;
+import org.apache.thrift.protocol.TTupleProtocol;
+import org.apache.thrift.transport.TMemoryBuffer;
+import org.junit.jupiter.api.Test;
+import thrift.test.ComparableUnion;
+import thrift.test.Empty;
+import thrift.test.RandomStuff;
+import thrift.test.SomeEnum;
+import thrift.test.StructWithAUnion;
+import thrift.test.TestUnion;
+import thrift.test.TestUnionMinusStringField;
+
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.ObjectInputStream;
@@ -30,81 +43,63 @@
 import java.util.Map;
 import java.util.Set;
 
-import junit.framework.TestCase;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertNotSame;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
-import org.apache.thrift.protocol.TBinaryProtocol;
-import org.apache.thrift.protocol.TProtocol;
-import org.apache.thrift.protocol.TTupleProtocol;
-import org.apache.thrift.transport.TMemoryBuffer;
+public class TestTUnion  {
 
-import thrift.test.ComparableUnion;
-import thrift.test.Empty;
-import thrift.test.RandomStuff;
-import thrift.test.SomeEnum;
-import thrift.test.StructWithAUnion;
-import thrift.test.TestUnion;
-import thrift.test.TestUnionMinusStringField;
-
-public class TestTUnion extends TestCase {
-
+  @Test
   public void testBasic() throws Exception {
-    TestUnion union = new TestUnion();
-
-    assertFalse(union.isSet());
-    assertFalse(union.isSetI32_field());
-    assertNull(union.getFieldValue());
-
-    union = new TestUnion(TestUnion._Fields.I32_FIELD, 25);
-
-    assertEquals(Integer.valueOf(25), union.getFieldValue());
-  
-    assertEquals(Integer.valueOf(25), union.getFieldValue(TestUnion._Fields.I32_FIELD));
-    
-    assertTrue(union.isSetI32_field());
-  
-    try {
-      union.getFieldValue(TestUnion._Fields.STRING_FIELD);
-      fail("should have thrown an exception");
-    } catch (IllegalArgumentException e) {
-      // cool!
+    {
+      TestUnion union = new TestUnion();
+      assertFalse(union.isSet());
+      assertFalse(union.isSetI32_field());
+      assertNull(union.getFieldValue());
     }
-
-    union = new TestUnion();
-
-    // should not throw an exception here
-    union.hashCode();
-
-    union.setI32_field(1);
-    assertEquals(1, union.getI32_field());
-    union.hashCode();
-
-    assertFalse(union.isSetString_field());
-    
-    try {
-      union.getString_field();
-      fail("should have thrown an exception");
-    } catch (Exception e) {
-      // sweet
+    {
+      TestUnion union = new TestUnion(TestUnion._Fields.I32_FIELD, 25);
+      assertEquals(25, union.getFieldValue());
+      assertEquals(25, union.getFieldValue(TestUnion._Fields.I32_FIELD));
+      assertTrue(union.isSetI32_field());
+      assertThrows(IllegalArgumentException.class, () -> union.getFieldValue(TestUnion._Fields.STRING_FIELD));
     }
+    {
+      TestUnion union = new TestUnion();
+      // should not throw an exception here
+      union.hashCode();
+      union.setI32_field(1);
+      assertEquals(1, union.getI32_field());
+      union.hashCode();
+      assertFalse(union.isSetString_field());
 
-    union = TestUnion.i32_field(1);
-
-    assertFalse(union.equals((TestUnion)null));
-
-    union = TestUnion.enum_field(SomeEnum.ONE);
-    union.hashCode();
-
-    union = new TestUnion();
-    // should not throw an exception
-    union.toString();
+      assertThrows(Exception.class, union::getString_field);
+    }
+    {
+      TestUnion union = TestUnion.i32_field(1);
+      assertFalse(union.equals(null));
+    }
+    {
+      TestUnion union = TestUnion.enum_field(SomeEnum.ONE);
+      union.hashCode();
+    }
+    {
+      TestUnion union = new TestUnion();
+      // should not throw an exception
+      union.toString();
+    }
   }
 
+  @Test
   public void testCompareTo() throws Exception {
     ComparableUnion cu = ComparableUnion.string_field("a");
     ComparableUnion cu2 = ComparableUnion.string_field("b");
 
-    assertTrue(cu.compareTo(cu) == 0);
-    assertTrue(cu2.compareTo(cu2) == 0);
+    assertEquals(0, cu.compareTo(cu));
+    assertEquals(0, cu2.compareTo(cu2));
 
     assertTrue(cu.compareTo(cu2) < 0);
     assertTrue(cu2.compareTo(cu) > 0);
@@ -118,10 +113,10 @@
 
     assertTrue(cu.compareTo(cu2) < 0);
     assertTrue(cu2.compareTo(cu) > 0);
-    
+
     TestUnion union1 = new TestUnion(TestUnion._Fields.STRUCT_LIST, new ArrayList<RandomStuff>());
     TestUnion union2 = new TestUnion(TestUnion._Fields.STRUCT_LIST, new ArrayList<RandomStuff>());
-    assertTrue(union1.compareTo(union2) == 0);
+    assertEquals(0, union1.compareTo(union2));
 
     TestUnion union3 = new TestUnion(TestUnion._Fields.I32_SET, new HashSet<Integer>());
     Set<Integer> i32_set = new HashSet<Integer>();
@@ -136,6 +131,7 @@
     assertTrue(union5.compareTo(union6) > 0);
   }
 
+  @Test
   public void testEquality() throws Exception {
     TestUnion union = new TestUnion(TestUnion._Fields.I32_FIELD, 25);
 
@@ -152,6 +148,7 @@
     assertFalse(union.equals(otherUnion));
   }
 
+  @Test
   public void testSerialization() throws Exception {
     TestUnion union = new TestUnion(TestUnion._Fields.I32_FIELD, 25);
     union.setI32_set(Collections.singleton(42));
@@ -186,7 +183,8 @@
     swau.write(proto);
     new Empty().read(proto);
   }
-  
+
+  @Test
   public void testTupleProtocolSerialization () throws Exception {
     TestUnion union = new TestUnion(TestUnion._Fields.I32_FIELD, 25);
     union.setI32_set(Collections.singleton(42));
@@ -222,6 +220,7 @@
     new Empty().read(proto);
   }
 
+  @Test
   public void testSkip() throws Exception {
     TestUnion tu = TestUnion.string_field("string");
     byte[] tuSerialized = new TSerializer().serialize(tu);
@@ -231,6 +230,7 @@
     assertNull(tums.getFieldValue());
   }
 
+  @Test
   public void testDeepCopy() throws Exception {
     byte[] bytes = {1, 2, 3};
     ByteBuffer value = ByteBuffer.wrap(bytes);
@@ -239,7 +239,8 @@
     assertEquals(cu, copy);
     assertNotSame(cu.bufferForBinary_field().array(), copy.bufferForBinary_field().array());
   }
-  
+
+  @Test
   public void testToString() throws Exception {
     byte[] bytes = {1, 2, 3};
     ByteBuffer value = ByteBuffer.wrap(bytes);
@@ -248,10 +249,11 @@
     assertEquals(expectedString, cu.toString());
   }
 
+  @Test
   public void testJavaSerializable() throws Exception {
     ByteArrayOutputStream baos = new ByteArrayOutputStream();
     ObjectOutputStream oos = new ObjectOutputStream(baos);
-    
+
     TestUnion tu = TestUnion.string_field("string");
 
     // Serialize tu the Java way...
diff --git a/lib/java/src/test/java/org/apache/thrift/TestUnsafeBinaries.java b/lib/java/src/test/java/org/apache/thrift/TestUnsafeBinaries.java
index d1fc213..7e7fc4b 100644
--- a/lib/java/src/test/java/org/apache/thrift/TestUnsafeBinaries.java
+++ b/lib/java/src/test/java/org/apache/thrift/TestUnsafeBinaries.java
@@ -19,15 +19,17 @@
 
 package org.apache.thrift;
 
-import java.nio.ByteBuffer;
-import java.util.Arrays;
-
+import org.junit.jupiter.api.Test;
 import thrift.test.SafeBytes;
 import thrift.test.UnsafeBytes;
 
+import java.nio.ByteBuffer;
+
+import static org.junit.jupiter.api.Assertions.assertArrayEquals;
+
 //  test generating types with un-copied byte[]/ByteBuffer input/output
 //
-public class TestUnsafeBinaries extends TestStruct {
+public class TestUnsafeBinaries {
 
   private static byte[] input() {
     return new byte[]{1, 1};
@@ -38,6 +40,7 @@
   //
 
   //  constructor doesn't copy
+  @Test
   public void testUnsafeConstructor() throws Exception {
 
     byte[] input = input();
@@ -45,30 +48,26 @@
 
     input[0] = 2;
 
-    assertTrue(Arrays.equals(
-        new byte[]{2, 1},
-        struct.getBytes())
-    );
+    assertArrayEquals(new byte[]{2, 1}, struct.getBytes());
 
   }
 
   //  getter doesn't copy
   //  note: this behavior is the same with/without the flag, but if this default ever changes, the current behavior
   //        should be retained when using this flag
+  @Test
   public void testUnsafeGetter(){
     UnsafeBytes struct = new UnsafeBytes(ByteBuffer.wrap(input()));
 
     byte[] val = struct.getBytes();
     val[0] = 2;
 
-    assertTrue(Arrays.equals(
-        new byte[]{2, 1},
-        struct.getBytes())
-    );
+    assertArrayEquals(new byte[]{2, 1}, struct.getBytes());
 
   }
 
   //  setter doesn't copy
+  @Test
   public void testUnsafeSetter(){
     UnsafeBytes struct = new UnsafeBytes();
 
@@ -77,24 +76,19 @@
 
     val[0] = 2;
 
-    assertTrue(Arrays.equals(
-        new byte[]{2, 1},
-        struct.getBytes())
-    );
+    assertArrayEquals(new byte[]{2, 1}, struct.getBytes());
 
   }
 
   //  buffer doens't copy
+  @Test
   public void testUnsafeBufferFor(){
     UnsafeBytes struct = new UnsafeBytes(ByteBuffer.wrap(input()));
 
     ByteBuffer val = struct.bufferForBytes();
     val.array()[0] = 2;
 
-    assertTrue(Arrays.equals(
-        new byte[]{2, 1},
-        struct.getBytes())
-    );
+    assertArrayEquals(new byte[]{2, 1}, struct.getBytes());
 
   }
 
@@ -102,6 +96,7 @@
   //  verify that the default generator does not change behavior
   //
 
+  @Test
   public void testSafeConstructor() {
 
     byte[] input = input();
@@ -109,13 +104,11 @@
 
     input[0] = 2;
 
-    assertTrue(Arrays.equals(
-        new byte[]{1, 1},
-        struct.getBytes())
-    );
+    assertArrayEquals(new byte[]{1, 1}, struct.getBytes());
 
   }
 
+  @Test
   public void testSafeSetter() {
 
     byte[] input = input();
@@ -123,23 +116,18 @@
 
     input[0] = 2;
 
-    assertTrue(Arrays.equals(
-        new byte[]{1, 1},
-        struct.getBytes())
-    );
+    assertArrayEquals(new byte[]{1, 1}, struct.getBytes());
 
   }
 
+  @Test
   public void testSafeBufferFor(){
     SafeBytes struct = new SafeBytes(ByteBuffer.wrap(input()));
 
     ByteBuffer val = struct.bufferForBytes();
     val.array()[0] = 2;
 
-    assertTrue(Arrays.equals(
-        new byte[]{1, 1},
-        struct.getBytes())
-    );
+    assertArrayEquals(new byte[]{1, 1}, struct.getBytes());
 
   }
 
diff --git a/lib/java/src/test/java/org/apache/thrift/async/TestTAsyncClient.java b/lib/java/src/test/java/org/apache/thrift/async/TestTAsyncClient.java
index 392ca22..9a755d3 100644
--- a/lib/java/src/test/java/org/apache/thrift/async/TestTAsyncClient.java
+++ b/lib/java/src/test/java/org/apache/thrift/async/TestTAsyncClient.java
@@ -1,13 +1,16 @@
 package org.apache.thrift.async;
 
-import junit.framework.TestCase;
 
 import org.apache.thrift.TException;
-
+import org.junit.jupiter.api.Test;
 import thrift.test.Srv;
 import thrift.test.Srv.AsyncClient;
 
-public class TestTAsyncClient extends TestCase {
+import static org.junit.jupiter.api.Assertions.assertThrows;
+
+
+public class TestTAsyncClient {
+  @Test
   public void testRaisesExceptionWhenUsedConcurrently() throws Exception {
     TAsyncClientManager mockClientManager = new TAsyncClientManager() {
       @Override
@@ -18,11 +21,6 @@
 
     Srv.AsyncClient c = new AsyncClient(null, mockClientManager, null);
     c.Janky(0, null);
-    try {
-      c.checkReady();
-      fail("should have hit an exception");
-    } catch (Exception e) {
-      // awesome
-    }
+    assertThrows(Exception.class, c::checkReady);
   }
 }
diff --git a/lib/java/src/test/java/org/apache/thrift/async/TestTAsyncClientManager.java b/lib/java/src/test/java/org/apache/thrift/async/TestTAsyncClientManager.java
index 0a20e52..8d12429 100644
--- a/lib/java/src/test/java/org/apache/thrift/async/TestTAsyncClientManager.java
+++ b/lib/java/src/test/java/org/apache/thrift/async/TestTAsyncClientManager.java
@@ -18,6 +18,23 @@
  */
 package org.apache.thrift.async;
 
+import org.apache.thrift.TException;
+import org.apache.thrift.protocol.TBinaryProtocol;
+import org.apache.thrift.server.ServerTestBase;
+import org.apache.thrift.server.THsHaServer;
+import org.apache.thrift.server.THsHaServer.Args;
+import org.apache.thrift.transport.TNonblockingServerSocket;
+import org.apache.thrift.transport.TNonblockingSocket;
+import org.apache.thrift.transport.TTransportException;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import thrift.test.CompactProtoTestStruct;
+import thrift.test.ExceptionWithAMap;
+import thrift.test.Srv;
+import thrift.test.Srv.Iface;
+
 import java.io.IOException;
 import java.io.PrintWriter;
 import java.io.StringWriter;
@@ -30,350 +47,351 @@
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicReference;
 
-import junit.framework.TestCase;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertSame;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
-import org.apache.thrift.TException;
-import org.apache.thrift.protocol.TBinaryProtocol;
-import org.apache.thrift.server.ServerTestBase;
-import org.apache.thrift.server.THsHaServer;
-import org.apache.thrift.server.THsHaServer.Args;
-import org.apache.thrift.transport.TNonblockingServerSocket;
-import org.apache.thrift.transport.TNonblockingSocket;
+public class TestTAsyncClientManager {
 
-import org.apache.thrift.transport.TTransportException;
-import thrift.test.CompactProtoTestStruct;
-import thrift.test.ExceptionWithAMap;
-import thrift.test.Srv;
-import thrift.test.Srv.Iface;
+    private THsHaServer server_;
+    private Thread serverThread_;
+    private TAsyncClientManager clientManager_;
 
-public class TestTAsyncClientManager extends TestCase {
+    @BeforeEach
+    public void setUp() throws Exception {
+        server_ = new THsHaServer(new Args(new TNonblockingServerSocket(
+                new TNonblockingServerSocket.NonblockingAbstractServerSocketArgs().port(ServerTestBase.PORT))).
+                processor(new Srv.Processor(new SrvHandler())));
+        serverThread_ = new Thread(new Runnable() {
+            public void run() {
+                server_.serve();
+            }
+        });
+        serverThread_.start();
+        clientManager_ = new TAsyncClientManager();
+        Thread.sleep(500);
+    }
 
-  private THsHaServer server_;
-  private Thread serverThread_;
-  private TAsyncClientManager clientManager_;
+    @AfterEach
+    public void tearDown() throws Exception {
+        server_.stop();
+        clientManager_.stop();
+        serverThread_.join();
+    }
 
-  public void setUp() throws Exception {
-    server_ = new THsHaServer(new Args(new TNonblockingServerSocket(
-      new TNonblockingServerSocket.NonblockingAbstractServerSocketArgs().port(ServerTestBase.PORT))).
-      processor(new Srv.Processor(new SrvHandler())));
-    serverThread_ = new Thread(new Runnable() {
-      public void run() {
-        server_.serve();
-      }
-    });
-    serverThread_.start();
-    clientManager_ = new TAsyncClientManager();
-    Thread.sleep(500);
-  }
+    @Test
+    public void testBasicCall() throws Exception {
+        Srv.AsyncClient client = getClient();
+        basicCall(client);
+    }
 
-  public void tearDown() throws Exception {
-    server_.stop();
-    clientManager_.stop();
-    serverThread_.join();
-  }
+    @Test
+    public void testBasicCallWithTimeout() throws Exception {
+        Srv.AsyncClient client = getClient();
+        client.setTimeout(5000);
+        basicCall(client);
+    }
 
-  public void testBasicCall() throws Exception {
-    Srv.AsyncClient client = getClient();
-    basicCall(client);
-  }
+    private static abstract class ErrorCallTest<C extends TAsyncClient, R> {
+        final void runTest() throws Exception {
+            final CountDownLatch latch = new CountDownLatch(1);
+            final AtomicReference<Exception> error = new AtomicReference<Exception>();
+            C client = executeErroringCall(new AsyncMethodCallback<R>() {
+                @Override
+                public void onComplete(R response) {
+                    latch.countDown();
+                }
 
-  public void testBasicCallWithTimeout() throws Exception {
-    Srv.AsyncClient client = getClient();
-    client.setTimeout(5000);
-    basicCall(client);
-  }
-
-  private static abstract class ErrorCallTest<C extends TAsyncClient, R> {
-    final void runTest() throws Exception {
-      final CountDownLatch latch = new CountDownLatch(1);
-      final AtomicReference<Exception> error = new AtomicReference<Exception>();
-      C client = executeErroringCall(new AsyncMethodCallback<R>() {
-        @Override
-        public void onComplete(R response) {
-          latch.countDown();
+                @Override
+                public void onError(Exception exception) {
+                    error.set(exception);
+                    latch.countDown();
+                }
+            });
+            latch.await(2, TimeUnit.SECONDS);
+            assertTrue(client.hasError());
+            Exception exception = error.get();
+            assertNotNull(exception);
+            assertSame(exception, client.getError());
+            validateError(client, exception);
         }
 
-        @Override
-        public void onError(Exception exception) {
-          error.set(exception);
-          latch.countDown();
-        }
-      });
-      latch.await(2, TimeUnit.SECONDS);
-      assertTrue(client.hasError());
-      Exception exception = error.get();
-      assertNotNull(exception);
-      assertSame(exception, client.getError());
-      validateError(client, exception);
+        /**
+         * Executes a call that is expected to raise an exception.
+         *
+         * @param callback The testing callback that should be installed.
+         * @return The client the call was made against.
+         * @throws Exception if there was a problem setting up the client or making the call.
+         */
+        abstract C executeErroringCall(AsyncMethodCallback<R> callback) throws Exception;
+
+        /**
+         * Further validates the properties of the error raised in the remote call and the state of the
+         * client after that call.
+         *
+         * @param client The client returned from {@link #executeErroringCall(AsyncMethodCallback)}.
+         * @param error  The exception raised by the remote call.
+         */
+        abstract void validateError(C client, Exception error);
     }
 
-    /**
-     * Executes a call that is expected to raise an exception.
-     *
-     * @param callback The testing callback that should be installed.
-     * @return The client the call was made against.
-     * @throws Exception if there was a problem setting up the client or making the call.
-     */
-    abstract C executeErroringCall(AsyncMethodCallback<R> callback) throws Exception;
-
-    /**
-     * Further validates the properties of the error raised in the remote call and the state of the
-     * client after that call.
-     *
-     * @param client The client returned from {@link #executeErroringCall(AsyncMethodCallback)}.
-     * @param error The exception raised by the remote call.
-     */
-    abstract void validateError(C client, Exception error);
-  }
-
-  public void testUnexpectedRemoteExceptionCall() throws Exception {
-    new ErrorCallTest<Srv.AsyncClient, Boolean>() {
-      @Override
-      Srv.AsyncClient executeErroringCall(AsyncMethodCallback<Boolean> callback) throws Exception {
-        Srv.AsyncClient client = getClient();
-        client.declaredExceptionMethod(false, callback);
-        return client;
-      }
-
-      @Override
-      void validateError(Srv.AsyncClient client, Exception error) {
-        assertFalse(client.hasTimeout());
-        assertTrue(error instanceof TException);
-      }
-    }.runTest();
-  }
-
-  public void testDeclaredRemoteExceptionCall() throws Exception {
-    new ErrorCallTest<Srv.AsyncClient, Boolean>() {
-      @Override
-      Srv.AsyncClient executeErroringCall(AsyncMethodCallback<Boolean> callback) throws Exception {
-        Srv.AsyncClient client = getClient();
-        client.declaredExceptionMethod(true, callback);
-        return client;
-      }
-
-      @Override
-      void validateError(Srv.AsyncClient client, Exception error) {
-        assertFalse(client.hasTimeout());
-        assertEquals(ExceptionWithAMap.class, error.getClass());
-        ExceptionWithAMap exceptionWithAMap = (ExceptionWithAMap) error;
-        assertEquals("blah", exceptionWithAMap.getBlah());
-        assertEquals(new HashMap<String, String>(), exceptionWithAMap.getMap_field());
-      }
-    }.runTest();
-  }
-
-  public void testTimeoutCall() throws Exception {
-    new ErrorCallTest<Srv.AsyncClient, Integer>() {
-      @Override
-      Srv.AsyncClient executeErroringCall(AsyncMethodCallback<Integer> callback) throws Exception {
-        Srv.AsyncClient client = getClient();
-        client.setTimeout(100);
-        client.primitiveMethod(callback);
-        return client;
-      }
-
-      @Override
-      void validateError(Srv.AsyncClient client, Exception error) {
-        assertTrue(client.hasTimeout());
-        assertTrue(error instanceof TimeoutException);
-      }
-    }.runTest();
-  }
-
-  public void testVoidCall() throws Exception {
-    final CountDownLatch latch = new CountDownLatch(1);
-    final AtomicBoolean returned = new AtomicBoolean(false);
-    Srv.AsyncClient client = getClient();
-    client.voidMethod(new FailureLessCallback<Void>() {
-      @Override
-      public void onComplete(Void response) {
-        returned.set(true);
-        latch.countDown();
-      }
-    });
-    latch.await(1, TimeUnit.SECONDS);
-    assertTrue(returned.get());
-  }
-
-  public void testOnewayCall() throws Exception {
-    final CountDownLatch latch = new CountDownLatch(1);
-    final AtomicBoolean returned = new AtomicBoolean(false);
-    Srv.AsyncClient client = getClient();
-    client.onewayMethod(new FailureLessCallback<Void>() {
-      @Override
-      public void onComplete(Void response) {
-        returned.set(true);
-        latch.countDown();
-      }
-    });
-    latch.await(1, TimeUnit.SECONDS);
-    assertTrue(returned.get());
-  }
-
-  public void testParallelCalls() throws Exception {
-    // make multiple calls with deserialization in the selector thread (repro Eric's issue)
-    int numThreads = 50;
-    int numCallsPerThread = 100;
-    List<JankyRunnable> runnables = new ArrayList<JankyRunnable>();
-    List<Thread> threads = new ArrayList<Thread>();
-    for (int i = 0; i < numThreads; i++) {
-      JankyRunnable runnable = new JankyRunnable(numCallsPerThread);
-      Thread thread = new Thread(runnable);
-      thread.start();
-      threads.add(thread);
-      runnables.add(runnable);
-    }
-    for (Thread thread : threads) {
-      thread.join();
-    }
-    int numSuccesses = 0;
-    for (JankyRunnable runnable : runnables) {
-      numSuccesses += runnable.getNumSuccesses();
-    }
-    assertEquals(numThreads * numCallsPerThread, numSuccesses);
-  }
-
-  private Srv.AsyncClient getClient() throws IOException, TTransportException {
-    TNonblockingSocket clientSocket = new TNonblockingSocket(ServerTestBase.HOST, ServerTestBase.PORT);
-    return new Srv.AsyncClient(new TBinaryProtocol.Factory(), clientManager_, clientSocket);
-  }
-
-  private void basicCall(Srv.AsyncClient client) throws Exception {
-    final CountDownLatch latch = new CountDownLatch(1);
-    final AtomicBoolean returned = new AtomicBoolean(false);
-    client.Janky(1, new FailureLessCallback<Integer>() {
-      @Override
-      public void onComplete(Integer response) {
-        assertEquals(3, response.intValue());
-        returned.set(true);
-        latch.countDown();
-      }
-
-      @Override
-      public void onError(Exception exception) {
-        try {
-          StringWriter sink = new StringWriter();
-          exception.printStackTrace(new PrintWriter(sink, true));
-          fail("unexpected onError with exception " + sink.toString());
-        } finally {
-          latch.countDown();
-        }
-      }
-    });
-    latch.await(100, TimeUnit.SECONDS);
-    assertTrue(returned.get());
-  }
-
-  public class SrvHandler implements Iface {
-    // Use this method for a standard call testing
-    @Override
-    public int Janky(int arg) throws TException {
-      assertEquals(1, arg);
-      return 3;
-    }
-
-    // Using this method for timeout testing - sleeps for 1 second before returning
-    @Override
-    public int primitiveMethod() throws TException {
-      try {
-        Thread.sleep(1000);
-      } catch (InterruptedException e) {
-        e.printStackTrace();
-      }
-      return 0;
-    }
-
-    @Override
-    public void methodWithDefaultArgs(int something) throws TException { }
-
-    @Override
-    public CompactProtoTestStruct structMethod() throws TException {
-      return null;
-    }
-
-    @Override
-    public void voidMethod() throws TException {
-    }
-
-    @Override
-    public void onewayMethod() throws TException {
-    }
-
-    @Override
-    public boolean declaredExceptionMethod(boolean shouldThrowDeclared) throws TException {
-      if (shouldThrowDeclared) {
-        throw new ExceptionWithAMap("blah", new HashMap<String, String>());
-      } else {
-        throw new TException("Unexpected!");
-      }
-    }
-  }
-
-  private static abstract class FailureLessCallback<T> implements AsyncMethodCallback<T> {
-    @Override
-    public void onError(Exception exception) {
-      fail(exception);
-    }
-  }
-
-  private static void fail(Exception exception) {
-    StringWriter sink = new StringWriter();
-    exception.printStackTrace(new PrintWriter(sink, true));
-    fail("unexpected error " + sink.toString());
-  }
-
-  private class JankyRunnable implements Runnable {
-    private int numCalls_;
-    private int numSuccesses_ = 0;
-    private Srv.AsyncClient client_;
-
-    public JankyRunnable(int numCalls) throws Exception {
-      numCalls_ = numCalls;
-      client_ = getClient();
-      client_.setTimeout(20000);
-    }
-
-    public int getNumSuccesses() {
-      return numSuccesses_;
-    }
-
-    public void run() {
-      for (int i = 0; i < numCalls_ && !client_.hasError(); i++) {
-        final int iteration = i;
-        try {
-          // connect an async client
-          final CountDownLatch latch = new CountDownLatch(1);
-          final AtomicBoolean returned = new AtomicBoolean(false);
-          client_.Janky(1, new AsyncMethodCallback<Integer>() {
+    @Test
+    public void testUnexpectedRemoteExceptionCall() throws Exception {
+        new ErrorCallTest<Srv.AsyncClient, Boolean>() {
+            @Override
+            Srv.AsyncClient executeErroringCall(AsyncMethodCallback<Boolean> callback) throws Exception {
+                Srv.AsyncClient client = getClient();
+                client.declaredExceptionMethod(false, callback);
+                return client;
+            }
 
             @Override
-            public void onComplete(Integer result) {
-              assertEquals(3, result.intValue());
-              returned.set(true);
-              latch.countDown();
+            void validateError(Srv.AsyncClient client, Exception error) {
+                assertFalse(client.hasTimeout());
+                assertTrue(error instanceof TException);
+            }
+        }.runTest();
+    }
+
+    @Test
+    public void testDeclaredRemoteExceptionCall() throws Exception {
+        new ErrorCallTest<Srv.AsyncClient, Boolean>() {
+            @Override
+            Srv.AsyncClient executeErroringCall(AsyncMethodCallback<Boolean> callback) throws Exception {
+                Srv.AsyncClient client = getClient();
+                client.declaredExceptionMethod(true, callback);
+                return client;
+            }
+
+            @Override
+            void validateError(Srv.AsyncClient client, Exception error) {
+                assertFalse(client.hasTimeout());
+                assertEquals(ExceptionWithAMap.class, error.getClass());
+                ExceptionWithAMap exceptionWithAMap = (ExceptionWithAMap) error;
+                assertEquals("blah", exceptionWithAMap.getBlah());
+                assertEquals(new HashMap<String, String>(), exceptionWithAMap.getMap_field());
+            }
+        }.runTest();
+    }
+
+    @Test
+    public void testTimeoutCall() throws Exception {
+        new ErrorCallTest<Srv.AsyncClient, Integer>() {
+            @Override
+            Srv.AsyncClient executeErroringCall(AsyncMethodCallback<Integer> callback) throws Exception {
+                Srv.AsyncClient client = getClient();
+                client.setTimeout(100);
+                client.primitiveMethod(callback);
+                return client;
+            }
+
+            @Override
+            void validateError(Srv.AsyncClient client, Exception error) {
+                assertTrue(client.hasTimeout());
+                assertTrue(error instanceof TimeoutException);
+            }
+        }.runTest();
+    }
+
+    @Test
+    public void testVoidCall() throws Exception {
+        final CountDownLatch latch = new CountDownLatch(1);
+        final AtomicBoolean returned = new AtomicBoolean(false);
+        Srv.AsyncClient client = getClient();
+        client.voidMethod(new FailureLessCallback<Void>() {
+            @Override
+            public void onComplete(Void response) {
+                returned.set(true);
+                latch.countDown();
+            }
+        });
+        latch.await(1, TimeUnit.SECONDS);
+        assertTrue(returned.get());
+    }
+
+    @Test
+    public void testOnewayCall() throws Exception {
+        final CountDownLatch latch = new CountDownLatch(1);
+        final AtomicBoolean returned = new AtomicBoolean(false);
+        Srv.AsyncClient client = getClient();
+        client.onewayMethod(new FailureLessCallback<Void>() {
+            @Override
+            public void onComplete(Void response) {
+                returned.set(true);
+                latch.countDown();
+            }
+        });
+        latch.await(1, TimeUnit.SECONDS);
+        assertTrue(returned.get());
+    }
+
+    @Test
+    public void testParallelCalls() throws Exception {
+        // make multiple calls with deserialization in the selector thread (repro Eric's issue)
+        int numThreads = 50;
+        int numCallsPerThread = 100;
+        List<JankyRunnable> runnables = new ArrayList<JankyRunnable>();
+        List<Thread> threads = new ArrayList<Thread>();
+        for (int i = 0; i < numThreads; i++) {
+            JankyRunnable runnable = new JankyRunnable(numCallsPerThread);
+            Thread thread = new Thread(runnable);
+            thread.start();
+            threads.add(thread);
+            runnables.add(runnable);
+        }
+        for (Thread thread : threads) {
+            thread.join();
+        }
+        int numSuccesses = 0;
+        for (JankyRunnable runnable : runnables) {
+            numSuccesses += runnable.getNumSuccesses();
+        }
+        assertEquals(numThreads * numCallsPerThread, numSuccesses);
+    }
+
+    private Srv.AsyncClient getClient() throws IOException, TTransportException {
+        TNonblockingSocket clientSocket = new TNonblockingSocket(ServerTestBase.HOST, ServerTestBase.PORT);
+        return new Srv.AsyncClient(new TBinaryProtocol.Factory(), clientManager_, clientSocket);
+    }
+
+    private void basicCall(Srv.AsyncClient client) throws Exception {
+        final CountDownLatch latch = new CountDownLatch(1);
+        final AtomicBoolean returned = new AtomicBoolean(false);
+        client.Janky(1, new FailureLessCallback<Integer>() {
+            @Override
+            public void onComplete(Integer response) {
+                assertEquals(3, response.intValue());
+                returned.set(true);
+                latch.countDown();
             }
 
             @Override
             public void onError(Exception exception) {
-              try {
-                StringWriter sink = new StringWriter();
-                exception.printStackTrace(new PrintWriter(sink, true));
-                fail("unexpected onError on iteration " + iteration + ": " + sink.toString());
-              } finally {
-                latch.countDown();
-              }
+                try {
+                    StringWriter sink = new StringWriter();
+                    exception.printStackTrace(new PrintWriter(sink, true));
+                    Assertions.fail("unexpected onError with exception " + sink.toString());
+                } finally {
+                    latch.countDown();
+                }
             }
-          });
-
-          boolean calledBack = latch.await(30, TimeUnit.SECONDS);
-          assertTrue("wasn't called back in time on iteration " + iteration, calledBack);
-          assertTrue("onComplete not called on iteration " + iteration, returned.get());
-          this.numSuccesses_++;
-        } catch (Exception e) {
-          fail(e);
-        }
-      }
+        });
+        latch.await(100, TimeUnit.SECONDS);
+        assertTrue(returned.get());
     }
-  }
+
+    public static class SrvHandler implements Iface {
+        // Use this method for a standard call testing
+        @Override
+        public int Janky(int arg) throws TException {
+            assertEquals(1, arg);
+            return 3;
+        }
+
+        // Using this method for timeout testing - sleeps for 1 second before returning
+        @Override
+        public int primitiveMethod() throws TException {
+            try {
+                Thread.sleep(1000);
+            } catch (InterruptedException e) {
+                e.printStackTrace();
+            }
+            return 0;
+        }
+
+        @Override
+        public void methodWithDefaultArgs(int something) throws TException {
+        }
+
+        @Override
+        public CompactProtoTestStruct structMethod() throws TException {
+            return null;
+        }
+
+        @Override
+        public void voidMethod() throws TException {
+        }
+
+        @Override
+        public void onewayMethod() throws TException {
+        }
+
+        @Override
+        public boolean declaredExceptionMethod(boolean shouldThrowDeclared) throws TException {
+            if (shouldThrowDeclared) {
+                throw new ExceptionWithAMap("blah", new HashMap<String, String>());
+            } else {
+                throw new TException("Unexpected!");
+            }
+        }
+    }
+
+    private static abstract class FailureLessCallback<T> implements AsyncMethodCallback<T> {
+        @Override
+        public void onError(Exception exception) {
+            fail(exception);
+        }
+    }
+
+    private static void fail(Exception exception) {
+        StringWriter sink = new StringWriter();
+        exception.printStackTrace(new PrintWriter(sink, true));
+        Assertions.fail("unexpected error " + sink);
+    }
+
+    private class JankyRunnable implements Runnable {
+        private final int numCalls_;
+        private int numSuccesses_ = 0;
+        private final Srv.AsyncClient client_;
+
+        public JankyRunnable(int numCalls) throws Exception {
+            numCalls_ = numCalls;
+            client_ = getClient();
+            client_.setTimeout(20000);
+        }
+
+        public int getNumSuccesses() {
+            return numSuccesses_;
+        }
+
+        public void run() {
+            for (int i = 0; i < numCalls_ && !client_.hasError(); i++) {
+                final int iteration = i;
+                try {
+                    // connect an async client
+                    final CountDownLatch latch = new CountDownLatch(1);
+                    final AtomicBoolean returned = new AtomicBoolean(false);
+                    client_.Janky(1, new AsyncMethodCallback<Integer>() {
+
+                        @Override
+                        public void onComplete(Integer result) {
+                            assertEquals(3, result.intValue());
+                            returned.set(true);
+                            latch.countDown();
+                        }
+
+                        @Override
+                        public void onError(Exception exception) {
+                            try {
+                                StringWriter sink = new StringWriter();
+                                exception.printStackTrace(new PrintWriter(sink, true));
+                                Assertions.fail("unexpected onError on iteration " + iteration + ": " + sink.toString());
+                            } finally {
+                                latch.countDown();
+                            }
+                        }
+                    });
+
+                    boolean calledBack = latch.await(30, TimeUnit.SECONDS);
+                    assertTrue(calledBack, "wasn't called back in time on iteration " + iteration);
+                    assertTrue(returned.get(), "onComplete not called on iteration " + iteration);
+                    this.numSuccesses_++;
+                } catch (Exception e) {
+                    fail(e);
+                }
+            }
+        }
+    }
 }
diff --git a/lib/java/src/test/java/org/apache/thrift/partial/EnumCacheTest.java b/lib/java/src/test/java/org/apache/thrift/partial/EnumCacheTest.java
index 394dcc2..152bf48 100644
--- a/lib/java/src/test/java/org/apache/thrift/partial/EnumCacheTest.java
+++ b/lib/java/src/test/java/org/apache/thrift/partial/EnumCacheTest.java
@@ -19,12 +19,12 @@
 
 package org.apache.thrift.partial;
 
-import org.apache.thrift.partial.ExceptionAsserts;
-
 import org.apache.thrift.TEnum;
-import org.junit.Test;
+import org.junit.jupiter.api.Test;
 
-import static org.junit.Assert.*;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertThrows;
 
 /**
  * Test ThriftCodec serializes and deserializes thrift objects correctly.
@@ -85,10 +85,10 @@
     cache.get(TestEnum.class, 0);
 
     // Verify it throws.
-    ExceptionAsserts.assertThrows(
+    assertThrows(
         IllegalArgumentException.class,
-        "'enumClass' must not be null",
-        () -> cache.get(null, 1));
+        () -> cache.get(null, 1),
+        "'enumClass' must not be null");
   }
 
   @Test
diff --git a/lib/java/src/test/java/org/apache/thrift/partial/ExceptionAsserts.java b/lib/java/src/test/java/org/apache/thrift/partial/ExceptionAsserts.java
deleted file mode 100644
index 239903c..0000000
--- a/lib/java/src/test/java/org/apache/thrift/partial/ExceptionAsserts.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.thrift.partial;
-
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
-public final class ExceptionAsserts {
-  private ExceptionAsserts() {}
-
-  @FunctionalInterface
-  public interface CodeThatMayThrow {
-    void run() throws Exception;
-  }
-
-  /**
-   * Asserts that the given code throws an exception of the given type
-   * and that the exception message contains the given sub-message.
-   *
-   * Usage:
-   *
-   * ExceptionAsserts.assertThrows(
-   *   IllegalArgumentException.class,
-   *   "'nullArg' must not be null",
-   *   () -> Preconditions.checkNotNull(null, "nullArg"));
-   *
-   * Note: JUnit 5 has similar functionality but it will be a long time before
-   * we move to that framework because of significant differences and lack of
-   * backward compatibility for some JUnit rules.
-   */
-  public static <E extends Exception> void assertThrows(
-      Class<E> expectedExceptionClass,
-      String partialMessage,
-      CodeThatMayThrow code) {
-
-    Exception thrownException = null;
-
-    try {
-      code.run();
-    } catch (Exception e) {
-      if (expectedExceptionClass.isAssignableFrom(e.getClass())) {
-
-        thrownException = e;
-
-        if (partialMessage != null) {
-          String msg = e.getMessage();
-          assertNotNull(
-              String.format("Exception message is null, expected to contain: '%s'", partialMessage),
-              msg);
-          assertTrue(
-              String.format("Exception message '%s' does not contain: '%s'", msg, partialMessage),
-              msg.contains(partialMessage));
-        }
-      } else {
-        fail(String.format(
-                 "Expected exception of type %s but got %s",
-                 expectedExceptionClass.getName(),
-                 e.getClass().getName()));
-      }
-    }
-
-    if (thrownException == null) {
-      fail(String.format(
-               "Expected exception of type %s but got none",
-               expectedExceptionClass.getName()));
-    }
-  }
-
-  public static <E extends Exception> void assertThrows(
-      Class<E> expectedExceptionClass,
-      CodeThatMayThrow code) {
-    assertThrows(expectedExceptionClass, null, code);
-  }
-}
diff --git a/lib/java/src/test/java/org/apache/thrift/partial/PartialThriftComparerTest.java b/lib/java/src/test/java/org/apache/thrift/partial/PartialThriftComparerTest.java
index e1209d7..4498e33 100644
--- a/lib/java/src/test/java/org/apache/thrift/partial/PartialThriftComparerTest.java
+++ b/lib/java/src/test/java/org/apache/thrift/partial/PartialThriftComparerTest.java
@@ -19,21 +19,18 @@
 
 package org.apache.thrift.partial;
 
-import static org.junit.Assert.*;
-
 import org.apache.thrift.TDeserializer;
 import org.apache.thrift.TException;
-import org.apache.thrift.partial.TestStruct;
-import org.apache.thrift.partial.ThriftField;
 import org.apache.thrift.protocol.TBinaryProtocol;
 import org.apache.thrift.protocol.TCompactProtocol;
-import org.junit.Test;
+import org.junit.jupiter.api.Test;
 
 import java.io.IOException;
 import java.util.Arrays;
-import java.util.Collections;
 import java.util.List;
 
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
 public class PartialThriftComparerTest {
 
   private ThriftSerDe serde;
@@ -63,13 +60,9 @@
 
     StringBuilder sb = new StringBuilder();
     TestStruct ts2 = (TestStruct) partialBinaryDeser.partialDeserializeObject(bytesBinary);
-    if (!comparer.areEqual(ts1, ts2, sb)) {
-      fail(sb.toString());
-    }
+    assertTrue(comparer.areEqual(ts1, ts2, sb), sb::toString);
 
     ts2 = (TestStruct) partialCompactDeser.partialDeserializeObject(bytesCompact);
-    if (!comparer.areEqual(ts1, ts2, sb)) {
-      fail(sb.toString());
-    }
+    assertTrue(comparer.areEqual(ts1, ts2, sb), sb::toString);
   }
 }
diff --git a/lib/java/src/test/java/org/apache/thrift/partial/TFieldDataTest.java b/lib/java/src/test/java/org/apache/thrift/partial/TFieldDataTest.java
index 0a838e9..860f515 100644
--- a/lib/java/src/test/java/org/apache/thrift/partial/TFieldDataTest.java
+++ b/lib/java/src/test/java/org/apache/thrift/partial/TFieldDataTest.java
@@ -21,9 +21,9 @@
 
 import org.apache.thrift.protocol.TField;
 import org.apache.thrift.protocol.TType;
-import org.junit.Test;
+import org.junit.jupiter.api.Test;
 
-import static org.junit.Assert.*;
+import static org.junit.jupiter.api.Assertions.assertEquals;
 
 public class TFieldDataTest {
 
diff --git a/lib/java/src/test/java/org/apache/thrift/TestPartialThriftDeserializer.java b/lib/java/src/test/java/org/apache/thrift/partial/TestPartialThriftDeserializer.java
similarity index 92%
rename from lib/java/src/test/java/org/apache/thrift/TestPartialThriftDeserializer.java
rename to lib/java/src/test/java/org/apache/thrift/partial/TestPartialThriftDeserializer.java
index c0c7b89..722e108 100644
--- a/lib/java/src/test/java/org/apache/thrift/TestPartialThriftDeserializer.java
+++ b/lib/java/src/test/java/org/apache/thrift/partial/TestPartialThriftDeserializer.java
@@ -1,50 +1,49 @@
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
+ * or more contributor license agreements.  See the NOTICE file
  * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
+ * regarding copyright ownership.  The ASF licenses this file
  * to you under the Apache License, Version 2.0 (the
  * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
+ * with the License.  You may obtain a copy of the License at
  *
  *   http://www.apache.org/licenses/LICENSE-2.0
  *
  * Unless required by applicable law or agreed to in writing,
  * software distributed under the License is distributed on an
  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
+ * KIND, either express or implied.  See the License for the
  * specific language governing permissions and limitations
  * under the License.
  */
 
 package org.apache.thrift.partial;
 
-import static org.junit.Assert.*;
-
-import org.apache.thrift.partial.TestStruct;
-import org.apache.thrift.partial.ThriftField;
-import org.apache.thrift.partial.TstEnum;
-import org.apache.thrift.partial.ExceptionAsserts;
-
-import org.apache.thrift.TBase;
 import org.apache.thrift.TDeserializer;
 import org.apache.thrift.TException;
-import org.apache.thrift.TSerializer;
 import org.apache.thrift.protocol.TBinaryProtocol;
 import org.apache.thrift.protocol.TCompactProtocol;
-import org.junit.Test;
+import org.junit.jupiter.api.Test;
 
 import java.io.IOException;
 import java.nio.ByteBuffer;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
+import static org.junit.jupiter.api.Assertions.assertArrayEquals;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
 public class TestPartialThriftDeserializer {
 
   private ThriftSerDe serde = new ThriftSerDe();
@@ -59,24 +58,24 @@
   @Test
   public void testArgChecks() throws TException {
     // Should not throw.
-    List<String> fieldNames = Arrays.asList("i32Field");
+    List<String> fieldNames = Collections.singletonList("i32Field");
     new TDeserializer(TestStruct.class, fieldNames, binaryProtocolFactory);
 
     // Verify it throws correctly.
-    ExceptionAsserts.assertThrows(
+    assertThrows(
         IllegalArgumentException.class,
-        "'thriftClass' must not be null",
-        () -> new TDeserializer(null, fieldNames, binaryProtocolFactory));
+        () -> new TDeserializer(null, fieldNames, binaryProtocolFactory),
+        "'thriftClass' must not be null");
 
-    ExceptionAsserts.assertThrows(
+    assertThrows(
         IllegalArgumentException.class,
-        "'fieldNames' must not be null",
-        () -> new TDeserializer(TestStruct.class, null, binaryProtocolFactory));
+        () -> new TDeserializer(TestStruct.class, null, binaryProtocolFactory),
+        "'fieldNames' must not be null");
 
-    ExceptionAsserts.assertThrows(
+    assertThrows(
         IllegalArgumentException.class,
-        "'processor' must not be null",
-        () -> new TDeserializer(TestStruct.class, fieldNames, null, binaryProtocolFactory));
+        () -> new TDeserializer(TestStruct.class, fieldNames, null, binaryProtocolFactory),
+        "'processor' must not be null");
   }
 
   /**
@@ -119,19 +118,15 @@
     StringBuilder sb = new StringBuilder();
     TestStruct ts2 = (TestStruct) partialBinaryDeserializer.partialDeserializeObject(bytesBinary);
     validatePartialSimpleField(ts1, ts2);
-    if (!comparer.areEqual(ts1, ts2, sb)) {
-      fail(sb.toString());
-    }
+    assertTrue(comparer.areEqual(ts1, ts2, sb), sb::toString);
 
     ts2 = (TestStruct) partialCompactDeserializer.partialDeserializeObject(bytesCompact);
     validatePartialSimpleField(ts1, ts2);
-    if (!comparer.areEqual(ts1, ts2, sb)) {
-      fail(sb.toString());
-    }
+    assertTrue(comparer.areEqual(ts1, ts2, sb), sb::toString);
   }
 
   private void validatePartialSimpleField(TestStruct ts1, TestStruct ts2) {
-    assertTrue(ts2.toString(), ts2.isSetI32Field());
+    assertTrue(ts2.isSetI32Field(), ts2.toString());
     assertEquals(ts1.getI32Field(), ts2.getI32Field());
     assertFalse(ts2.isSetI16Field());
   }
@@ -211,21 +206,17 @@
 
     TestStruct ts2 = (TestStruct) partialBinaryDeserializer.partialDeserializeObject(bytesBinary);
     validatePartialComplex(ts1, ts2, id, numItems);
-    if (!comparer.areEqual(ts1, ts2, sb)) {
-      fail(sb.toString());
-    }
+    assertTrue(comparer.areEqual(ts1, ts2, sb), sb::toString);
 
     ts2 = (TestStruct) partialCompactDeserializer.partialDeserializeObject(bytesCompact);
     validatePartialComplex(ts1, ts2, id, numItems);
-    if (!comparer.areEqual(ts1, ts2, sb)) {
-      fail(sb.toString());
-    }
+    assertTrue(comparer.areEqual(ts1, ts2, sb), sb::toString);
   }
 
   private void validatePartialComplex(TestStruct ts1, TestStruct ts2, int id, int numItems) {
 
     // Validate primitive fields.
-    assertTrue(ts2.toString(), ts2.isSetByteField());
+    assertTrue(ts2.isSetByteField(), ts2.toString());
     assertEquals(ts1.getByteField(), ts2.getByteField());
 
     assertTrue(ts2.isSetI16Field());
@@ -378,7 +369,7 @@
 
     for (int i = 0; i < numItems; i++) {
       ByteBuffer bb = ByteBuffer.wrap(testData.BYTES);
-      assertTrue(bb.compareTo(list.get(i)) == 0);
+      assertEquals(0, bb.compareTo(list.get(i)));
     }
   }
 
diff --git a/lib/java/src/test/java/org/apache/thrift/partial/ThriftFieldTest.java b/lib/java/src/test/java/org/apache/thrift/partial/ThriftFieldTest.java
index a6d5655..115726e 100644
--- a/lib/java/src/test/java/org/apache/thrift/partial/ThriftFieldTest.java
+++ b/lib/java/src/test/java/org/apache/thrift/partial/ThriftFieldTest.java
@@ -19,17 +19,18 @@
 
 package org.apache.thrift.partial;
 
-import static org.junit.Assert.*;
-
-import org.apache.thrift.partial.ExceptionAsserts;
-
-import org.junit.Test;
+import org.junit.jupiter.api.Test;
 
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
 
-import static org.junit.Assert.*;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotEquals;
+import static org.junit.jupiter.api.Assertions.assertNotSame;
+import static org.junit.jupiter.api.Assertions.assertSame;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+
 
 public class ThriftFieldTest {
 
@@ -40,29 +41,29 @@
 
     // Should not throw.
     test = new ThriftField("foo");
-    test = new ThriftField("foo", Arrays.asList(new ThriftField("bar")));
-    testFields = ThriftField.fromNames(Arrays.asList("foo"));
+    test = new ThriftField("foo", Collections.singletonList(new ThriftField("bar")));
+    testFields = ThriftField.fromNames(Collections.singletonList("foo"));
 
     // Verify it throws.
-    ExceptionAsserts.assertThrows(
-        IllegalArgumentException.class,
-        "'name' must not be null",
-        () -> new ThriftField(null, Collections.emptyList()));
+    assertThrows(
+            IllegalArgumentException.class,
+            () -> new ThriftField(null, Collections.emptyList()),
+            "'name' must not be null");
 
-    ExceptionAsserts.assertThrows(
+    assertThrows(
         IllegalArgumentException.class,
-        "'fields' must not be null",
-        () -> new ThriftField("foo", null));
+        () -> new ThriftField("foo", null),
+        "'fields' must not be null");
 
-    ExceptionAsserts.assertThrows(
+    assertThrows(
         IllegalArgumentException.class,
-        "'fieldNames' must not be null",
-        () -> ThriftField.fromNames(null));
+        () -> ThriftField.fromNames(null),
+        "'fieldNames' must not be null");
 
-    ExceptionAsserts.assertThrows(
+    assertThrows(
         IllegalArgumentException.class,
-        "'fieldNames' must have at least one element",
-        () -> ThriftField.fromNames(Collections.emptyList()));
+        () -> ThriftField.fromNames(Collections.emptyList()),
+        "'fieldNames' must have at least one element");
   }
 
   @Test
@@ -112,6 +113,7 @@
     assertEquals(0, f322.fields.size());
   }
 
+
   @Test
   public void testEquality() {
     List<String> fieldNames = Arrays.asList(
diff --git a/lib/java/src/test/java/org/apache/thrift/partial/ThriftMetadataTest.java b/lib/java/src/test/java/org/apache/thrift/partial/ThriftMetadataTest.java
index acc53c8..f476572 100644
--- a/lib/java/src/test/java/org/apache/thrift/partial/ThriftMetadataTest.java
+++ b/lib/java/src/test/java/org/apache/thrift/partial/ThriftMetadataTest.java
@@ -19,12 +19,6 @@
 
 package org.apache.thrift.partial;
 
-import static org.junit.Assert.*;
-
-import org.apache.thrift.partial.TestStruct;
-import org.apache.thrift.partial.ThriftField;
-import org.apache.thrift.partial.ExceptionAsserts;
-
 import org.apache.thrift.TBase;
 import org.apache.thrift.meta_data.EnumMetaData;
 import org.apache.thrift.meta_data.FieldValueMetaData;
@@ -33,11 +27,18 @@
 import org.apache.thrift.meta_data.SetMetaData;
 import org.apache.thrift.meta_data.StructMetaData;
 import org.apache.thrift.protocol.TType;
-import org.junit.Test;
+import org.junit.jupiter.api.Test;
 
 import java.util.Arrays;
 import java.util.List;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
 public class ThriftMetadataTest {
 
   private PartialThriftTestData testData = new PartialThriftTestData();
@@ -49,15 +50,15 @@
     ThriftMetadata.ThriftStruct.fromFields(TestStruct.class, testFields);
 
     // Verify it throws correctly.
-    ExceptionAsserts.assertThrows(
+    assertThrows(
         IllegalArgumentException.class,
-        "'clasz' must not be null",
-        () -> ThriftMetadata.ThriftStruct.fromFields(null, testFields));
+        () -> ThriftMetadata.ThriftStruct.fromFields(null, testFields),
+        "'clasz' must not be null");
 
-    ExceptionAsserts.assertThrows(
+    assertThrows(
         IllegalArgumentException.class,
-        "'fields' must not be null",
-        () -> ThriftMetadata.ThriftStruct.fromFields(TestStruct.class, null));
+        () -> ThriftMetadata.ThriftStruct.fromFields(TestStruct.class, null),
+        "'fields' must not be null");
   }
 
   @Test
diff --git a/lib/java/src/test/java/org/apache/thrift/partial/ThriftStructProcessorTest.java b/lib/java/src/test/java/org/apache/thrift/partial/ThriftStructProcessorTest.java
index d4ab925..a8b0dac 100644
--- a/lib/java/src/test/java/org/apache/thrift/partial/ThriftStructProcessorTest.java
+++ b/lib/java/src/test/java/org/apache/thrift/partial/ThriftStructProcessorTest.java
@@ -19,35 +19,37 @@
 
 package org.apache.thrift.partial;
 
-import static org.junit.Assert.*;
-
-import org.apache.thrift.partial.TestStruct;
-import org.apache.thrift.partial.ThriftField;
-import org.apache.thrift.partial.ThriftMetadata;
-import org.apache.thrift.partial.TstEnum;
-
 import org.apache.thrift.TBase;
 import org.apache.thrift.TException;
 import org.apache.thrift.TFieldIdEnum;
-import org.junit.Test;
+import org.junit.jupiter.api.Test;
 
 import java.nio.ByteBuffer;
 import java.nio.charset.StandardCharsets;
 import java.util.Arrays;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
+import static org.junit.jupiter.api.Assertions.assertArrayEquals;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertSame;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
 public class ThriftStructProcessorTest {
 
   private PartialThriftTestData testData = new PartialThriftTestData();
 
   @Test
   public void testStruct() throws TException {
-    List<ThriftField> fields = ThriftField.fromNames(Arrays.asList("i32Field"));
+    List<ThriftField> fields = ThriftField.fromNames(Collections.singletonList("i32Field"));
     ThriftMetadata.ThriftStruct metadata =
         ThriftMetadata.ThriftStruct.fromFields(TestStruct.class, fields);
     ThriftStructProcessor processor = new ThriftStructProcessor();
@@ -299,9 +301,7 @@
         return field.fieldId;
       }
     }
-
-    fail("Field not found: " + fieldName);
-    return null;
+    throw new IllegalStateException("Field not found: " + fieldName);
   }
 
   private Object getFieldValue(TBase struct, TFieldIdEnum fieldId) {
diff --git a/lib/java/src/test/java/org/apache/thrift/partial/ValidateTest.java b/lib/java/src/test/java/org/apache/thrift/partial/ValidateTest.java
index 9d96844..d2e8eaa 100644
--- a/lib/java/src/test/java/org/apache/thrift/partial/ValidateTest.java
+++ b/lib/java/src/test/java/org/apache/thrift/partial/ValidateTest.java
@@ -19,11 +19,7 @@
 
 package org.apache.thrift.partial;
 
-import org.apache.thrift.partial.ExceptionAsserts;
-import org.apache.thrift.partial.TestData;
-
-import org.junit.Test;
-import org.junit.runners.JUnit4;
+import org.junit.jupiter.api.Test;
 
 import java.io.IOException;
 import java.nio.file.Files;
@@ -31,6 +27,8 @@
 import java.nio.file.Paths;
 import java.util.Arrays;
 
+import static org.junit.jupiter.api.Assertions.assertThrows;
+
 public class ValidateTest {
   @Test
   public void testCheckNotNull() {
@@ -41,10 +39,10 @@
     Validate.checkNotNull(nonNullArg, "nonNullArg");
 
     // Verify it throws.
-    ExceptionAsserts.assertThrows(
+    assertThrows(
         IllegalArgumentException.class,
-        "'nullArg' must not be null",
-        () -> Validate.checkNotNull(nullArg, "nullArg"));
+        () -> Validate.checkNotNull(nullArg, "nullArg"),
+        "'nullArg' must not be null");
   }
 
   @Test
@@ -57,14 +55,14 @@
     Validate.checkPositiveInteger(positiveArg, "positiveArg");
 
     // Verify it throws.
-    ExceptionAsserts.assertThrows(
+    assertThrows(
         IllegalArgumentException.class,
-        "'negativeArg' must be a positive integer",
-        () -> Validate.checkPositiveInteger(negativeArg, "negativeArg"));
-    ExceptionAsserts.assertThrows(
+        () -> Validate.checkPositiveInteger(negativeArg, "negativeArg"),
+        "'negativeArg' must be a positive integer");
+    assertThrows(
         IllegalArgumentException.class,
-        "'zero' must be a positive integer",
-        () -> Validate.checkPositiveInteger(zero, "zero"));
+        () -> Validate.checkPositiveInteger(zero, "zero"),
+        "'zero' must be a positive integer");
   }
 
   @Test
@@ -78,10 +76,10 @@
     Validate.checkNotNegative(positiveArg, "positiveArg");
 
     // Verify it throws.
-    ExceptionAsserts.assertThrows(
+    assertThrows(
         IllegalArgumentException.class,
-        "'negativeArg' must not be negative",
-        () -> Validate.checkNotNegative(negativeArg, "negativeArg"));
+        () -> Validate.checkNotNegative(negativeArg, "negativeArg"),
+        "'negativeArg' must not be negative");
   }
 
   @Test
@@ -90,10 +88,10 @@
     Validate.checkRequired(true, "arg");
 
     // Verify it throws.
-    ExceptionAsserts.assertThrows(
+    assertThrows(
         IllegalArgumentException.class,
-        "'arg' is required",
-        () -> Validate.checkRequired(false, "arg"));
+        () -> Validate.checkRequired(false, "arg"),
+        "'arg' is required");
   }
 
   @Test
@@ -102,10 +100,10 @@
     Validate.checkValid(true, "arg");
 
     // Verify it throws.
-    ExceptionAsserts.assertThrows(
+    assertThrows(
         IllegalArgumentException.class,
-        "'arg' is invalid",
-        () -> Validate.checkValid(false, "arg"));
+        () -> Validate.checkValid(false, "arg"),
+        "'arg' is invalid");
   }
 
   @Test
@@ -116,10 +114,10 @@
     Validate.checkValid(true, "arg", validValues);
 
     // Verify it throws.
-    ExceptionAsserts.assertThrows(
+    assertThrows(
         IllegalArgumentException.class,
-        "'arg' is invalid. Valid values are: foo, bar",
-        () -> Validate.checkValid(false, "arg", validValues));
+        () -> Validate.checkValid(false, "arg", validValues),
+        "'arg' is invalid. Valid values are: foo, bar");
   }
 
   @Test
@@ -132,60 +130,60 @@
     Validate.checkNotNullAndNotEmpty(TestData.nonEmptyLongArray, "array");
 
     // Verify it throws.
-    ExceptionAsserts.assertThrows(
+    assertThrows(
         IllegalArgumentException.class,
-        "'string' must not be empty",
-        () -> Validate.checkNotNullAndNotEmpty("", "string"));
+        () -> Validate.checkNotNullAndNotEmpty("", "string"),
+        "'string' must not be empty");
 
-    ExceptionAsserts.assertThrows(
+    assertThrows(
         IllegalArgumentException.class,
-        "'array' must not be null",
-        () -> Validate.checkNotNullAndNotEmpty(TestData.nullArray, "array"));
+        () -> Validate.checkNotNullAndNotEmpty(TestData.nullArray, "array"),
+        "'array' must not be null");
 
-    ExceptionAsserts.assertThrows(
+    assertThrows(
         IllegalArgumentException.class,
-        "'array' must have at least one element",
-        () -> Validate.checkNotNullAndNotEmpty(TestData.emptyArray, "array"));
+        () -> Validate.checkNotNullAndNotEmpty(TestData.emptyArray, "array"),
+        "'array' must have at least one element");
 
-    ExceptionAsserts.assertThrows(
+    assertThrows(
         IllegalArgumentException.class,
-        "'array' must not be null",
-        () -> Validate.checkNotNullAndNotEmpty(TestData.nullByteArray, "array"));
+        () -> Validate.checkNotNullAndNotEmpty(TestData.nullByteArray, "array"),
+        "'array' must not be null");
 
-    ExceptionAsserts.assertThrows(
+    assertThrows(
         IllegalArgumentException.class,
-        "'array' must have at least one element",
-        () -> Validate.checkNotNullAndNotEmpty(TestData.emptyByteArray, "array"));
+        () -> Validate.checkNotNullAndNotEmpty(TestData.emptyByteArray, "array"),
+        "'array' must have at least one element");
 
-    ExceptionAsserts.assertThrows(
+    assertThrows(
         IllegalArgumentException.class,
-        "'array' must not be null",
-        () -> Validate.checkNotNullAndNotEmpty(TestData.nullShortArray, "array"));
+        () -> Validate.checkNotNullAndNotEmpty(TestData.nullShortArray, "array"),
+        "'array' must not be null");
 
-    ExceptionAsserts.assertThrows(
+    assertThrows(
         IllegalArgumentException.class,
-        "'array' must have at least one element",
-        () -> Validate.checkNotNullAndNotEmpty(TestData.emptyShortArray, "array"));
+        () -> Validate.checkNotNullAndNotEmpty(TestData.emptyShortArray, "array"),
+        "'array' must have at least one element");
 
-    ExceptionAsserts.assertThrows(
+    assertThrows(
         IllegalArgumentException.class,
-        "'array' must not be null",
-        () -> Validate.checkNotNullAndNotEmpty(TestData.nullIntArray, "array"));
+        () -> Validate.checkNotNullAndNotEmpty(TestData.nullIntArray, "array"),
+        "'array' must not be null");
 
-    ExceptionAsserts.assertThrows(
+    assertThrows(
         IllegalArgumentException.class,
-        "'array' must have at least one element",
-        () -> Validate.checkNotNullAndNotEmpty(TestData.emptyIntArray, "array"));
+        () -> Validate.checkNotNullAndNotEmpty(TestData.emptyIntArray, "array"),
+        "'array' must have at least one element");
 
-    ExceptionAsserts.assertThrows(
+    assertThrows(
         IllegalArgumentException.class,
-        "'array' must not be null",
-        () -> Validate.checkNotNullAndNotEmpty(TestData.nullLongArray, "array"));
+        () -> Validate.checkNotNullAndNotEmpty(TestData.nullLongArray, "array"),
+        "'array' must not be null");
 
-    ExceptionAsserts.assertThrows(
+    assertThrows(
         IllegalArgumentException.class,
-        "'array' must have at least one element",
-        () -> Validate.checkNotNullAndNotEmpty(TestData.emptyLongArray, "array"));
+        () -> Validate.checkNotNullAndNotEmpty(TestData.emptyLongArray, "array"),
+        "'array' must have at least one element");
   }
 
   @Test
@@ -194,15 +192,15 @@
     Validate.checkNotNullAndNotEmpty(TestData.validList, "list");
 
     // Verify it throws.
-    ExceptionAsserts.assertThrows(
+    assertThrows(
         IllegalArgumentException.class,
-        "'list' must not be null",
-        () -> Validate.checkNotNullAndNotEmpty(TestData.nullList, "list"));
+        () -> Validate.checkNotNullAndNotEmpty(TestData.nullList, "list"),
+        "'list' must not be null");
 
-    ExceptionAsserts.assertThrows(
+    assertThrows(
         IllegalArgumentException.class,
-        "'list' must have at least one element",
-        () -> Validate.checkNotNullAndNotEmpty(TestData.emptyList, "list"));
+        () -> Validate.checkNotNullAndNotEmpty(TestData.emptyList, "list"),
+        "'list' must have at least one element");
   }
 
   @Test
@@ -211,17 +209,17 @@
     Validate.checkNotNullAndNumberOfElements(Arrays.asList(1, 2, 3), 3, "arg");
 
     // Verify it throws.
-    ExceptionAsserts.assertThrows(
+    assertThrows(
         IllegalArgumentException.class,
-        "'arg' must not be null",
-        () -> Validate.checkNotNullAndNumberOfElements(null, 3, "arg")
+        () -> Validate.checkNotNullAndNumberOfElements(null, 3, "arg"),
+        "'arg' must not be null"
     );
 
     // Verify it throws.
-    ExceptionAsserts.assertThrows(
+    assertThrows(
         IllegalArgumentException.class,
-        "Number of elements in 'arg' must be exactly 3, 2 given.",
-        () -> Validate.checkNotNullAndNumberOfElements(Arrays.asList(1, 2), 3, "arg")
+        () -> Validate.checkNotNullAndNumberOfElements(Arrays.asList(1, 2), 3, "arg"),
+        "Number of elements in 'arg' must be exactly 3, 2 given."
     );
   }
 
@@ -231,10 +229,10 @@
     Validate.checkValuesEqual(1, "arg1", 1, "arg2");
 
     // Verify it throws.
-    ExceptionAsserts.assertThrows(
+    assertThrows(
         IllegalArgumentException.class,
-        "'arg1' (1) must equal 'arg2' (2)",
-        () -> Validate.checkValuesEqual(1, "arg1", 2, "arg2"));
+        () -> Validate.checkValuesEqual(1, "arg1", 2, "arg2"),
+        "'arg1' (1) must equal 'arg2' (2)");
   }
 
   @Test
@@ -243,10 +241,10 @@
     Validate.checkIntegerMultiple(10, "arg1", 5, "arg2");
 
     // Verify it throws.
-    ExceptionAsserts.assertThrows(
+    assertThrows(
         IllegalArgumentException.class,
-        "'arg1' (10) must be an integer multiple of 'arg2' (3)",
-        () -> Validate.checkIntegerMultiple(10, "arg1", 3, "arg2"));
+        () -> Validate.checkIntegerMultiple(10, "arg1", 3, "arg2"),
+        "'arg1' (10) must be an integer multiple of 'arg2' (3)");
   }
 
   @Test
@@ -255,10 +253,10 @@
     Validate.checkGreater(10, "arg1", 5, "arg2");
 
     // Verify it throws.
-    ExceptionAsserts.assertThrows(
+    assertThrows(
         IllegalArgumentException.class,
-        "'arg1' (5) must be greater than 'arg2' (10)",
-        () -> Validate.checkGreater(5, "arg1", 10, "arg2"));
+        () -> Validate.checkGreater(5, "arg1", 10, "arg2"),
+        "'arg1' (5) must be greater than 'arg2' (10)");
   }
 
   @Test
@@ -267,10 +265,10 @@
     Validate.checkGreaterOrEqual(10, "arg1", 5, "arg2");
 
     // Verify it throws.
-    ExceptionAsserts.assertThrows(
+    assertThrows(
         IllegalArgumentException.class,
-        "'arg1' (5) must be greater than or equal to 'arg2' (10)",
-        () -> Validate.checkGreaterOrEqual(5, "arg1", 10, "arg2"));
+        () -> Validate.checkGreaterOrEqual(5, "arg1", 10, "arg2"),
+        "'arg1' (5) must be greater than or equal to 'arg2' (10)");
   }
 
   @Test
@@ -280,15 +278,15 @@
     Validate.checkWithinRange(10.0, "arg", 5.0, 15.0);
 
     // Verify it throws.
-    ExceptionAsserts.assertThrows(
+    assertThrows(
         IllegalArgumentException.class,
-        "'arg' (5) must be within the range [10, 20]",
-        () -> Validate.checkWithinRange(5, "arg", 10, 20));
+        () -> Validate.checkWithinRange(5, "arg", 10, 20),
+        "'arg' (5) must be within the range [10, 20]");
 
-    ExceptionAsserts.assertThrows(
+    assertThrows(
         IllegalArgumentException.class,
-        "'arg' (5.0) must be within the range [10.0, 20.0]",
-        () -> Validate.checkWithinRange(5.0, "arg", 10.0, 20.0));
+        () -> Validate.checkWithinRange(5.0, "arg", 10.0, 20.0),
+        "'arg' (5.0) must be within the range [10.0, 20.0]");
   }
 
   @Test
@@ -302,24 +300,24 @@
     Validate.checkPathExists(tempDir, "tempDir");
 
     // Verify it throws.
-    ExceptionAsserts.assertThrows(
+    assertThrows(
         IllegalArgumentException.class,
-        "'nullArg' must not be null",
-        () -> Validate.checkPathExists(null, "nullArg"));
+        () -> Validate.checkPathExists(null, "nullArg"),
+        "'nullArg' must not be null");
 
-    ExceptionAsserts.assertThrows(
+    assertThrows(
         IllegalArgumentException.class,
-        "Path notFound (<not-found>) does not exist",
-        () -> Validate.checkPathExists(notFound, "notFound"));
+        () -> Validate.checkPathExists(notFound, "notFound"),
+        "Path notFound (<not-found>) does not exist");
 
-    ExceptionAsserts.assertThrows(
+    assertThrows(
         IllegalArgumentException.class,
-        "must point to a directory",
-        () -> Validate.checkPathExistsAsDir(tempFile, "tempFile"));
+        () -> Validate.checkPathExistsAsDir(tempFile, "tempFile"),
+        "must point to a directory");
 
-    ExceptionAsserts.assertThrows(
+    assertThrows(
         IllegalArgumentException.class,
-        "must point to a file",
-        () -> Validate.checkPathExistsAsFile(tempDir, "tempDir"));
+        () -> Validate.checkPathExistsAsFile(tempDir, "tempDir"),
+        "must point to a file");
   }
 }
diff --git a/lib/java/src/test/java/org/apache/thrift/protocol/BenchmarkProtocols.java b/lib/java/src/test/java/org/apache/thrift/protocol/BenchmarkProtocols.java
index e881607..6b60c99 100644
--- a/lib/java/src/test/java/org/apache/thrift/protocol/BenchmarkProtocols.java
+++ b/lib/java/src/test/java/org/apache/thrift/protocol/BenchmarkProtocols.java
@@ -63,8 +63,8 @@
         long start = System.currentTimeMillis();
         for (int rep = 0; rep < NUM_REPS; rep++) {
           TProtocol proto = factory.getProtocol(new TMemoryBuffer(128*1024));
-          Fixtures.compactProtoTestStruct.write(proto);
-          Fixtures.nesting.write(proto);
+          Fixtures.getCompactProtoTestStruct().write(proto);
+          Fixtures.getNesting().write(proto);
         }
         long end = System.currentTimeMillis();
         timesByFactory.get(factory).add(end-start);
diff --git a/lib/java/src/test/java/org/apache/thrift/protocol/ProtocolTestBase.java b/lib/java/src/test/java/org/apache/thrift/protocol/ProtocolTestBase.java
index a873271..8bf5c6e 100644
--- a/lib/java/src/test/java/org/apache/thrift/protocol/ProtocolTestBase.java
+++ b/lib/java/src/test/java/org/apache/thrift/protocol/ProtocolTestBase.java
@@ -18,9 +18,23 @@
  */
 package org.apache.thrift.protocol;
 
-import java.lang.Exception;
-import java.lang.Integer;
-import java.lang.String;
+import org.apache.thrift.Fixtures;
+import org.apache.thrift.TBase;
+import org.apache.thrift.TConfiguration;
+import org.apache.thrift.TDeserializer;
+import org.apache.thrift.TException;
+import org.apache.thrift.TSerializer;
+import org.apache.thrift.server.ServerTestBase;
+import org.apache.thrift.transport.TMemoryBuffer;
+import org.apache.thrift.transport.TTransportException;
+import org.junit.jupiter.api.Test;
+import thrift.test.CompactProtoTestStruct;
+import thrift.test.HolyMoley;
+import thrift.test.Nesting;
+import thrift.test.OneOfEach;
+import thrift.test.Srv;
+import thrift.test.ThriftTest;
+
 import java.nio.ByteBuffer;
 import java.util.Arrays;
 import java.util.HashMap;
@@ -30,16 +44,10 @@
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
-import junit.framework.TestCase;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertThrows;
 
-import org.apache.thrift.*;
-import org.apache.thrift.server.ServerTestBase;
-import org.apache.thrift.transport.TMemoryBuffer;
-
-import org.apache.thrift.transport.TTransportException;
-import thrift.test.*;
-
-public abstract class ProtocolTestBase extends TestCase {
+public abstract class ProtocolTestBase {
 
   /** Does it make sense to call methods like writeI32 directly on your protocol? */
   protected abstract boolean canBeUsedNaked();
@@ -47,6 +55,7 @@
   /** The protocol factory for the protocol being tested. */
   protected abstract TProtocolFactory getFactory();
 
+  @Test
   public void testDouble() throws Exception {
     if (canBeUsedNaked()) {
       TMemoryBuffer buf = new TMemoryBuffer(1000);
@@ -68,13 +77,15 @@
     });
   }
 
+  @Test
   public void testSerialization() throws Exception {
-    internalTestSerialization(OneOfEach.class, Fixtures.oneOfEach);
-    internalTestSerialization(Nesting.class, Fixtures.nesting);
-    internalTestSerialization(HolyMoley.class, Fixtures.holyMoley);
-    internalTestSerialization(CompactProtoTestStruct.class, Fixtures.compactProtoTestStruct);
+    internalTestSerialization(OneOfEach.class, Fixtures.getOneOfEach());
+    internalTestSerialization(Nesting.class, Fixtures.getNesting());
+    internalTestSerialization(HolyMoley.class, Fixtures.getHolyMoley());
+    internalTestSerialization(CompactProtoTestStruct.class, Fixtures.getCompactProtoTestStruct());
   }
 
+  @Test
   public void testBinary() throws Exception {
     for (byte[] b : Arrays.asList(new byte[0],
                                   new byte[]{0,1,2,3,4,5,6,7,8,9,10},
@@ -100,7 +111,7 @@
       assertEquals(ByteBuffer.wrap(data, 1, 5), proto.readBinary());
     }
   }
-
+@Test
   public void testString() throws Exception {
     for (String s : Arrays.asList("", "short", "borderlinetiny", "a bit longer than the smallest possible")) {
       if (canBeUsedNaked()) {
@@ -110,6 +121,7 @@
     }
   }
 
+  @Test
   public void testLong() throws Exception {
     if (canBeUsedNaked()) {
       internalTestNakedI64(0);
@@ -125,6 +137,7 @@
     }
   }
 
+  @Test
   public void testInt() throws Exception {
     for (int i : Arrays.asList(0, 1, 7, 150, 15000, 31337, 0xffff, 0xffffff, -1, -7, -150, -15000, -0xffff, -0xffffff)) {
       if (canBeUsedNaked()) {
@@ -134,6 +147,7 @@
     }
   }
 
+  @Test
   public void testShort() throws Exception {
     for (int s : Arrays.asList(0, 1, 7, 150, 15000, 0x7fff, -1, -7, -150, -15000, -0x7fff)) {
       if (canBeUsedNaked()) {
@@ -143,6 +157,7 @@
     }
   }
 
+  @Test
   public void testByte() throws Exception {
     if (canBeUsedNaked()) {
       internalTestNakedByte();
@@ -284,6 +299,7 @@
     assertEquals(expected, actual);
   }
 
+  @Test
   public void testMessage() throws Exception {
     List<TMessage> msgs = Arrays.asList(new TMessage[]{
       new TMessage("short message name", TMessageType.CALL, 0),
@@ -306,6 +322,7 @@
     }
   }
 
+  @Test
   public void testServerRequest() throws Exception {
     Srv.Iface handler = new Srv.Iface() {
       public int Janky(int i32arg) throws TException {
@@ -352,15 +369,16 @@
     assertEquals(2, testClient.recv_Janky());
   }
 
+  @Test
   public void testTDeserializer() throws TException {
     TSerializer ser = new TSerializer(getFactory());
-    byte[] bytes = ser.serialize(Fixtures.compactProtoTestStruct);
+    byte[] bytes = ser.serialize(Fixtures.getCompactProtoTestStruct());
 
     TDeserializer deser = new TDeserializer(getFactory());
     CompactProtoTestStruct cpts = new CompactProtoTestStruct();
     deser.deserialize(cpts, bytes);
 
-    assertEquals(Fixtures.compactProtoTestStruct, cpts);
+    assertEquals(Fixtures.getCompactProtoTestStruct(), cpts);
   }
 
   //
@@ -407,7 +425,7 @@
       byte[] serialized = null;
       long serStart = System.currentTimeMillis();
       for (int rep = 0; rep < NUM_REPS; rep++) {
-        serialized = ser.serialize(Fixtures.holyMoley);
+        serialized = ser.serialize(Fixtures.getHolyMoley());
       }
       long serEnd = System.currentTimeMillis();
       long serElapsed = serEnd - serStart;
@@ -427,7 +445,7 @@
     }
   }
 
-  private ServerTestBase.TestHandler testHandler = new ServerTestBase.TestHandler() {
+  private final ServerTestBase.TestHandler testHandler = new ServerTestBase.TestHandler() {
     @Override
     public String testString(String thing) {
       thing = thing + " Apache Thrift Java " + thing;
@@ -466,6 +484,7 @@
     return getFactory().getProtocol(bufferTrans);
   }
 
+  @Test
   public void testReadCheckMaxMessageRequestForString() throws TException{
     TProtocol clientOutProto = initConfig(15);
     TProtocol clientInProto = initConfig(15);
@@ -481,21 +500,21 @@
     }
   }
 
+  @Test
   public void testReadCheckMaxMessageRequestForList() throws TException{
     TProtocol clientOutProto = initConfig(15);
     TProtocol clientInProto = initConfig(15);
     ThriftTest.Client testClient = new ThriftTest.Client(clientInProto, clientOutProto);
     ThriftTest.Processor testProcessor = new ThriftTest.Processor(testHandler);
-    try {
+    TTransportException e = assertThrows(TTransportException.class, () -> {
       testClient.send_testList(Arrays.asList(1, 23242346, 888888, 90));
       testProcessor.process(clientOutProto, clientInProto);
       testClient.recv_testList();
-      fail("Limitations not achieved as expected");
-    } catch (TTransportException e) {
-      assertEquals("MaxMessageSize reached", e.getMessage());
-    }
+    }, "Limitations not achieved as expected");
+    assertEquals("MaxMessageSize reached", e.getMessage());
   }
 
+  @Test
   public void testReadCheckMaxMessageRequestForMap() throws TException{
     TProtocol clientOutProto = initConfig(13);
     TProtocol clientInProto = initConfig(13);
@@ -503,28 +522,28 @@
     ThriftTest.Processor testProcessor = new ThriftTest.Processor(testHandler);
     Map<String, String> thing = new HashMap<>();
     thing.put("key", "Thrift");
-    try {
+
+    TTransportException e = assertThrows(TTransportException.class, () -> {
       testClient.send_testStringMap(thing);
       testProcessor.process(clientOutProto, clientInProto);
       testClient.recv_testStringMap();
-      fail("Limitations not achieved as expected");
-    } catch (TTransportException e) {
-      assertEquals("MaxMessageSize reached", e.getMessage());
-    }
+    }, "Limitations not achieved as expected");
+
+    assertEquals("MaxMessageSize reached", e.getMessage());
   }
 
+  @Test
   public void testReadCheckMaxMessageRequestForSet() throws TException{
     TProtocol clientOutProto = initConfig(10);
     TProtocol clientInProto = initConfig(10);
     ThriftTest.Client testClient = new ThriftTest.Client(clientInProto, clientOutProto);
     ThriftTest.Processor testProcessor = new ThriftTest.Processor(testHandler);
-    try {
-      testClient.send_testSet(Stream.of(234, 0, 987087, 45, 88888888, 9).collect(Collectors.toSet()));
-      testProcessor.process(clientOutProto, clientInProto);
-      testClient.recv_testSet();
-      fail("Limitations not achieved as expected");
-    } catch (TTransportException e) {
-      assertEquals("MaxMessageSize reached", e.getMessage());
-    }
+    TTransportException e =
+            assertThrows(TTransportException.class, () -> {
+              testClient.send_testSet(Stream.of(234, 0, 987087, 45, 88888888, 9).collect(Collectors.toSet()));
+              testProcessor.process(clientOutProto, clientInProto);
+              testClient.recv_testSet();
+            }, "Limitations not achieved as expected");
+    assertEquals("MaxMessageSize reached", e.getMessage());
   }
 }
diff --git a/lib/java/src/test/java/org/apache/thrift/protocol/TestShortStack.java b/lib/java/src/test/java/org/apache/thrift/protocol/TestShortStack.java
index c8e78ee..24541eb 100644
--- a/lib/java/src/test/java/org/apache/thrift/protocol/TestShortStack.java
+++ b/lib/java/src/test/java/org/apache/thrift/protocol/TestShortStack.java
@@ -18,10 +18,15 @@
  */
 package org.apache.thrift.protocol;
 
-import junit.framework.TestCase;
 
-public class TestShortStack extends TestCase {
+import org.junit.jupiter.api.Test;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+
+public class TestShortStack  {
+
+  @Test
   public void testOps() throws Exception {
     ShortStack s = new ShortStack(1);
     s.push((short)10);
@@ -32,11 +37,6 @@
     s.push((short)40);
     assertEquals((short)40, s.pop());
     assertEquals((short)10, s.pop());
-    try {
-      s.pop();
-      fail("should have thrown an exception!");
-    } catch (Exception e) {
-      // yay
-    }
+    assertThrows(Exception.class, s::pop);
   }
 }
diff --git a/lib/java/src/test/java/org/apache/thrift/protocol/TestTBinaryProtocol.java b/lib/java/src/test/java/org/apache/thrift/protocol/TestTBinaryProtocol.java
index 67220b0..acc46e9 100644
--- a/lib/java/src/test/java/org/apache/thrift/protocol/TestTBinaryProtocol.java
+++ b/lib/java/src/test/java/org/apache/thrift/protocol/TestTBinaryProtocol.java
@@ -20,10 +20,6 @@
 
 package org.apache.thrift.protocol;
 
-import org.apache.thrift.TDeserializer;
-import org.apache.thrift.TException;
-import thrift.test.Bonk;
-
 public class TestTBinaryProtocol extends ProtocolTestBase {
   @Override
   protected TProtocolFactory getFactory() {
diff --git a/lib/java/src/test/java/org/apache/thrift/protocol/TestTCompactProtocol.java b/lib/java/src/test/java/org/apache/thrift/protocol/TestTCompactProtocol.java
index b4c0888..b2c29f7 100644
--- a/lib/java/src/test/java/org/apache/thrift/protocol/TestTCompactProtocol.java
+++ b/lib/java/src/test/java/org/apache/thrift/protocol/TestTCompactProtocol.java
@@ -23,6 +23,7 @@
 import org.apache.thrift.TDeserializer;
 import org.apache.thrift.TException;
 
+import org.junit.jupiter.api.Test;
 import thrift.test.Bonk;
 
 public class TestTCompactProtocol extends ProtocolTestBase {
@@ -36,6 +37,7 @@
     return true;
   }
 
+  @Test
   public void testOOMDenialOfService() throws Exception {
     // Struct header, Integer.MAX_VALUE length, and only one real
     // byte of data
@@ -53,4 +55,4 @@
   public static void main(String args[]) throws Exception {
     new TestTCompactProtocol().benchmark();
   }
-}
\ No newline at end of file
+}
diff --git a/lib/java/src/test/java/org/apache/thrift/protocol/TestTField.java b/lib/java/src/test/java/org/apache/thrift/protocol/TestTField.java
index f72c259..62b8d3f 100644
--- a/lib/java/src/test/java/org/apache/thrift/protocol/TestTField.java
+++ b/lib/java/src/test/java/org/apache/thrift/protocol/TestTField.java
@@ -18,11 +18,15 @@
  */
 package org.apache.thrift.protocol;
 
-import junit.framework.TestCase;
-import static org.junit.Assert.assertNotEquals;
 
-public abstract class TestTField extends TestCase {
+import org.junit.jupiter.api.Test;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotEquals;
+
+public abstract class TestTField  {
+
+  @Test
   public void testConstructor() {
     TField uut = new TField();
     assertEquals("", uut.name);
@@ -35,6 +39,7 @@
     assertEquals(42, uut.id);
   }
 
+  @Test
   public void testEquality() {
     TField uut1 = new TField();
     TField uut2 = new TField();
diff --git a/lib/java/src/test/java/org/apache/thrift/protocol/TestTJSONProtocol.java b/lib/java/src/test/java/org/apache/thrift/protocol/TestTJSONProtocol.java
index ecbd101..9933629 100644
--- a/lib/java/src/test/java/org/apache/thrift/protocol/TestTJSONProtocol.java
+++ b/lib/java/src/test/java/org/apache/thrift/protocol/TestTJSONProtocol.java
@@ -18,11 +18,13 @@
  */
 package org.apache.thrift.protocol;
 
+import org.apache.thrift.TException;
+import org.apache.thrift.transport.TMemoryBuffer;
+import org.junit.jupiter.api.Test;
+
 import java.nio.charset.StandardCharsets;
 
-import org.apache.thrift.TException;
-import org.apache.thrift.protocol.TJSONProtocol;
-import org.apache.thrift.transport.TMemoryBuffer;
+import static org.junit.jupiter.api.Assertions.assertEquals;
 
 public class TestTJSONProtocol extends ProtocolTestBase {
   @Override
@@ -35,6 +37,7 @@
     return false;
   }
 
+  @Test
   public void testEscapedUnicode() throws TException {
     String jsonString = "\"hello unicode \\u0e01\\ud834\\udd1e world\"";
     String expectedString = "hello unicode \u0e01\ud834\udd1e world";
@@ -46,6 +49,7 @@
     assertEquals(expectedString, protocol.readString());
   }
 
+  @Test
   public void testExactlySizedBuffer() throws TException {
     // Regression test for https://issues.apache.org/jira/browse/THRIFT-5383.
     // Ensures that a JSON string can be read after writing to a buffer just
diff --git a/lib/java/src/test/java/org/apache/thrift/protocol/TestTProtocolUtil.java b/lib/java/src/test/java/org/apache/thrift/protocol/TestTProtocolUtil.java
index 89cf536..937e913 100644
--- a/lib/java/src/test/java/org/apache/thrift/protocol/TestTProtocolUtil.java
+++ b/lib/java/src/test/java/org/apache/thrift/protocol/TestTProtocolUtil.java
@@ -18,14 +18,16 @@
  */
 package org.apache.thrift.protocol;
 
-import junit.framework.TestCase;
-
 import org.apache.thrift.TSerializer;
-
+import org.junit.jupiter.api.Test;
 import thrift.test.GuessProtocolStruct;
 
-public class TestTProtocolUtil extends TestCase {
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
+public class TestTProtocolUtil  {
+
+  @Test
   public void testGuessProtocolFactory_JSON() throws Exception {
 
     byte[] data = "{foo}".getBytes();
@@ -42,6 +44,7 @@
     assertFalse(factory instanceof TJSONProtocol.Factory);
   }
 
+  @Test
   public void testGuessProtocolFactory_Binary() throws Exception {
     // Check that a last byte != 0 is correctly reported as Binary
 
@@ -58,10 +61,11 @@
     assertTrue(factory instanceof TBinaryProtocol.Factory);
   }
 
+  @Test
   public void testGuessProtocolFactory_Compact() throws Exception {
     // Check that a first byte > 0x10 is reported as Compact
     byte[] buf = new byte[3];
-    buf[0] = 0x11; 
+    buf[0] = 0x11;
     TProtocolFactory factory = TProtocolUtil.guessProtocolFactory(buf, new TBinaryProtocol.Factory());
     assertTrue(factory instanceof TCompactProtocol.Factory);
 
@@ -74,6 +78,7 @@
     }
   }
 
+  @Test
   public void testGuessProtocolFactory_Undecided() throws Exception {
     byte[] buf = new byte[3];
     buf[1] = 0x7e;
diff --git a/lib/java/src/test/java/org/apache/thrift/protocol/TestTSimpleJSONProtocol.java b/lib/java/src/test/java/org/apache/thrift/protocol/TestTSimpleJSONProtocol.java
index bc20e31..b1fc04e 100644
--- a/lib/java/src/test/java/org/apache/thrift/protocol/TestTSimpleJSONProtocol.java
+++ b/lib/java/src/test/java/org/apache/thrift/protocol/TestTSimpleJSONProtocol.java
@@ -18,25 +18,27 @@
  */
 package org.apache.thrift.protocol;
 
-import java.nio.charset.StandardCharsets;
-
-import junit.framework.TestCase;
-
 import org.apache.thrift.Fixtures;
 import org.apache.thrift.TDeserializer;
 import org.apache.thrift.TException;
 import org.apache.thrift.transport.TMemoryBuffer;
-
 import org.apache.thrift.transport.TTransportException;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
 import thrift.test.CompactProtoTestStruct;
 import thrift.test.HolyMoley;
 
-public class TestTSimpleJSONProtocol extends TestCase {
+import java.nio.charset.StandardCharsets;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+
+public class TestTSimpleJSONProtocol {
   private TMemoryBuffer buf;
   private TSimpleJSONProtocol proto;
 
-  @Override
-  protected void setUp() throws Exception {
+  @BeforeEach
+  public void setUp() throws Exception {
     buf = new TMemoryBuffer(1000);
     proto = new TSimpleJSONProtocol(buf);
   }
@@ -45,8 +47,9 @@
     return buf.toString(StandardCharsets.UTF_8);
   }
 
+  @Test
   public void testHolyMoley() throws TException {
-    final HolyMoley holyMoley = Fixtures.holyMoley.deepCopy();
+    final HolyMoley holyMoley = Fixtures.getHolyMoley().deepCopy();
     // unset sets that produce inconsistent ordering between JDK7/8
     holyMoley.unsetBonks();
     holyMoley.unsetContain();
@@ -54,19 +57,22 @@
     assertEquals("{\"big\":[{\"im_true\":1,\"im_false\":0,\"a_bite\":35,\"integer16\":27000,\"integer32\":16777216,\"integer64\":6000000000,\"double_precision\":3.141592653589793,\"some_characters\":\"JSON THIS! \\\"\\u0001\",\"zomg_unicode\":\"ӀⅮΝ Нοⅿоɡгаρℎ Αttαⅽκ�‼\",\"what_who\":0,\"base64\":\"base64\",\"byte_list\":[1,2,3],\"i16_list\":[1,2,3],\"i64_list\":[1,2,3]},{\"im_true\":1,\"im_false\":0,\"a_bite\":-42,\"integer16\":27000,\"integer32\":16777216,\"integer64\":6000000000,\"double_precision\":3.141592653589793,\"some_characters\":\"JSON THIS! \\\"\\u0001\",\"zomg_unicode\":\"ӀⅮΝ Нοⅿоɡгаρℎ Αttαⅽκ�‼\",\"what_who\":0,\"base64\":\"base64\",\"byte_list\":[1,2,3],\"i16_list\":[1,2,3],\"i64_list\":[1,2,3]}]}", bufToString());
   }
 
+  @Test
   public void testNesting() throws TException {
-    Fixtures.nesting.write(proto);
+    Fixtures.getNesting().write(proto);
     assertEquals("{\"my_bonk\":{\"type\":31337,\"message\":\"I am a bonk... xor!\"},\"my_ooe\":{\"im_true\":1,\"im_false\":0,\"a_bite\":-42,\"integer16\":27000,\"integer32\":16777216,\"integer64\":6000000000,\"double_precision\":3.141592653589793,\"some_characters\":\"JSON THIS! \\\"\\u0001\",\"zomg_unicode\":\"ӀⅮΝ Нοⅿоɡгаρℎ Αttαⅽκ�‼\",\"what_who\":0,\"base64\":\"base64\",\"byte_list\":[1,2,3],\"i16_list\":[1,2,3],\"i64_list\":[1,2,3]}}", bufToString());
   }
 
+  @Test
   public void testOneOfEach() throws TException {
-    Fixtures.oneOfEach.write(proto);
+    Fixtures.getOneOfEach().write(proto);
     assertEquals("{\"im_true\":1,\"im_false\":0,\"a_bite\":-42,\"integer16\":27000,\"integer32\":16777216,\"integer64\":6000000000,\"double_precision\":3.141592653589793,\"some_characters\":\"JSON THIS! \\\"\\u0001\",\"zomg_unicode\":\"ӀⅮΝ Нοⅿоɡгаρℎ Αttαⅽκ�‼\",\"what_who\":0,\"base64\":\"base64\",\"byte_list\":[1,2,3],\"i16_list\":[1,2,3],\"i64_list\":[1,2,3]}", bufToString());
   }
 
+  @Test
   public void testSanePartsOfCompactProtoTestStruct() throws TException {
     // unset all the maps with container keys
-    CompactProtoTestStruct struct = Fixtures.compactProtoTestStruct.deepCopy();
+    CompactProtoTestStruct struct = Fixtures.getCompactProtoTestStruct().deepCopy();
     struct.unsetList_byte_map();
     struct.unsetSet_byte_map();
     struct.unsetMap_byte_map();
@@ -85,23 +91,18 @@
     assertEquals("{\"a_byte\":127,\"a_i16\":32000,\"a_i32\":1000000000,\"a_i64\":1099511627775,\"a_double\":5.6789,\"a_string\":\"my string\",\"a_binary\":\"\\u0000\\u0001\\u0002\\u0003\\u0004\\u0005\\u0006\\u0007\\b\",\"true_field\":1,\"false_field\":0,\"empty_struct_field\":{},\"byte_list\":[-127,-1,0,1,127],\"i16_list\":[-1,0,1,32767],\"i32_list\":[-1,0,255,65535,16777215,2147483647],\"i64_list\":[-1,0,255,65535,16777215,4294967295,1099511627775,281474976710655,72057594037927935,9223372036854775807],\"double_list\":[0.1,0.2,0.3],\"string_list\":[\"first\",\"second\",\"third\"],\"boolean_list\":[1,1,1,0,0,0],\"struct_list\":[{},{}],\"i32_set\":[1,2,3],\"boolean_set\":[0,1],\"struct_set\":[{}],\"byte_byte_map\":{\"1\":2},\"boolean_byte_map\":{\"0\":0,\"1\":1},\"byte_i16_map\":{\"1\":1,\"2\":-1,\"3\":32767},\"byte_i32_map\":{\"1\":1,\"2\":-1,\"3\":2147483647},\"byte_i64_map\":{\"1\":1,\"2\":-1,\"3\":9223372036854775807},\"byte_double_map\":{\"1\":0.1,\"2\":-0.1,\"3\":1000000.1},\"byte_string_map\":{\"1\":\"\",\"2\":\"blah\",\"3\":\"loooooooooooooong string\"},\"byte_boolean_map\":{\"1\":1,\"2\":0},\"byte_map_map\":{\"0\":{},\"1\":{\"1\":1},\"2\":{\"1\":1,\"2\":2}},\"byte_set_map\":{\"0\":[],\"1\":[1],\"2\":[1,2]},\"byte_list_map\":{\"0\":[],\"1\":[1],\"2\":[1,2]},\"field500\":500,\"field5000\":5000,\"field20000\":20000}", bufToString());
   }
 
+  @Test
   public void testThrowsOnCollectionKeys() throws TException {
-    try {
-      Fixtures.compactProtoTestStruct.write(proto);
-      fail("this should throw a CollectionMapKeyException");
-    } catch (TSimpleJSONProtocol.CollectionMapKeyException e) {
-      //
-    }
+    assertThrows(TSimpleJSONProtocol.CollectionMapKeyException.class, () -> Fixtures.getCompactProtoTestStruct().write(proto));
   }
 
+  @Test
   public void testReadingThrows() throws TTransportException {
     String input = "{\"test\": \"value\"}";
     TDeserializer deserializer = new TDeserializer(new TSimpleJSONProtocol.Factory());
-    try {
-      deserializer.fromString(Fixtures.oneOfEach, input);
-      fail("Was able to read SimpleJSON");
-    } catch (TException e) {
-      assertEquals("Not implemented", e.getMessage());
-    }
+    TException e = assertThrows(TException.class, ()->{
+      deserializer.fromString(Fixtures.getOneOfEach(), input);
+    });
+    assertEquals("Not implemented", e.getMessage());
   }
 }
diff --git a/lib/java/src/test/java/org/apache/thrift/protocol/TestTTupleProtocol.java b/lib/java/src/test/java/org/apache/thrift/protocol/TestTTupleProtocol.java
index b654db3..b0e3bcd 100644
--- a/lib/java/src/test/java/org/apache/thrift/protocol/TestTTupleProtocol.java
+++ b/lib/java/src/test/java/org/apache/thrift/protocol/TestTTupleProtocol.java
@@ -2,7 +2,7 @@
 
 import org.apache.thrift.TDeserializer;
 import org.apache.thrift.TSerializer;
-
+import org.junit.jupiter.api.Test;
 import thrift.test.TupleProtocolTestStruct;
 
 
@@ -18,6 +18,7 @@
     return new TTupleProtocol.Factory();
   }
 
+  @Test
   public void testBitsetLengthIssue() throws Exception {
     final TupleProtocolTestStruct t1 = new TupleProtocolTestStruct();
     t1.setField1(0);
diff --git a/lib/java/src/test/java/org/apache/thrift/scheme/TestStandardScheme.java b/lib/java/src/test/java/org/apache/thrift/scheme/TestStandardScheme.java
index 43e40c2..f5f0e0b 100644
--- a/lib/java/src/test/java/org/apache/thrift/scheme/TestStandardScheme.java
+++ b/lib/java/src/test/java/org/apache/thrift/scheme/TestStandardScheme.java
@@ -1,7 +1,5 @@
 package org.apache.thrift.scheme;
 
-import junit.framework.TestCase;
-
 import org.apache.thrift.Fixtures;
 import org.apache.thrift.TBase;
 import org.apache.thrift.TDeserializer;
@@ -11,13 +9,15 @@
 import org.apache.thrift.protocol.TProtocol;
 import org.apache.thrift.transport.TMemoryBuffer;
 import org.apache.thrift.transport.TTransport;
-
 import org.apache.thrift.transport.TTransportException;
+import org.junit.jupiter.api.Test;
 import thrift.test.HolyMoley;
 import thrift.test.Nesting;
 import thrift.test.OneOfEach;
 
-public class TestStandardScheme extends TestCase {
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+public class TestStandardScheme {
   TSerializer serializer = new TSerializer();
   TDeserializer deserializer = new TDeserializer();
 
@@ -28,13 +28,14 @@
    * This tests whether the Standard Scheme properly reads structs serialized
    * using an older version of thrift.
    */
+  @Test
   public void testPersistentStructs() throws TException {
-    readAndCompare(new OneOfEach(), Fixtures.oneOfEach, Fixtures.persistentBytesOneOfEach);
-    readAndCompare(new HolyMoley(), Fixtures.holyMoley, Fixtures.persistentBytesHolyMoley);
-    readAndCompare(new Nesting(), Fixtures.nesting, Fixtures.persistentBytesNesting);
+    readAndCompare(new OneOfEach(), Fixtures.getOneOfEach(), Fixtures.getPersistentBytesOneOfEach());
+    readAndCompare(new HolyMoley(), Fixtures.getHolyMoley(), Fixtures.getPersistentBytesHolyMoley());
+    readAndCompare(new Nesting(), Fixtures.getNesting(), Fixtures.getPersistentBytesNesting());
   }
 
-  public void readAndCompare(TBase struct, TBase fixture, byte[] inputBytes) throws TException {
+  private void readAndCompare(TBase struct, TBase fixture, byte[] inputBytes) throws TException {
     TTransport trans = new TMemoryBuffer(0);
     trans.write(inputBytes, 0, inputBytes.length);
     TProtocol iprot = new TBinaryProtocol(trans);
diff --git a/lib/java/src/test/java/org/apache/thrift/server/ServerTestBase.java b/lib/java/src/test/java/org/apache/thrift/server/ServerTestBase.java
index e2bf96a..3c40262 100644
--- a/lib/java/src/test/java/org/apache/thrift/server/ServerTestBase.java
+++ b/lib/java/src/test/java/org/apache/thrift/server/ServerTestBase.java
@@ -18,18 +18,6 @@
  */
 package org.apache.thrift.server;
 
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import java.nio.ByteBuffer;
-
-import junit.framework.TestCase;
-
 import org.apache.thrift.TException;
 import org.apache.thrift.TProcessor;
 import org.apache.thrift.async.AsyncMethodCallback;
@@ -37,13 +25,13 @@
 import org.apache.thrift.protocol.TCompactProtocol;
 import org.apache.thrift.protocol.TProtocol;
 import org.apache.thrift.protocol.TProtocolFactory;
-import org.apache.thrift.transport.TTransportException;
-import org.apache.thrift.transport.layered.TFramedTransport;
 import org.apache.thrift.transport.TSocket;
 import org.apache.thrift.transport.TTransport;
+import org.apache.thrift.transport.TTransportException;
 import org.apache.thrift.transport.TTransportFactory;
+import org.apache.thrift.transport.layered.TFramedTransport;
 import org.apache.thrift.transport.layered.TFramedTransport.Factory;
-
+import org.junit.jupiter.api.Test;
 import thrift.test.Insanity;
 import thrift.test.Numberz;
 import thrift.test.ThriftTest;
@@ -52,46 +40,66 @@
 import thrift.test.Xtruct;
 import thrift.test.Xtruct2;
 
-public abstract class ServerTestBase extends TestCase {
+import java.nio.ByteBuffer;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+public abstract class ServerTestBase  {
 
   public static class TestHandler implements ThriftTest.Iface {
 
     public TestHandler() {}
 
+    @Override
     public void testVoid() {
       System.out.print("testVoid()\n");
     }
 
+    @Override
     public String testString(String thing) {
       System.out.print("testString(\"" + thing + "\")\n");
       return thing;
     }
 
+    @Override
     public boolean testBool(boolean thing) {
       System.out.print("testBool(" + thing + ")\n");
       return thing;
     }
 
+    @Override
     public byte testByte(byte thing) {
       System.out.print("testByte(" + thing + ")\n");
       return thing;
     }
 
+    @Override
     public int testI32(int thing) {
       System.out.print("testI32(" + thing + ")\n");
       return thing;
     }
 
+    @Override
     public long testI64(long thing) {
       System.out.print("testI64(" + thing + ")\n");
       return thing;
     }
 
+    @Override
     public double testDouble(double thing) {
       System.out.print("testDouble(" + thing + ")\n");
       return thing;
     }
 
+    @Override
     public ByteBuffer testBinary(ByteBuffer thing) {
       StringBuilder sb = new StringBuilder(thing.remaining() * 3);
       thing.mark();
@@ -102,11 +110,12 @@
       if(thing.remaining() > 0) {
         sb.append("...");  // indicate we have more date
       }
-      System.out.print("testBinary(" + sb.toString() + ")\n");
+      System.out.print("testBinary(" + sb + ")\n");
       thing.reset();
       return thing;
     }
 
+    @Override
     public Xtruct testStruct(Xtruct thing) {
       System.out.print("testStruct({" +
                        "\"" + thing.string_thing + "\", " +
@@ -116,6 +125,7 @@
       return thing;
     }
 
+    @Override
     public Xtruct2 testNest(Xtruct2 nest) {
       Xtruct thing = nest.struct_thing;
       System.out.print("testNest({" +
@@ -128,6 +138,7 @@
       return nest;
     }
 
+    @Override
     public Map<Integer,Integer> testMap(Map<Integer,Integer> thing) {
       System.out.print("testMap({");
       System.out.print(thing);
@@ -135,6 +146,7 @@
       return thing;
     }
 
+    @Override
     public Map<String,String> testStringMap(Map<String,String> thing) {
       System.out.print("testStringMap({");
       System.out.print(thing);
@@ -142,6 +154,7 @@
       return thing;
     }
 
+    @Override
     public Set<Integer> testSet(Set<Integer> thing) {
       System.out.print("testSet({");
       boolean first = true;
@@ -157,6 +170,7 @@
       return thing;
     }
 
+    @Override
     public List<Integer> testList(List<Integer> thing) {
       System.out.print("testList({");
       boolean first = true;
@@ -172,23 +186,26 @@
       return thing;
     }
 
+    @Override
     public Numberz testEnum(Numberz thing) {
       System.out.print("testEnum(" + thing + ")\n");
       return thing;
     }
 
+    @Override
     public long testTypedef(long thing) {
       System.out.print("testTypedef(" + thing + ")\n");
       return thing;
     }
 
+    @Override
     public Map<Integer,Map<Integer,Integer>> testMapMap(int hello) {
       System.out.print("testMapMap(" + hello + ")\n");
       Map<Integer,Map<Integer,Integer>> mapmap =
-        new HashMap<Integer,Map<Integer,Integer>>();
+              new HashMap<>();
 
-      HashMap<Integer,Integer> pos = new HashMap<Integer,Integer>();
-      HashMap<Integer,Integer> neg = new HashMap<Integer,Integer>();
+      HashMap<Integer,Integer> pos = new HashMap<>();
+      HashMap<Integer,Integer> neg = new HashMap<>();
       for (int i = 1; i < 5; i++) {
         pos.put(i, i);
         neg.put(-i, -i);
@@ -200,11 +217,12 @@
       return mapmap;
     }
 
+    @Override
     public Map<Long, Map<Numberz,Insanity>> testInsanity(Insanity argument) {
       System.out.print("testInsanity()\n");
 
-      HashMap<Numberz,Insanity> first_map = new HashMap<Numberz, Insanity>();
-      HashMap<Numberz,Insanity> second_map = new HashMap<Numberz, Insanity>();
+      HashMap<Numberz,Insanity> first_map = new HashMap<>();
+      HashMap<Numberz,Insanity> second_map = new HashMap<>();
 
       first_map.put(Numberz.TWO, argument);
       first_map.put(Numberz.THREE, argument);
@@ -213,13 +231,14 @@
       second_map.put(Numberz.SIX, looney);
 
       Map<Long,Map<Numberz,Insanity>> insane =
-        new HashMap<Long, Map<Numberz,Insanity>>();
+              new HashMap<>();
       insane.put((long)1, first_map);
       insane.put((long)2, second_map);
 
       return insane;
     }
 
+    @Override
     public Xtruct testMulti(byte arg0, int arg1, long arg2, Map<Short,String> arg3, Numberz arg4, long arg5) {
       System.out.print("testMulti()\n");
 
@@ -231,7 +250,8 @@
       return hello;
     }
 
-    public void testException(String arg) throws Xception, TException {
+    @Override
+    public void testException(String arg) throws TException {
       System.out.print("testException("+arg+")\n");
       if ("Xception".equals(arg)) {
         Xception x = new Xception();
@@ -248,6 +268,7 @@
       return;
     }
 
+    @Override
     public Xtruct testMultiException(String arg0, String arg1) throws Xception, Xception2 {
       System.out.print("testMultiException(" + arg0 + ", " + arg1 + ")\n");
       if (arg0.equals("Xception")) {
@@ -268,6 +289,7 @@
       return result;
     }
 
+    @Override
     public void testOneway(int sleepFor) {
       System.out.println("testOneway(" + sleepFor +
                          ") => sleeping...");
@@ -285,9 +307,9 @@
       new TCompactProtocol.Factory());
 
   public static final String HOST = "localhost";
-  public static final int PORT = Integer.valueOf(
+  public static final int PORT = Integer.parseInt(
     System.getProperty("test.port", "9090"));
-  protected static final int SLEEP_DELAY = 1000;
+  protected static final long SLEEP_DELAY = 1000;
   protected static final int SOCKET_TIMEOUT = 1500;
   private static final Xtruct XSTRUCT = new Xtruct("Zero", (byte) 1, -3, -5);
   private static final Xtruct2 XSTRUCT2 = new Xtruct2((byte)1, XSTRUCT, 5);
@@ -342,14 +364,14 @@
     Insanity insane;
 
     insane = new Insanity();
-    insane.userMap = new HashMap<Numberz, Long>();
+    insane.userMap = new HashMap<>();
     insane.userMap.put(Numberz.FIVE, (long)5000);
     Xtruct truck = new Xtruct();
     truck.string_thing = "Truck";
     truck.byte_thing = (byte)8;
     truck.i32_thing = 8;
     truck.i64_thing = 8;
-    insane.xtructs = new ArrayList<Xtruct>();
+    insane.xtructs = new ArrayList<>();
     insane.xtructs.add(truck);
     System.out.print("testInsanity()");
     Map<Long,Map<Numberz,Insanity>> whoa =
@@ -391,10 +413,11 @@
       return false;
   }
 
+  @Test
   public void testIt() throws Exception {
 
     for (TProtocolFactory protoFactory : getProtocols()) {
-      TProcessor processor = useAsyncProcessor() ? new ThriftTest.AsyncProcessor<AsyncTestHandler>(new AsyncTestHandler()) : new ThriftTest.Processor<TestHandler>(new TestHandler());
+      TProcessor processor = useAsyncProcessor() ? new ThriftTest.AsyncProcessor<>(new AsyncTestHandler()) : new ThriftTest.Processor<>(new TestHandler());
 
       startServer(processor, protoFactory);
 
@@ -442,7 +465,7 @@
   }
 
   private void testList(ThriftTest.Client testClient) throws TException {
-    List<Integer> listout = new ArrayList<Integer>();
+    List<Integer> listout = new ArrayList<>();
     for (int i = -2; i < 3; ++i) {
       listout.add(i);
     }
@@ -451,7 +474,7 @@
   }
 
   private void testMap(ThriftTest.Client testClient) throws TException {
-    Map<Integer,Integer> mapout = new HashMap<Integer,Integer>();
+    Map<Integer,Integer> mapout = new HashMap<>();
     for (int i = 0; i < 5; ++i) {
       mapout.put(i, i-10);
     }
@@ -460,7 +483,7 @@
   }
 
   private void testStringMap(ThriftTest.Client testClient) throws TException {
-    Map<String,String> mapout = new HashMap<String,String>();
+    Map<String,String> mapout = new HashMap<>();
     mapout.put("a", "123");
     mapout.put(" x y ", " with spaces ");
     mapout.put("same", "same");
@@ -473,10 +496,10 @@
     Map<Integer,Map<Integer,Integer>> mm =
       testClient.testMapMap(1);
     Map<Integer,Map<Integer,Integer>> mapmap =
-      new HashMap<Integer,Map<Integer,Integer>>();
+            new HashMap<>();
 
-    HashMap<Integer,Integer> pos = new HashMap<Integer,Integer>();
-    HashMap<Integer,Integer> neg = new HashMap<Integer,Integer>();
+    HashMap<Integer,Integer> pos = new HashMap<>();
+    HashMap<Integer,Integer> neg = new HashMap<>();
     for (int i = 1; i < 5; i++) {
       pos.put(i, i);
       neg.put(-i, -i);
@@ -500,7 +523,7 @@
   }
 
   private void testSet(ThriftTest.Client testClient) throws TException {
-    Set<Integer> setout = new HashSet<Integer>();
+    Set<Integer> setout = new HashSet<>();
     for (int i = -2; i < 3; ++i) {
       setout.add(i);
     }
@@ -540,10 +563,11 @@
     }
   }
 
+  @Test
   public void testTransportFactory() throws Exception {
     for (TProtocolFactory protoFactory : getProtocols()) {
       TestHandler handler = new TestHandler();
-      ThriftTest.Processor<TestHandler> processor = new ThriftTest.Processor<TestHandler>(handler);
+      ThriftTest.Processor<TestHandler> processor = new ThriftTest.Processor<>(handler);
 
       final CallCountingTransportFactory factory = new CallCountingTransportFactory(new TFramedTransport.Factory());
 
@@ -564,7 +588,7 @@
     }
   }
 
-  private void testException(ThriftTest.Client testClient) throws TException, Xception {
+  private void testException(ThriftTest.Client testClient) throws TException {
     try {
       testClient.testException("Xception");
       assert false;
diff --git a/lib/java/src/test/java/org/apache/thrift/server/TestNonblockingServer.java b/lib/java/src/test/java/org/apache/thrift/server/TestNonblockingServer.java
index 2c77908..927635b 100644
--- a/lib/java/src/test/java/org/apache/thrift/server/TestNonblockingServer.java
+++ b/lib/java/src/test/java/org/apache/thrift/server/TestNonblockingServer.java
@@ -18,20 +18,21 @@
  */
 package org.apache.thrift.server;
 
-
 import org.apache.thrift.TProcessor;
 import org.apache.thrift.protocol.TProtocol;
 import org.apache.thrift.protocol.TProtocolFactory;
 import org.apache.thrift.server.TNonblockingServer.Args;
-import org.apache.thrift.transport.layered.TFramedTransport;
 import org.apache.thrift.transport.TNonblockingServerSocket;
 import org.apache.thrift.transport.TSocket;
 import org.apache.thrift.transport.TTransport;
 import org.apache.thrift.transport.TTransportException;
 import org.apache.thrift.transport.TTransportFactory;
-
+import org.apache.thrift.transport.layered.TFramedTransport;
+import org.junit.jupiter.api.Test;
 import thrift.test.ThriftTest;
 
+import static org.junit.jupiter.api.Assertions.fail;
+
 public class TestNonblockingServer extends ServerTestBase {
 
   private Thread serverThread;
@@ -84,6 +85,7 @@
   }
 
 
+  @Test
   public void testCleanupAllSelectionKeys() throws Exception {
     for (TProtocolFactory protoFactory : getProtocols()) {
       TestHandler handler = new TestHandler();
diff --git a/lib/java/src/test/java/org/apache/thrift/server/TestSaslNonblockingServer.java b/lib/java/src/test/java/org/apache/thrift/server/TestSaslNonblockingServer.java
index d0a6746..fb7bbdc 100644
--- a/lib/java/src/test/java/org/apache/thrift/server/TestSaslNonblockingServer.java
+++ b/lib/java/src/test/java/org/apache/thrift/server/TestSaslNonblockingServer.java
@@ -31,9 +31,12 @@
 import org.apache.thrift.transport.TestTSaslTransports;
 import org.apache.thrift.transport.TestTSaslTransports.TestSaslCallbackHandler;
 import org.apache.thrift.transport.sasl.TSaslNegotiationException;
+import org.junit.jupiter.api.Test;
 import thrift.test.ThriftTest;
 
 import static org.apache.thrift.transport.sasl.TSaslNegotiationException.ErrorType.AUTHENTICATION_FAILURE;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
 public class TestSaslNonblockingServer extends TestTSaslTransports.TestTSaslTransportsWithServer {
 
@@ -61,10 +64,12 @@
   }
 
   @Override
+  @Test
   public void testIt() throws Exception {
     super.testIt();
   }
 
+  @Test
   public void testBadPassword() throws Exception {
     TProtocolFactory protocolFactory = new TBinaryProtocol.Factory();
     TProcessor processor = new ThriftTest.Processor<>(new TestHandler());
@@ -72,23 +77,20 @@
 
     TSocket socket = new TSocket(HOST, PORT);
     socket.setTimeout(SOCKET_TIMEOUT);
-    TSaslClientTransport client = new TSaslClientTransport(TestTSaslTransports.WRAPPED_MECHANISM,
-        TestTSaslTransports.PRINCIPAL, TestTSaslTransports.SERVICE, TestTSaslTransports.HOST,
-        TestTSaslTransports.WRAPPED_PROPS, new TestSaslCallbackHandler("bad_password"), socket);
-    try {
-      client.open();
-      fail("Client should fail with sasl negotiation.");
-    } catch (TTransportException error) {
+    try (TSaslClientTransport client = new TSaslClientTransport(TestTSaslTransports.WRAPPED_MECHANISM,
+            TestTSaslTransports.PRINCIPAL, TestTSaslTransports.SERVICE, TestTSaslTransports.HOST,
+            TestTSaslTransports.WRAPPED_PROPS, new TestSaslCallbackHandler("bad_password"), socket)) {
+      TTransportException error = assertThrows(TTransportException.class, client::open, "Client should fail with sasl negotiation.");
       TSaslNegotiationException serverSideError = new TSaslNegotiationException(AUTHENTICATION_FAILURE,
-          "Authentication failed with " + TestTSaslTransports.WRAPPED_MECHANISM);
-      assertTrue("Server should return error message \"" + serverSideError.getSummary() + "\"",
-          error.getMessage().contains(serverSideError.getSummary()));
+              "Authentication failed with " + TestTSaslTransports.WRAPPED_MECHANISM);
+      assertTrue(error.getMessage().contains(serverSideError.getSummary()),
+              "Server should return error message \"" + serverSideError.getSummary() + "\"");
     } finally {
       stopServer();
-      client.close();
     }
   }
 
+  @Test
   @Override
   public void testTransportFactory() {
     // This test is irrelevant here, so skipped.
diff --git a/lib/java/src/test/java/org/apache/thrift/server/TestThreadPoolServer.java b/lib/java/src/test/java/org/apache/thrift/server/TestThreadPoolServer.java
index 4c84dc1..f532ed4 100644
--- a/lib/java/src/test/java/org/apache/thrift/server/TestThreadPoolServer.java
+++ b/lib/java/src/test/java/org/apache/thrift/server/TestThreadPoolServer.java
@@ -23,12 +23,14 @@
 import org.apache.thrift.transport.TServerSocket;
 import org.apache.thrift.transport.TServerTransport;
 import org.apache.thrift.transport.TSocket;
-import org.junit.Assert;
-import org.junit.Test;
+import org.junit.jupiter.api.Test;
 import thrift.test.ThriftTest;
 
 import java.util.concurrent.ThreadPoolExecutor;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
 public class TestThreadPoolServer {
 
   /**
@@ -38,24 +40,24 @@
   public void testStopServerWithOpenClient() throws Exception {
     TServerSocket serverSocket = new TServerSocket(0, 3000);
     TThreadPoolServer server = buildServer(serverSocket);
-    Thread serverThread = new Thread(() -> server.serve());
+    Thread serverThread = new Thread(server::serve);
     serverThread.start();
     try (TSocket client = new TSocket("localhost", serverSocket.getServerSocket().getLocalPort())) {
       client.open();
       Thread.sleep(1000);
       // There is a thread listening to the client
-      Assert.assertEquals(1, ((ThreadPoolExecutor) server.getExecutorService()).getActiveCount());
+      assertEquals(1, ((ThreadPoolExecutor) server.getExecutorService()).getActiveCount());
 
       // Trigger the server to stop, but it does not wait
       server.stop();
-      Assert.assertTrue(server.waitForShutdown());
+      assertTrue(server.waitForShutdown());
 
       // After server is stopped, the executor thread pool should be shut down
-      Assert.assertTrue("Server thread pool should be terminated", server.getExecutorService().isTerminated());
+      assertTrue(server.getExecutorService().isTerminated(), "Server thread pool should be terminated");
 
       // TODO: The socket is actually closed (timeout) but the client code
       // ignores the timeout Exception and maintains the socket open state
-      Assert.assertTrue("Client should be closed after server shutdown", client.isOpen());
+      assertTrue(client.isOpen(), "Client should be closed after server shutdown");
     }
   }
 
diff --git a/lib/java/src/test/java/org/apache/thrift/test/ReadStruct.java b/lib/java/src/test/java/org/apache/thrift/test/ReadStruct.java
index 7e3b091..4cc8f80 100644
--- a/lib/java/src/test/java/org/apache/thrift/test/ReadStruct.java
+++ b/lib/java/src/test/java/org/apache/thrift/test/ReadStruct.java
@@ -51,11 +51,11 @@
 
     cpts.read(proto);
 
-    if (cpts.equals(Fixtures.compactProtoTestStruct)) {
+    if (cpts.equals(Fixtures.getCompactProtoTestStruct())) {
       System.out.println("Object verified successfully!");
     } else {
       System.out.println("Object failed verification!");
-      System.out.println("Expected: " + Fixtures.compactProtoTestStruct + " but got " + cpts);
+      System.out.println("Expected: " + Fixtures.getCompactProtoTestStruct() + " but got " + cpts);
     }
   }
 
diff --git a/lib/java/src/test/java/org/apache/thrift/test/SerializationBenchmark.java b/lib/java/src/test/java/org/apache/thrift/test/SerializationBenchmark.java
index de22556..8085ef4 100644
--- a/lib/java/src/test/java/org/apache/thrift/test/SerializationBenchmark.java
+++ b/lib/java/src/test/java/org/apache/thrift/test/SerializationBenchmark.java
@@ -39,8 +39,8 @@
   public static void main(String[] args) throws Exception {
     TProtocolFactory factory = new TBinaryProtocol.Factory();
 
-    testSerialization(factory, Fixtures.oneOfEach);
-    testDeserialization(factory, Fixtures.oneOfEach, OneOfEach.class);
+    testSerialization(factory, Fixtures.getOneOfEach());
+    testDeserialization(factory, Fixtures.getOneOfEach(), OneOfEach.class);
   }
 
   public static void testSerialization(TProtocolFactory factory, TBase object) throws Exception {
@@ -74,7 +74,7 @@
 
     long startTime = System.currentTimeMillis();
     for (int i = 0; i < HOW_MANY; i++) {
-      T o2 = klass.newInstance();
+      T o2 = klass.getConstructor().newInstance();
       o2.read(factory.getProtocol(new TMemoryInputTransport(new TConfiguration(), serialized)));
     }
     long endTime = System.currentTimeMillis();
diff --git a/lib/java/src/test/java/org/apache/thrift/test/WriteStruct.java b/lib/java/src/test/java/org/apache/thrift/test/WriteStruct.java
index a0013a9..cb60bca 100644
--- a/lib/java/src/test/java/org/apache/thrift/test/WriteStruct.java
+++ b/lib/java/src/test/java/org/apache/thrift/test/WriteStruct.java
@@ -34,14 +34,14 @@
       System.out.println("usage: java -cp build/classes org.apache.thrift.test.WriteStruct filename proto_factory_class");
       System.out.println("Write out an instance of Fixtures.compactProtocolTestStruct to 'file'. Use a protocol from 'proto_factory_class'.");
     }
-    
+
     TTransport trans = new TIOStreamTransport(new BufferedOutputStream(new FileOutputStream(args[0])));
-    
+
     TProtocolFactory factory = (TProtocolFactory)Class.forName(args[1]).newInstance();
-    
+
     TProtocol proto = factory.getProtocol(trans);
-    
-    Fixtures.compactProtoTestStruct.write(proto);
+
+    Fixtures.getCompactProtoTestStruct().write(proto);
     trans.flush();
   }
 
diff --git a/lib/java/src/test/java/org/apache/thrift/test/voidmethexceptions/TestVoidMethExceptions.java b/lib/java/src/test/java/org/apache/thrift/test/voidmethexceptions/TestVoidMethExceptions.java
index af39262..b6853bd 100644
--- a/lib/java/src/test/java/org/apache/thrift/test/voidmethexceptions/TestVoidMethExceptions.java
+++ b/lib/java/src/test/java/org/apache/thrift/test/voidmethexceptions/TestVoidMethExceptions.java
@@ -33,13 +33,8 @@
 import org.apache.thrift.transport.TSocket;
 import org.apache.thrift.transport.TTransport;
 import org.apache.thrift.transport.layered.TFramedTransport;
-import org.junit.After;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.Parameterized;
-import org.junit.runners.Parameterized.Parameters;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.MethodSource;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import thrift.test.voidmethexceptions.TAppService01;
@@ -49,501 +44,517 @@
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.TimeUnit;
 import java.util.function.Supplier;
+import java.util.stream.Stream;
 
-@RunWith(Parameterized.class)
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotEquals;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+
 public class TestVoidMethExceptions {
 
-  private static final Logger log = LoggerFactory.getLogger(TestVoidMethExceptions.class);
+    private static final Logger log = LoggerFactory.getLogger(TestVoidMethExceptions.class);
 
-  private static final int TIMEOUT_MILLIS = 5_000;
-
-  private final ServerImplementationType serverImplementationType;
-
-  private TServer server;
-  private Thread serverThread;
-  private int serverPort;
-
-
-  public TestVoidMethExceptions(ServerImplementationType serverImplementationType) {
-    Assert.assertNotNull(serverImplementationType);
-    this.serverImplementationType = serverImplementationType;
-  }
-
-
-  @Parameters(name = "serverImplementationType = {0}")
-  public static Object[][] parameters() {
-    return new Object[][]{{ServerImplementationType.SYNC_SERVER},
-        {ServerImplementationType.ASYNC_SERVER}};
-  }
-
-
-  @Before
-  public void setUp() throws Exception {
-    serverPort = -1;
-    serverImplementationType.service.setCancelled(false);
-    CompletableFuture<Void> futureServerStarted = new CompletableFuture<>();
-    TNonblockingServerSocket serverTransport = new TNonblockingServerSocket(0);
-    TNonblockingServer.Args args = new TNonblockingServer.Args(serverTransport);
-    args.processor(serverImplementationType.processor);
-    server = new TNonblockingServer(args) {
-
-      @Override
-      protected void setServing(boolean serving) {
-        super.setServing(serving);
-
-        if (serving) {
-          serverPort = serverTransport.getPort();
-          futureServerStarted.complete(null);
-        }
-      }
-
-    };
-
-    serverThread = new Thread(() -> {
-      server.serve();
-    }, "thrift-server");
-    serverThread.setDaemon(true);
-    serverThread.start();
-    futureServerStarted.get(TIMEOUT_MILLIS, TimeUnit.MILLISECONDS);
-  }
-
-  @After
-  public void tearDown() throws Exception {
-    serverImplementationType.service.setCancelled(true);
-    server.stop();
-    serverThread.join(TIMEOUT_MILLIS);
-  }
-
-
-  @Test
-  public void testSyncClientMustReturnResultReturnString() throws Exception {
-    checkSyncClient("returnString",
-        "sent msg",
-        false,
-        "sent msg",
-        null,
-        null,
-        (client, msg, throwException) -> {
-          return client.returnString(msg, throwException);
-        });
-  }
-
-  @Test
-  public void testSyncClientMustReturnResultReturnVoidThrows() throws Exception {
-    checkSyncClient("returnVoidThrows",
-        "sent msg",
-        false,
-        null,
-        null,
-        null,
-        (client, msg, throwException) -> {
-          client.returnVoidThrows(msg, throwException);
-          return null;
-        });
-  }
-
-  @Test
-  public void testSyncClientMustReturnResultReturnVoidNoThrowsRuntimeException() throws Exception {
-    checkSyncClient("returnVoidNoThrowsRuntimeException",
-        "sent msg",
-        false,
-        null,
-        null,
-        null,
-        (client, msg, throwException) -> {
-          client.returnVoidNoThrowsRuntimeException(msg, throwException);
-          return null;
-        });
-  }
-
-  @Test
-  public void testSyncClientMustReturnResultReturnVoidNoThrowsTApplicationException() throws Exception {
-    checkSyncClient("returnVoidNoThrowsTApplicationException",
-        "sent msg",
-        false,
-        null,
-        null,
-        null,
-        (client, msg, throwException) -> {
-          client.returnVoidNoThrowsTApplicationException(msg, throwException);
-          return null;
-        });
-  }
-
-
-  @Test
-  public void testSyncClientMustThrowExceptionReturnString() throws Exception {
-    checkSyncClient("returnString",
-        "sent msg",
-        true,
-        null,
-        TExampleException.class,
-        "sent msg",
-        (client, msg, throwException) -> {
-          return client.returnString(msg, throwException);
-        });
-  }
-
-  @Test
-  public void testSyncClientMustThrowExceptionReturnVoidThrows() throws Exception {
-    checkSyncClient("returnVoidThrows",
-        "sent msg",
-        true,
-        null,
-        TExampleException.class,
-        "sent msg",
-        (client, msg, throwException) -> {
-          client.returnVoidThrows(msg, throwException);
-          return null;
-        });
-  }
-
-  @Test
-  public void testSyncClientMustThrowExceptionReturnVoidNoThrowsRuntimeException() throws Exception {
-    checkSyncClient("returnVoidNoThrowsRuntimeException",
-        "sent msg",
-        true,
-        null,
-        TApplicationException.class,
-        serverImplementationType == ServerImplementationType.ASYNC_SERVER ? "sent msg"
-            : null, // sync server return "Internal error processing returnVoidNoThrowsRuntimeException" message
-        (client, msg, throwException) -> {
-          client.returnVoidNoThrowsRuntimeException(msg, throwException);
-          return null;
-        });
-  }
-
-  @Test
-  public void testSyncClientMustThrowExceptionReturnVoidNoThrowsTApplicationException() throws Exception {
-    checkSyncClient("returnVoidNoThrowsTApplicationException",
-        "sent msg",
-        true,
-        null,
-        TApplicationException.class,
-        "sent msg",
-        (client, msg, throwException) -> {
-          client.returnVoidNoThrowsTApplicationException(msg, throwException);
-          return null;
-        });
-  }
-
-
-  @Test
-  public void testAsyncClientMustReturnResultReturnString() throws Throwable {
-    checkAsyncClient("returnString",
-        "sent msg",
-        false,
-        "sent msg",
-        null,
-        null,
-        (client, msg, throwException, resultHandler) -> {
-          client.returnString(msg, throwException, resultHandler);
-        });
-  }
-
-  @Test
-  public void testAsyncClientMustReturnResultReturnVoidThrows() throws Throwable {
-    checkAsyncClient("returnVoidThrows",
-        "sent msg",
-        false,
-        (Void) null,
-        null,
-        null,
-        (client, msg, throwException, resultHandler) -> {
-          client.returnVoidThrows(msg, throwException, resultHandler);
-        });
-  }
-
-  @Test
-  public void testAsyncClientMustReturnResultReturnVoidNoThrowsRuntimeException() throws Throwable {
-    checkAsyncClient("returnVoidNoThrowsRuntimeException",
-        "sent msg",
-        false,
-        (Void) null,
-        null,
-        null,
-        (client, msg, throwException, resultHandler) -> {
-          client.returnVoidNoThrowsRuntimeException(msg, throwException, resultHandler);
-        });
-  }
-
-  @Test
-  public void testAsyncClientMustReturnResultReturnVoidNoThrowsTApplicationException() throws Throwable {
-    checkAsyncClient("returnVoidNoThrowsTApplicationException",
-        "sent msg",
-        false,
-        (Void) null,
-        null,
-        null,
-        (client, msg, throwException, resultHandler) -> {
-          client.returnVoidNoThrowsTApplicationException(msg, throwException, resultHandler);
-        });
-  }
-
-
-  @Test
-  public void testAsyncClientMustThrowExceptionReturnString() throws Throwable {
-    checkAsyncClient("returnString",
-        "sent msg",
-        true,
-        (String) null,
-        TExampleException.class,
-        "sent msg",
-        (client, msg, throwException, resultHandler) -> {
-          client.returnString(msg, throwException, resultHandler);
-        });
-  }
-
-  @Test
-  public void testAsyncClientMustThrowExceptionReturnVoidThrows() throws Throwable {
-    checkAsyncClient("returnVoidThrows",
-        "sent msg",
-        true,
-        (Void) null,
-        TExampleException.class,
-        "sent msg",
-        (client, msg, throwException, resultHandler) -> {
-          client.returnVoidThrows(msg, throwException, resultHandler);
-        });
-  }
-
-  @Test
-  public void testAsyncClientMustThrowExceptionReturnVoidNoThrowsRuntimeException() throws Throwable {
-    checkAsyncClient("returnVoidNoThrowsRuntimeException",
-        "sent msg",
-        true,
-        (Void) null,
-        TApplicationException.class,
-        serverImplementationType == ServerImplementationType.ASYNC_SERVER ? "sent msg"
-            : null, // sync server return "Internal error processing returnVoidNoThrowsRuntimeException" message
-        (client, msg, throwException, resultHandler) -> {
-          client.returnVoidNoThrowsRuntimeException(msg, throwException, resultHandler);
-        });
-  }
-
-  @Test
-  public void testAsyncClientMustThrowExceptionReturnVoidNoThrowsTApplicationException() throws Throwable {
-    checkAsyncClient("returnVoidNoThrowsTApplicationException",
-        "sent msg",
-        true,
-        (Void) null,
-        TApplicationException.class,
-        "sent msg",
-        (client, msg, throwException, resultHandler) -> {
-          client.returnVoidNoThrowsTApplicationException(msg, throwException, resultHandler);
-        });
-  }
-
-
-  @Test
-  public void testSyncClientNoWaitForResultNoExceptionOnewayVoidNoThrows() throws Exception {
-    checkSyncClient("onewayVoidNoThrows",
-        "sent msg",
-        false,
-        null,
-        null,
-        null,
-        (client, msg, throwException) -> {
-          client.onewayVoidNoThrows(msg, throwException);
-          return null;
-        });
-  }
-
-  @Test
-  public void testSyncClientNoWaitForResultExceptionOnewayVoidNoThrows() throws Exception {
-    checkSyncClient("onewayVoidNoThrows",
-        "sent msg",
-        true,
-        null,
-        null,
-        null,
-        (client, msg, throwException) -> {
-          client.onewayVoidNoThrows(msg, throwException);
-          return null;
-        });
-  }
-
-  @Test
-  public void testAsyncClientNoWaitForResultNoExceptionOnewayVoidNoThrows() throws Throwable {
-    checkAsyncClient("onewayVoidNoThrows",
-        "sent msg",
-        false,
-        (Void) null,
-        null,
-        null,
-        (client, msg, throwException, resultHandler) -> {
-          client.onewayVoidNoThrows(msg, throwException, resultHandler);
-        });
-  }
-
-  @Test
-  public void testAsyncClientNoWaitForResultExceptionOnewayVoidNoThrows() throws Throwable {
-    checkAsyncClient("onewayVoidNoThrows",
-        "sent msg",
-        true,
-        (Void) null,
-        null,
-        null,
-        (client, msg, throwException, resultHandler) -> {
-          client.onewayVoidNoThrows(msg, throwException, resultHandler);
-        });
-  }
-
-
-  private void checkSyncClient(String desc,
-      String msg,
-      boolean throwException,
-      String expectedResult,
-      Class<?> expectedExceptionClass,
-      String expectedExceptionMsg,
-      SyncCall<TAppService01.Iface, String, Boolean, String> call) throws Exception {
-    if (log.isInfoEnabled()) {
-      log.info("start test checkSyncClient::" + desc + ", throwException: " + throwException
-          + ", serverImplementationType: "
-          + serverImplementationType);
+    private static Stream<TestParameters> provideParameters() throws Exception {
+        return Stream.<TestParameters>builder()
+                .add(new TestParameters(ServerImplementationType.SYNC_SERVER))
+                .add(new TestParameters(ServerImplementationType.ASYNC_SERVER))
+                .build();
     }
-    Assert.assertNotEquals(-1, serverPort);
-    try (TTransport clientTransport = new TFramedTransport(new TSocket(new TConfiguration(),
-        "localhost",
-        serverPort,
-        TIMEOUT_MILLIS))) {
-      clientTransport.open();
-      TAppService01.Iface client = new TAppService01.Client(new TBinaryProtocol(clientTransport));
 
-      try {
+    public static class TestParameters {
+        private static final int TIMEOUT_MILLIS = 5_000;
+        private final TServer server;
+        private final Thread serverThread;
+        private final TNonblockingServerSocket serverTransport;
+        private int serverPort;
+        private final ServerImplementationType serverImplementationType;
+        private final CompletableFuture<Void> futureServerStarted = new CompletableFuture<>();
 
-        String result = call.apply(client, msg, throwException);
+        TestParameters(ServerImplementationType serverImplementationType) throws Exception {
+            this.serverImplementationType = serverImplementationType;
+            serverPort = -1;
+            serverImplementationType.service.setCancelled(false);
+            serverTransport = new TNonblockingServerSocket(0);
+            TNonblockingServer.Args args = new TNonblockingServer.Args(serverTransport);
+            args.processor(serverImplementationType.processor);
+            server = new TNonblockingServer(args) {
+                @Override
+                protected void setServing(boolean serving) {
+                    super.setServing(serving);
 
-        if (throwException && expectedExceptionClass != null) {
-          Assert.fail("No exception, but must!!!");
-        } else {
-          // expected
-          Assert.assertEquals(expectedResult, result);
+                    if (serving) {
+                        serverPort = serverTransport.getPort();
+                        futureServerStarted.complete(null);
+                    }
+                }
+
+            };
+            serverThread = new Thread(server::serve, "thrift-server");
+            serverThread.setDaemon(true);
         }
-      } catch (TExampleException | TApplicationException x) {
-        if (log.isInfoEnabled()) {
-          log.info("Exception: " + x, x);
+
+        public AutoCloseable start() throws Exception {
+            serverThread.start();
+            futureServerStarted.get(TIMEOUT_MILLIS, TimeUnit.MILLISECONDS);
+            return () -> {
+                serverImplementationType.service.setCancelled(true);
+                server.stop();
+                serverThread.join(TIMEOUT_MILLIS);
+            };
         }
-        if (throwException) {
-          // expected
-          Assert.assertEquals(expectedExceptionClass, x.getClass());
-          if (expectedExceptionMsg != null) {
-            Assert.assertEquals(expectedExceptionMsg, x.getMessage());
-          }
-        } else {
-          Assert.fail();
-        }
-      }
-    }
-  }
 
-  private <T> void checkAsyncClient(String desc,
-      String msg,
-      boolean throwException,
-      T expectedResult,
-      Class<?> expectedExceptionClass,
-      String expectedExceptionMsg,
-      AsyncCall<TAppService01.AsyncClient, String, Boolean, AsyncMethodCallback<T>> call) throws Throwable {
-    if (log.isInfoEnabled()) {
-      log.info("start test checkAsyncClient::" + desc + ", throwException: " + throwException
-          + ", serverImplementationType: "
-          + serverImplementationType);
-    }
-    Assert.assertNotEquals(serverPort, -1);
-    try (TNonblockingSocket clientTransportAsync = new TNonblockingSocket("localhost", serverPort, TIMEOUT_MILLIS)) {
-      TAsyncClientManager asyncClientManager = new TAsyncClientManager();
-      try {
-        TAppService01.AsyncClient asyncClient = new TAppService01.AsyncClient(new TBinaryProtocol.Factory(),
-            asyncClientManager,
-            clientTransportAsync);
-        asyncClient.setTimeout(TIMEOUT_MILLIS);
-
-        CompletableFuture<T> futureResult = new CompletableFuture<>();
-
-        call.apply(asyncClient, msg, throwException, new AsyncMethodCallback<T>() {
-
-          @Override
-          public void onError(Exception exception) {
-            futureResult.completeExceptionally(exception);
-          }
-
-          @Override
-          public void onComplete(T response) {
-            futureResult.complete(response);
-          }
-
-        });
-
-        try {
-          T result;
-          try {
-            result = futureResult.get(TIMEOUT_MILLIS, TimeUnit.MILLISECONDS);
-          } catch (ExecutionException x) {
-            throw x.getCause();
-          }
-
-          if (throwException && expectedExceptionClass != null) {
-            Assert.fail("No exception, but must!!!");
-          } else {
-            // expected
-            Assert.assertEquals(expectedResult, result);
-          }
-        } catch (TExampleException | TApplicationException x) {
-          if (log.isInfoEnabled()) {
-            log.info("Exception: " + x, x);
-          }
-          if (throwException) {
-            // expected
-            Assert.assertEquals(expectedExceptionClass, x.getClass());
-            if (expectedExceptionMsg != null) {
-              Assert.assertEquals(expectedExceptionMsg, x.getMessage());
+        private void checkSyncClient(String desc,
+                                     String msg,
+                                     boolean throwException,
+                                     String expectedResult,
+                                     Class<? extends Exception> expectedExceptionClass,
+                                     String expectedExceptionMsg,
+                                     SyncCall<TAppService01.Iface, String, Boolean, String> call) throws Exception {
+            if (log.isInfoEnabled()) {
+                log.info("start test checkSyncClient::" + desc + ", throwException: " + throwException
+                        + ", serverImplementationType: "
+                        + serverImplementationType);
             }
-          } else {
-            Assert.fail();
-          }
+            assertNotEquals(-1, serverPort);
+            try (TTransport clientTransport = new TFramedTransport(new TSocket(new TConfiguration(),
+                    "localhost",
+                    serverPort,
+                    TIMEOUT_MILLIS))) {
+                clientTransport.open();
+                TAppService01.Iface client = new TAppService01.Client(new TBinaryProtocol(clientTransport));
+                if (throwException && expectedExceptionClass != null) {
+                    Exception ex = assertThrows(expectedExceptionClass, () -> {
+                        call.apply(client, msg, throwException);
+                    });
+                    assertEquals(expectedExceptionClass, ex.getClass());
+                    if (expectedExceptionMsg != null) {
+                        assertEquals(expectedExceptionMsg, ex.getMessage());
+                    }
+                } else {
+                    // expected
+                    String result = call.apply(client, msg, throwException);
+                    assertEquals(expectedResult, result);
+                }
+            }
         }
-      } finally {
-        asyncClientManager.stop();
-      }
+
+        private <T> void checkAsyncClient(String desc,
+                                          String msg,
+                                          boolean throwException,
+                                          T expectedResult,
+                                          Class<? extends Exception> expectedExceptionClass,
+                                          String expectedExceptionMsg,
+                                          AsyncCall<TAppService01.AsyncClient, String, Boolean, AsyncMethodCallback<T>> call) throws Throwable {
+            if (log.isInfoEnabled()) {
+                log.info("start test checkAsyncClient::" + desc + ", throwException: " + throwException
+                        + ", serverImplementationType: "
+                        + serverImplementationType);
+            }
+            assertNotEquals(serverPort, -1);
+            try (TNonblockingSocket clientTransportAsync = new TNonblockingSocket("localhost", serverPort, TIMEOUT_MILLIS)) {
+                TAsyncClientManager asyncClientManager = new TAsyncClientManager();
+                try {
+                    TAppService01.AsyncClient asyncClient = new TAppService01.AsyncClient(new TBinaryProtocol.Factory(),
+                            asyncClientManager,
+                            clientTransportAsync);
+                    asyncClient.setTimeout(TIMEOUT_MILLIS);
+
+                    CompletableFuture<T> futureResult = new CompletableFuture<>();
+
+                    call.apply(asyncClient, msg, throwException, new AsyncMethodCallback<T>() {
+
+                        @Override
+                        public void onError(Exception exception) {
+                            futureResult.completeExceptionally(exception);
+                        }
+
+                        @Override
+                        public void onComplete(T response) {
+                            futureResult.complete(response);
+                        }
+
+                    });
+                    if (throwException && expectedExceptionClass != null) {
+                        Exception ex = assertThrows(expectedExceptionClass, () -> {
+                            try {
+                                futureResult.get(TIMEOUT_MILLIS, TimeUnit.MILLISECONDS);
+                            } catch (ExecutionException x) {
+                                throw x.getCause();
+                            }
+                        });
+                        assertEquals(expectedExceptionClass, ex.getClass());
+                        if (expectedExceptionMsg != null) {
+                            assertEquals(expectedExceptionMsg, ex.getMessage());
+                        }
+                    } else {
+                        T result;
+                        try {
+                            result = futureResult.get(TIMEOUT_MILLIS, TimeUnit.MILLISECONDS);
+                        } catch (ExecutionException x) {
+                            throw x.getCause();
+                        }
+                        assertEquals(expectedResult, result);
+                    }
+                } finally {
+                    asyncClientManager.stop();
+                }
+            }
+        }
+
+        public TServer getServer() {
+            return server;
+        }
     }
-  }
 
 
-  private enum ServerImplementationType {
-
-    SYNC_SERVER(() -> {
-      ServiceSyncImp service = new ServiceSyncImp();
-      return Pair.of(new TAppService01.Processor<>(service), service);
-    }),
-    ASYNC_SERVER(() -> {
-      ServiceAsyncImp service = new ServiceAsyncImp();
-      return Pair.of(new TAppService01.AsyncProcessor<>(service), service);
-    });
-
-    final TProcessor processor;
-    final ServiceBase service;
-
-    ServerImplementationType(Supplier<Pair<TProcessor, ServiceBase>> supplier) {
-      Pair<TProcessor, ServiceBase> pair = supplier.get();
-      this.processor = pair.getLeft();
-      this.service = pair.getRight();
+    @ParameterizedTest
+    @MethodSource("provideParameters")
+    public void testSyncClientMustReturnResultReturnString(TestParameters p) throws Exception {
+        try (AutoCloseable ignored = p.start()) {
+            p.checkSyncClient("returnString",
+                    "sent msg",
+                    false,
+                    "sent msg",
+                    null,
+                    null,
+                    TAppService01.Iface::returnString);
+        }
     }
-  }
+
+    @ParameterizedTest
+    @MethodSource("provideParameters")
+    public void testSyncClientMustReturnResultReturnVoidThrows(TestParameters p) throws Exception {
+        try (AutoCloseable ignored = p.start()) {
+            p.checkSyncClient("returnVoidThrows",
+                    "sent msg",
+                    false,
+                    null,
+                    null,
+                    null,
+                    (client, msg, throwException) -> {
+                        client.returnVoidThrows(msg, throwException);
+                        return null;
+                    });
+        }
+    }
+
+    @ParameterizedTest
+    @MethodSource("provideParameters")
+    public void testSyncClientMustReturnResultReturnVoidNoThrowsRuntimeException(TestParameters p) throws Exception {
+        try (AutoCloseable ignored = p.start()) {
+            p.checkSyncClient("returnVoidNoThrowsRuntimeException",
+                    "sent msg",
+                    false,
+                    null,
+                    null,
+                    null,
+                    (client, msg, throwException) -> {
+                        client.returnVoidNoThrowsRuntimeException(msg, throwException);
+                        return null;
+                    });
+        }
+    }
+
+    @ParameterizedTest
+    @MethodSource("provideParameters")
+    public void testSyncClientMustReturnResultReturnVoidNoThrowsTApplicationException(TestParameters p) throws Exception {
+        try (AutoCloseable ignored = p.start()) {
+            p.checkSyncClient("returnVoidNoThrowsTApplicationException",
+                    "sent msg",
+                    false,
+                    null,
+                    null,
+                    null,
+                    (client, msg, throwException) -> {
+                        client.returnVoidNoThrowsTApplicationException(msg, throwException);
+                        return null;
+                    });
+        }
+    }
 
 
-  @FunctionalInterface
-  private interface SyncCall<T, U, V, R> {
+    @ParameterizedTest
+    @MethodSource("provideParameters")
+    public void testSyncClientMustThrowExceptionReturnString(TestParameters p) throws Exception {
+        try (AutoCloseable ignored = p.start()) {
+            p.checkSyncClient("returnString",
+                    "sent msg",
+                    true,
+                    null,
+                    TExampleException.class,
+                    "sent msg",
+                    TAppService01.Iface::returnString);
+        }
+    }
 
-    R apply(T t, U u, V v) throws Exception;
+    @ParameterizedTest
+    @MethodSource("provideParameters")
+    public void testSyncClientMustThrowExceptionReturnVoidThrows(TestParameters p) throws Exception {
+        try (AutoCloseable ignored = p.start()) {
+            p.checkSyncClient("returnVoidThrows",
+                    "sent msg",
+                    true,
+                    null,
+                    TExampleException.class,
+                    "sent msg",
+                    (client, msg, throwException) -> {
+                        client.returnVoidThrows(msg, throwException);
+                        return null;
+                    });
+        }
+    }
 
-  }
+    @ParameterizedTest
+    @MethodSource("provideParameters")
+    public void testSyncClientMustThrowExceptionReturnVoidNoThrowsRuntimeException(TestParameters p) throws
+            Exception {
+        try (AutoCloseable ignored = p.start()) {
+            p.checkSyncClient("returnVoidNoThrowsRuntimeException",
+                    "sent msg",
+                    true,
+                    null,
+                    TApplicationException.class,
+                    p.serverImplementationType == ServerImplementationType.ASYNC_SERVER ? "sent msg"
+                            : null, // sync server return "Internal error processing returnVoidNoThrowsRuntimeException" message
+                    (client, msg, throwException) -> {
+                        client.returnVoidNoThrowsRuntimeException(msg, throwException);
+                        return null;
+                    });
+        }
+    }
+
+    @ParameterizedTest
+    @MethodSource("provideParameters")
+    public void testSyncClientMustThrowExceptionReturnVoidNoThrowsTApplicationException(TestParameters p) throws
+            Exception {
+        try (AutoCloseable ignored = p.start()) {
+            p.checkSyncClient("returnVoidNoThrowsTApplicationException",
+                    "sent msg",
+                    true,
+                    null,
+                    TApplicationException.class,
+                    "sent msg",
+                    (client, msg, throwException) -> {
+                        client.returnVoidNoThrowsTApplicationException(msg, throwException);
+                        return null;
+                    });
+        }
+    }
 
 
-  @FunctionalInterface
-  private interface AsyncCall<T, U, V, X> {
+    @ParameterizedTest
+    @MethodSource("provideParameters")
+    public void testAsyncClientMustReturnResultReturnString(TestParameters p) throws Throwable {
+        try (AutoCloseable ignored = p.start()) {
+            p.checkAsyncClient("returnString",
+                    "sent msg",
+                    false,
+                    "sent msg",
+                    null,
+                    null,
+                    TAppService01.AsyncClient::returnString);
+        }
+    }
 
-    void apply(T t, U u, V v, X x) throws Exception;
+    @ParameterizedTest
+    @MethodSource("provideParameters")
+    public void testAsyncClientMustReturnResultReturnVoidThrows(TestParameters p) throws Throwable {
+        try (AutoCloseable ignored = p.start()) {
+            p.checkAsyncClient("returnVoidThrows",
+                    "sent msg",
+                    false,
+                    null,
+                    null,
+                    null,
+                    TAppService01.AsyncClient::returnVoidThrows);
+        }
+    }
 
-  }
+    @ParameterizedTest
+    @MethodSource("provideParameters")
+    public void testAsyncClientMustReturnResultReturnVoidNoThrowsRuntimeException(TestParameters p) throws
+            Throwable {
+        try (AutoCloseable ignored = p.start()) {
+            p.checkAsyncClient("returnVoidNoThrowsRuntimeException",
+                    "sent msg",
+                    false,
+                    null,
+                    null,
+                    null,
+                    TAppService01.AsyncClient::returnVoidNoThrowsRuntimeException);
+        }
+    }
+
+    @ParameterizedTest
+    @MethodSource("provideParameters")
+    public void testAsyncClientMustReturnResultReturnVoidNoThrowsTApplicationException(TestParameters p) throws
+            Throwable {
+        try (AutoCloseable ignored = p.start()) {
+            p.checkAsyncClient("returnVoidNoThrowsTApplicationException",
+                    "sent msg",
+                    false,
+                    null,
+                    null,
+                    null,
+                    TAppService01.AsyncClient::returnVoidNoThrowsTApplicationException);
+        }
+    }
+
+
+    @ParameterizedTest
+    @MethodSource("provideParameters")
+    public void testAsyncClientMustThrowExceptionReturnString(TestParameters p) throws Throwable {
+        try (AutoCloseable ignored = p.start()) {
+            p.checkAsyncClient("returnString",
+                    "sent msg",
+                    true,
+                    null,
+                    TExampleException.class,
+                    "sent msg",
+                    TAppService01.AsyncClient::returnString);
+        }
+    }
+
+    @ParameterizedTest
+    @MethodSource("provideParameters")
+    public void testAsyncClientMustThrowExceptionReturnVoidThrows(TestParameters p) throws Throwable {
+        try (AutoCloseable ignored = p.start()) {
+            p.checkAsyncClient("returnVoidThrows",
+                    "sent msg",
+                    true,
+                    null,
+                    TExampleException.class,
+                    "sent msg",
+                    TAppService01.AsyncClient::returnVoidThrows);
+        }
+    }
+
+    @ParameterizedTest
+    @MethodSource("provideParameters")
+    public void testAsyncClientMustThrowExceptionReturnVoidNoThrowsRuntimeException(TestParameters p) throws
+            Throwable {
+        try (AutoCloseable ignored = p.start()) {
+            p.checkAsyncClient("returnVoidNoThrowsRuntimeException",
+                    "sent msg",
+                    true,
+                    null,
+                    TApplicationException.class,
+                    p.serverImplementationType == ServerImplementationType.ASYNC_SERVER ? "sent msg"
+                            : null, // sync server return "Internal error processing returnVoidNoThrowsRuntimeException" message
+                    TAppService01.AsyncClient::returnVoidNoThrowsRuntimeException);
+        }
+    }
+
+    @ParameterizedTest
+    @MethodSource("provideParameters")
+    public void testAsyncClientMustThrowExceptionReturnVoidNoThrowsTApplicationException(TestParameters p) throws
+            Throwable {
+        try (AutoCloseable ignored = p.start()) {
+            p.checkAsyncClient("returnVoidNoThrowsTApplicationException",
+                    "sent msg",
+                    true,
+                    null,
+                    TApplicationException.class,
+                    "sent msg",
+                    TAppService01.AsyncClient::returnVoidNoThrowsTApplicationException);
+        }
+    }
+
+
+    @ParameterizedTest
+    @MethodSource("provideParameters")
+    public void testSyncClientNoWaitForResultNoExceptionOnewayVoidNoThrows(TestParameters p) throws Exception {
+        try (AutoCloseable ignored = p.start()) {
+            p.checkSyncClient("onewayVoidNoThrows",
+                    "sent msg",
+                    false,
+                    null,
+                    null,
+                    null,
+                    (client, msg, throwException) -> {
+                        client.onewayVoidNoThrows(msg, throwException);
+                        return null;
+                    });
+        }
+    }
+
+    @ParameterizedTest
+    @MethodSource("provideParameters")
+    public void testSyncClientNoWaitForResultExceptionOnewayVoidNoThrows(TestParameters p) throws Exception {
+        try (AutoCloseable ignored = p.start()) {
+            p.checkSyncClient("onewayVoidNoThrows",
+                    "sent msg",
+                    true,
+                    null,
+                    null,
+                    null,
+                    (client, msg, throwException) -> {
+                        client.onewayVoidNoThrows(msg, throwException);
+                        return null;
+                    });
+        }
+    }
+
+    @ParameterizedTest
+    @MethodSource("provideParameters")
+    public void testAsyncClientNoWaitForResultNoExceptionOnewayVoidNoThrows(TestParameters p) throws Throwable {
+        try (AutoCloseable ignored = p.start()) {
+            p.checkAsyncClient("onewayVoidNoThrows",
+                    "sent msg",
+                    false,
+                    null,
+                    null,
+                    null,
+                    TAppService01.AsyncClient::onewayVoidNoThrows);
+        }
+    }
+
+    @ParameterizedTest
+    @MethodSource("provideParameters")
+    public void testAsyncClientNoWaitForResultExceptionOnewayVoidNoThrows(TestParameters p) throws Throwable {
+        try (AutoCloseable ignored = p.start()) {
+            p.checkAsyncClient("onewayVoidNoThrows",
+                    "sent msg",
+                    true,
+                    null,
+                    null,
+                    null,
+                    TAppService01.AsyncClient::onewayVoidNoThrows);
+        }
+    }
+
+
+    private enum ServerImplementationType {
+
+        SYNC_SERVER(() -> {
+            ServiceSyncImp service = new ServiceSyncImp();
+            return Pair.of(new TAppService01.Processor<>(service), service);
+        }),
+        ASYNC_SERVER(() -> {
+            ServiceAsyncImp service = new ServiceAsyncImp();
+            return Pair.of(new TAppService01.AsyncProcessor<>(service), service);
+        });
+
+        final TProcessor processor;
+        final ServiceBase service;
+
+        ServerImplementationType(Supplier<Pair<TProcessor, ServiceBase>> supplier) {
+            Pair<TProcessor, ServiceBase> pair = supplier.get();
+            this.processor = pair.getLeft();
+            this.service = pair.getRight();
+        }
+    }
+
+
+    @FunctionalInterface
+    private interface SyncCall<T, U, V, R> {
+        R apply(T t, U u, V v) throws Exception;
+    }
+
+
+    @FunctionalInterface
+    private interface AsyncCall<T, U, V, X> {
+        void apply(T t, U u, V v, X x) throws Exception;
+    }
 
 }
diff --git a/lib/java/src/test/java/org/apache/thrift/transport/TestAutoExpandingBuffer.java b/lib/java/src/test/java/org/apache/thrift/transport/TestAutoExpandingBuffer.java
index c353489..0b7e4ad 100644
--- a/lib/java/src/test/java/org/apache/thrift/transport/TestAutoExpandingBuffer.java
+++ b/lib/java/src/test/java/org/apache/thrift/transport/TestAutoExpandingBuffer.java
@@ -18,9 +18,14 @@
  */
 package org.apache.thrift.transport;
 
-import junit.framework.TestCase;
+import org.junit.jupiter.api.Test;
 
-public class TestAutoExpandingBuffer extends TestCase {
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+
+public class TestAutoExpandingBuffer  {
+  @Test
   public void testExpands() throws Exception {
     // has expected initial capacity
     AutoExpandingBuffer b = new AutoExpandingBuffer(10);
diff --git a/lib/java/src/test/java/org/apache/thrift/transport/TestAutoExpandingBufferReadTransport.java b/lib/java/src/test/java/org/apache/thrift/transport/TestAutoExpandingBufferReadTransport.java
index b635e60..0901913 100644
--- a/lib/java/src/test/java/org/apache/thrift/transport/TestAutoExpandingBufferReadTransport.java
+++ b/lib/java/src/test/java/org/apache/thrift/transport/TestAutoExpandingBufferReadTransport.java
@@ -18,12 +18,14 @@
  */
 package org.apache.thrift.transport;
 
+import org.apache.thrift.TConfiguration;
+import org.junit.jupiter.api.Test;
+
 import java.nio.ByteBuffer;
 
-import junit.framework.TestCase;
-import org.apache.thrift.TConfiguration;
+import static org.junit.jupiter.api.Assertions.assertEquals;
 
-public class TestAutoExpandingBufferReadTransport extends TestCase {
+public class TestAutoExpandingBufferReadTransport  {
   private static final byte[] HUNDRED_BYTES = new byte[100];
 
   static {
@@ -32,6 +34,7 @@
     }
   }
 
+  @Test
   public void testIt() throws Exception {
     AutoExpandingBufferReadTransport t = new AutoExpandingBufferReadTransport(new TConfiguration(), 150);
 
diff --git a/lib/java/src/test/java/org/apache/thrift/transport/TestAutoExpandingBufferWriteTransport.java b/lib/java/src/test/java/org/apache/thrift/transport/TestAutoExpandingBufferWriteTransport.java
index c3e021c..2424990 100644
--- a/lib/java/src/test/java/org/apache/thrift/transport/TestAutoExpandingBufferWriteTransport.java
+++ b/lib/java/src/test/java/org/apache/thrift/transport/TestAutoExpandingBufferWriteTransport.java
@@ -18,56 +18,59 @@
  */
 package org.apache.thrift.transport;
 
+import org.apache.thrift.TConfiguration;
+import org.junit.jupiter.api.Test;
+
 import java.nio.ByteBuffer;
 
-import org.apache.thrift.TConfiguration;
-import org.junit.Test;
-import static org.junit.Assert.*;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
 public class TestAutoExpandingBufferWriteTransport {
 
-  private TConfiguration config = new TConfiguration();
+    private final TConfiguration config = new TConfiguration();
 
-  @Test
-  public void testIt() throws Exception {
-    AutoExpandingBufferWriteTransport t = new AutoExpandingBufferWriteTransport(config, 1, 0);
-    assertEquals(0, t.getLength());
-    assertEquals(1, t.getBuf().array().length);
-    byte[] b1 = new byte[]{1,2,3};
-    t.write(b1);
-    assertEquals(3, t.getLength());
-    assertTrue(t.getBuf().array().length >= 3);
-    assertEquals(ByteBuffer.wrap(b1), ByteBuffer.wrap(t.getBuf().array(), 0, 3));
+    @Test
+    public void testIt() throws Exception {
+        AutoExpandingBufferWriteTransport t = new AutoExpandingBufferWriteTransport(config, 1, 0);
+        assertEquals(0, t.getLength());
+        assertEquals(1, t.getBuf().array().length);
+        byte[] b1 = new byte[]{1, 2, 3};
+        t.write(b1);
+        assertEquals(3, t.getLength());
+        assertTrue(t.getBuf().array().length >= 3);
+        assertEquals(ByteBuffer.wrap(b1), ByteBuffer.wrap(t.getBuf().array(), 0, 3));
 
-    t.reset();
-    assertEquals(0, t.getLength());
-    assertTrue(t.getBuf().array().length >= 3);
-    byte[] b2 = new byte[]{4,5};
-    t.write(b2);
-    assertEquals(2, t.getLength());
-    assertEquals(ByteBuffer.wrap(b2), ByteBuffer.wrap(t.getBuf().array(), 0, 2));
+        t.reset();
+        assertEquals(0, t.getLength());
+        assertTrue(t.getBuf().array().length >= 3);
+        byte[] b2 = new byte[]{4, 5};
+        t.write(b2);
+        assertEquals(2, t.getLength());
+        assertEquals(ByteBuffer.wrap(b2), ByteBuffer.wrap(t.getBuf().array(), 0, 2));
 
-    AutoExpandingBufferWriteTransport uut = new AutoExpandingBufferWriteTransport(config, 8, 4);
-    assertEquals(4, uut.getLength());
-    assertEquals(8, uut.getBuf().array().length);
-    uut.write(b1);
-    assertEquals(7, uut.getLength());
-    assertEquals(8, uut.getBuf().array().length);
-    assertEquals(ByteBuffer.wrap(b1), ByteBuffer.wrap(uut.getBuf().array(), 4, 3));
-  }
+        AutoExpandingBufferWriteTransport uut = new AutoExpandingBufferWriteTransport(config, 8, 4);
+        assertEquals(4, uut.getLength());
+        assertEquals(8, uut.getBuf().array().length);
+        uut.write(b1);
+        assertEquals(7, uut.getLength());
+        assertEquals(8, uut.getBuf().array().length);
+        assertEquals(ByteBuffer.wrap(b1), ByteBuffer.wrap(uut.getBuf().array(), 4, 3));
+    }
 
-  @Test(expected = IllegalArgumentException.class)
-  public void testBadInitialSize() throws IllegalArgumentException, TTransportException {
-    new AutoExpandingBufferWriteTransport(config, 0, 0);
-  }
+    @Test
+    public void testBadInitialSize() throws TTransportException {
+        assertThrows(IllegalArgumentException.class, () -> new AutoExpandingBufferWriteTransport(config, 0, 0));
+    }
 
-  @Test(expected = IllegalArgumentException.class)
-  public void testBadFrontReserveSize() throws IllegalArgumentException, TTransportException {
-    new AutoExpandingBufferWriteTransport(config, 4, -1);
-  }
+    @Test
+    public void testBadFrontReserveSize() throws IllegalArgumentException, TTransportException {
+        assertThrows(IllegalArgumentException.class, () -> new AutoExpandingBufferWriteTransport(config, 4, -1));
+    }
 
-  @Test(expected = IllegalArgumentException.class)
-  public void testTooSmallFrontReserveSize() throws IllegalArgumentException, TTransportException {
-    new AutoExpandingBufferWriteTransport(config, 4, 5);
-  }
+    @Test
+    public void testTooSmallFrontReserveSize() throws IllegalArgumentException, TTransportException {
+        assertThrows(IllegalArgumentException.class, () -> new AutoExpandingBufferWriteTransport(config, 4, 5));
+    }
 }
diff --git a/lib/java/src/test/java/org/apache/thrift/transport/TestNonblockingServerSocket.java b/lib/java/src/test/java/org/apache/thrift/transport/TestNonblockingServerSocket.java
index 6b28dfd..6bde36c 100644
--- a/lib/java/src/test/java/org/apache/thrift/transport/TestNonblockingServerSocket.java
+++ b/lib/java/src/test/java/org/apache/thrift/transport/TestNonblockingServerSocket.java
@@ -19,18 +19,19 @@
 
 package org.apache.thrift.transport;
 
-import org.junit.Assert;
-import org.junit.Test;
+import org.junit.jupiter.api.Test;
 
 import java.nio.channels.ServerSocketChannel;
 
+import static org.junit.jupiter.api.Assertions.assertFalse;
+
 public class TestNonblockingServerSocket {
 
   @Test
   public void testSocketChannelBlockingMode() throws TTransportException {
     try (TNonblockingServerSocket nonblockingServer = new TNonblockingServerSocket(0)){
       ServerSocketChannel socketChannel = nonblockingServer.getServerSocketChannel();
-      Assert.assertFalse("Socket channel should be nonblocking", socketChannel.isBlocking());
+      assertFalse(socketChannel.isBlocking(), "Socket channel should be nonblocking");
     }
   }
 }
diff --git a/lib/java/src/test/java/org/apache/thrift/transport/TestTByteBuffer.java b/lib/java/src/test/java/org/apache/thrift/transport/TestTByteBuffer.java
index bdc0a84..3397764 100644
--- a/lib/java/src/test/java/org/apache/thrift/transport/TestTByteBuffer.java
+++ b/lib/java/src/test/java/org/apache/thrift/transport/TestTByteBuffer.java
@@ -1,18 +1,22 @@
 package org.apache.thrift.transport;
 
-import junit.framework.TestCase;
-import java.nio.charset.StandardCharsets;
-import org.apache.thrift.TException;
+import org.junit.jupiter.api.Test;
 
 import java.nio.ByteBuffer;
+import java.nio.charset.StandardCharsets;
 
-public class TestTByteBuffer extends TestCase {
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+
+public class TestTByteBuffer  {
+  @Test
   public void testReadWrite() throws Exception {
     final TByteBuffer byteBuffer = new TByteBuffer(ByteBuffer.allocate(16));
     byteBuffer.write("Hello World".getBytes(StandardCharsets.UTF_8));
     assertEquals("Hello World", new String(byteBuffer.flip().toByteArray(), StandardCharsets.UTF_8));
   }
 
+  @Test
   public void testReuseReadWrite() throws Exception {
     final TByteBuffer byteBuffer = new TByteBuffer(ByteBuffer.allocate(16));
     byteBuffer.write("Hello World".getBytes(StandardCharsets.UTF_8));
@@ -24,13 +28,10 @@
     assertEquals("Goodbye Horses", new String(byteBuffer.flip().toByteArray(), StandardCharsets.UTF_8));
   }
 
+  @Test
   public void testOverflow() throws Exception {
     final TByteBuffer byteBuffer = new TByteBuffer(ByteBuffer.allocate(4));
-    try {
-      byteBuffer.write("Hello World".getBytes(StandardCharsets.UTF_8));
-      fail("Expected write operation to fail with TTransportException");
-    } catch (TTransportException e) {
-      assertEquals("Not enough room in output buffer", e.getMessage());
-    }
+    TTransportException e = assertThrows(TTransportException.class, ()-> byteBuffer.write("Hello World".getBytes(StandardCharsets.UTF_8)));
+    assertEquals("Not enough room in output buffer", e.getMessage());
   }
 }
diff --git a/lib/java/src/test/java/org/apache/thrift/transport/TestTFramedTransport.java b/lib/java/src/test/java/org/apache/thrift/transport/TestTFramedTransport.java
index fc3dd5b..0d861bd 100644
--- a/lib/java/src/test/java/org/apache/thrift/transport/TestTFramedTransport.java
+++ b/lib/java/src/test/java/org/apache/thrift/transport/TestTFramedTransport.java
@@ -18,19 +18,25 @@
  */
 package org.apache.thrift.transport;
 
+import org.apache.thrift.transport.layered.TFastFramedTransport;
+import org.apache.thrift.transport.layered.TFramedTransport;
+import org.junit.jupiter.api.Test;
+
 import java.io.BufferedOutputStream;
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.DataInputStream;
 import java.io.DataOutputStream;
 import java.io.IOException;
-import java.util.Arrays;
 
-import junit.framework.TestCase;
-import org.apache.thrift.transport.layered.TFastFramedTransport;
-import org.apache.thrift.transport.layered.TFramedTransport;
+import static org.junit.jupiter.api.Assertions.assertArrayEquals;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
-public class TestTFramedTransport extends TestCase {
+public class TestTFramedTransport {
 
   protected TTransport getTransport(TTransport underlying) throws TTransportException {
     return new TFramedTransport(underlying);
@@ -48,6 +54,7 @@
     return result;
   }
 
+  @Test
   public void testRead() throws IOException, TTransportException {
     ByteArrayOutputStream baos = new ByteArrayOutputStream();
     DataOutputStream dos = new DataOutputStream(baos);
@@ -65,11 +72,11 @@
 
     byte[] readBuf = new byte[10];
     trans.read(readBuf, 0, 10);
-    assertTrue(Arrays.equals(readBuf, byteSequence(0,9)));
+    assertArrayEquals(readBuf, byteSequence(0, 9));
     assertEquals(2, countTrans.readCount);
 
     trans.read(readBuf, 0, 10);
-    assertTrue(Arrays.equals(readBuf, byteSequence(10,19)));
+    assertArrayEquals(readBuf, byteSequence(10, 19));
     assertEquals(2, countTrans.readCount);
 
     assertEquals(30, trans.read(new byte[30], 0, 30));
@@ -78,10 +85,11 @@
     // Known message size exceeded
     readBuf = new byte[220];
     assertEquals(220, trans.read(readBuf, 0, 220));
-    assertTrue(Arrays.equals(readBuf, byteSequence(0, 219)));
+    assertArrayEquals(readBuf, byteSequence(0, 219));
     assertEquals(4, countTrans.readCount);
   }
 
+  @Test
   public void testInvalidFrameSize() throws IOException, TTransportException {
     int maxLength = 128;
 
@@ -97,25 +105,17 @@
     TTransport trans = getTransport(countTrans, maxLength);
 
     byte[] readBuf = new byte[10];
-    try {
-      trans.read(readBuf, 0, 4);
-      fail("Expected a TTransportException");
-    } catch (TTransportException e) {
-      // We expect this exception because the frame we're trying to read is larger than our max frame length
-      assertEquals(TTransportException.CORRUPTED_DATA, e.getType());
-    }
-
+    TTransportException e = assertThrows(TTransportException.class, () -> trans.read(readBuf, 0, 4));
+    // We expect this exception because the frame we're trying to read is larger than our max frame length
+    assertEquals(TTransportException.CORRUPTED_DATA, e.getType());
     assertFalse(trans.isOpen());
 
-    try {
-      trans.read(readBuf, 0, 4);
-      fail("Expected a TTransportException");
-    } catch (TTransportException e) {
-      // This time we get an exception indicating the connection was closed
-      assertEquals(TTransportException.NOT_OPEN, e.getType());
-    }
+    TTransportException e2 = assertThrows(TTransportException.class, () -> trans.read(readBuf, 0, 4));
+    // This time we get an exception indicating the connection was closed
+    assertEquals(TTransportException.NOT_OPEN, e2.getType());
   }
 
+  @Test
   public void testWrite() throws TTransportException, IOException {
     ByteArrayOutputStream baos = new ByteArrayOutputStream();
     WriteCountingTransport countingTrans = new WriteCountingTransport(new TIOStreamTransport(new BufferedOutputStream(baos)));
@@ -138,15 +138,16 @@
     assertEquals(256, din.readInt());
 
     byte[] buf = new byte[256];
-    din.read(buf, 0, 256);
-    assertTrue(Arrays.equals(byteSequence(0,255), buf));
+    int readBytes = din.read(buf, 0, 256);
+    assertArrayEquals(byteSequence(0, 255), buf);
 
     assertEquals(246, din.readInt());
     buf = new byte[246];
-    din.read(buf, 0, 246);
-    assertTrue(Arrays.equals(byteSequence(0,245), buf));
+    int readBytes2 = din.read(buf, 0, 246);
+    assertArrayEquals(byteSequence(0, 245), buf);
   }
 
+  @Test
   public void testDirectRead() throws IOException, TTransportException {
     ByteArrayOutputStream baos = new ByteArrayOutputStream();
     DataOutputStream dos = new DataOutputStream(baos);
@@ -165,7 +166,7 @@
 
     byte[] readBuf = new byte[10];
     trans.read(readBuf, 0, 10);
-    assertTrue(Arrays.equals(readBuf, byteSequence(0,9)));
+    assertArrayEquals(readBuf, byteSequence(0, 9));
 
     assertEquals(40, trans.getBytesRemainingInBuffer());
     assertEquals(10, trans.getBufferPosition());
@@ -183,11 +184,12 @@
     // Known message size exceeded
     trans.read(readBuf, 0, 10);
     assertEquals(4, countTrans.readCount);
-    assertTrue(Arrays.equals(readBuf, byteSequence(125,134)));
+    assertArrayEquals(readBuf, byteSequence(125, 134));
     assertEquals(40, trans.getBytesRemainingInBuffer());
     assertEquals(10, trans.getBufferPosition());
   }
 
+  @Test
   public void testClear() throws IOException, TTransportException {
     ByteArrayOutputStream baos = new ByteArrayOutputStream();
     DataOutputStream dos = new DataOutputStream(baos);
@@ -202,17 +204,17 @@
 
     byte[] readBuf = new byte[220];
     trans.read(readBuf, 0, 220);
-    assertTrue(Arrays.equals(readBuf, byteSequence(0,219)));
+    assertArrayEquals(readBuf, byteSequence(0, 219));
 
     assertTrue(trans instanceof TFramedTransport || trans instanceof TFastFramedTransport);
     if (trans instanceof TFramedTransport) {
       assertTrue(trans.getBuffer() != null && trans.getBuffer().length > 0);
       ((TFramedTransport) trans).clear();
-      assertTrue(trans.getBuffer() == null);
-    } else if (trans instanceof TFastFramedTransport) {
+      assertNull(trans.getBuffer());
+    } else {
       assertTrue(trans.getBuffer().length > TestTFastFramedTransport.INITIAL_CAPACITY);
       ((TFastFramedTransport) trans).clear();
-      assertTrue(trans.getBuffer().length == TestTFastFramedTransport.INITIAL_CAPACITY);
+      assertEquals(TestTFastFramedTransport.INITIAL_CAPACITY, trans.getBuffer().length);
     }
   }
 }
diff --git a/lib/java/src/test/java/org/apache/thrift/transport/TestTIOStreamTransport.java b/lib/java/src/test/java/org/apache/thrift/transport/TestTIOStreamTransport.java
index 5965446..4e66cf5 100644
--- a/lib/java/src/test/java/org/apache/thrift/transport/TestTIOStreamTransport.java
+++ b/lib/java/src/test/java/org/apache/thrift/transport/TestTIOStreamTransport.java
@@ -18,45 +18,50 @@
 
 package org.apache.thrift.transport;
 
+import org.junit.jupiter.api.Test;
+
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.InputStream;
 import java.io.OutputStream;
 
-import junit.framework.TestCase;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
-public class TestTIOStreamTransport extends TestCase {
+public class TestTIOStreamTransport {
+    // THRIFT-5022
+    @Test
+    public void testOpenClose_2streams() throws TTransportException {
+        byte[] dummy = {20}; // So the input stream isn't EOF immediately.
+        InputStream input = new ByteArrayInputStream(dummy);
+        OutputStream output = new ByteArrayOutputStream();
+        TTransport transport = new TIOStreamTransport(input, output);
+        runOpenClose(transport);
+    }
 
-  // THRIFT-5022
-  public void testOpenClose_2streams() throws TTransportException {
-    byte[] dummy = {20}; // So the input stream isn't EOF immediately.
-    InputStream input = new ByteArrayInputStream(dummy);
-    OutputStream output = new ByteArrayOutputStream();
-    TTransport transport = new TIOStreamTransport(input, output);
-    runOpenClose(transport);
-  }
+    // THRIFT-5022
+    @Test
+    public void testOpenClose_1input() throws TTransportException {
+        byte[] dummy = {20};
+        InputStream input = new ByteArrayInputStream(dummy);
+        TTransport transport = new TIOStreamTransport(input);
+        runOpenClose(transport);
+    }
 
-  // THRIFT-5022
-  public void testOpenClose_1input() throws TTransportException {
-    byte[] dummy = {20};
-    InputStream input = new ByteArrayInputStream(dummy);
-    TTransport transport = new TIOStreamTransport(input);
-    runOpenClose(transport);
-  }
+    // THRIFT-5022
+    @Test
+    public void testIOpenClose_1output() throws TTransportException {
+        OutputStream output = new ByteArrayOutputStream();
+        TTransport transport = new TIOStreamTransport(output);
+        runOpenClose(transport);
+    }
 
-  // THRIFT-5022
-  public void testIOpenClose_1output() throws TTransportException {
-    OutputStream output = new ByteArrayOutputStream();
-    TTransport transport = new TIOStreamTransport(output);
-    runOpenClose(transport);
-  }
-
-  private void runOpenClose(TTransport transport) throws TTransportException {
-    transport.open();
-    boolean b1 = transport.isOpen();
-    assertTrue(b1);
-    transport.close();
-    boolean b2 = transport.isOpen();
-    assertFalse(b2);
-  }
+    private void runOpenClose(TTransport transport) throws TTransportException {
+        transport.open();
+        boolean b1 = transport.isOpen();
+        assertTrue(b1);
+        transport.close();
+        boolean b2 = transport.isOpen();
+        assertFalse(b2);
+    }
 }
diff --git a/lib/java/src/test/java/org/apache/thrift/transport/TestTMemoryInputTransport.java b/lib/java/src/test/java/org/apache/thrift/transport/TestTMemoryInputTransport.java
index bd94436..482bb3a 100644
--- a/lib/java/src/test/java/org/apache/thrift/transport/TestTMemoryInputTransport.java
+++ b/lib/java/src/test/java/org/apache/thrift/transport/TestTMemoryInputTransport.java
@@ -18,11 +18,14 @@
  */
 package org.apache.thrift.transport;
 
-import java.util.Arrays;
+import org.junit.jupiter.api.Test;
 
-import junit.framework.TestCase;
+import static org.junit.jupiter.api.Assertions.assertArrayEquals;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertThrows;
 
-public class TestTMemoryInputTransport extends TestCase {
+public class TestTMemoryInputTransport  {
+  @Test
   public void testFresh() throws Exception {
     byte[] input_buf = new byte[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
     TMemoryInputTransport trans = new TMemoryInputTransport(input_buf);
@@ -32,7 +35,7 @@
 
     byte[] buf1 = new byte[4];
     trans.readAll(buf1, 0, 4);
-    assertTrue(Arrays.equals(new byte[]{1, 2, 3, 4}, buf1));
+    assertArrayEquals(new byte[]{1, 2, 3, 4}, buf1);
     assertEquals(4, trans.getBufferPosition());
     assertEquals(6, trans.getBytesRemainingInBuffer());
 
@@ -42,11 +45,12 @@
     assertEquals(4, trans.getBytesRemainingInBuffer());
 
     trans.readAll(buf1, 0, 4);
-    assertTrue(Arrays.equals(new byte[]{7, 8, 9, 10}, buf1));
+    assertArrayEquals(new byte[]{7, 8, 9, 10}, buf1);
     assertEquals(10, trans.getBufferPosition());
     assertEquals(0, trans.getBytesRemainingInBuffer());
   }
 
+  @Test
   public void testReused() throws Exception {
     byte[] input_buf = new byte[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
     TMemoryInputTransport trans = new TMemoryInputTransport(input_buf);
@@ -61,25 +65,25 @@
     assertEquals(3, trans.getBytesRemainingInBuffer());
   }
 
+  @Test
   public void testWithOffsetAndLength() throws TTransportException {
     byte[] input_buf = new byte[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
     TMemoryInputTransport trans = new TMemoryInputTransport(input_buf, 1, 3);
     assertEquals(1, trans.getBufferPosition());
     assertEquals(3, trans.getBytesRemainingInBuffer());
-    byte[] readBuffer = new byte[3];
-    trans.readAll(readBuffer, 0, 3);
-    assertTrue(Arrays.equals(new byte[]{2, 3, 4}, readBuffer));
 
-    try {
-      assertEquals(0, trans.readAll(readBuffer, 0, 3));
-      fail("should have thrown an exception");
-    } catch (Exception e) {
-      // yay
+    {
+      byte[] readBuffer = new byte[3];
+      trans.readAll(readBuffer, 0, 3);
+      assertArrayEquals(new byte[]{2, 3, 4}, readBuffer);
+      assertThrows(Exception.class, () -> trans.readAll(readBuffer, 0, 3));
     }
 
-    trans.reset(input_buf, 3, 4);
-    readBuffer = new byte[4];
-    trans.readAll(readBuffer, 0, 4);
-    assertTrue(Arrays.equals(new byte[]{4, 5, 6, 7}, readBuffer));
+    {
+      trans.reset(input_buf, 3, 4);
+      byte[] readBuffer2 = new byte[4];
+      trans.readAll(readBuffer2, 0, 4);
+      assertArrayEquals(new byte[]{4, 5, 6, 7}, readBuffer2);
+    }
   }
 }
diff --git a/lib/java/src/test/java/org/apache/thrift/transport/TestTMemoryTransport.java b/lib/java/src/test/java/org/apache/thrift/transport/TestTMemoryTransport.java
index 2e20ffe..6d221db 100644
--- a/lib/java/src/test/java/org/apache/thrift/transport/TestTMemoryTransport.java
+++ b/lib/java/src/test/java/org/apache/thrift/transport/TestTMemoryTransport.java
@@ -20,12 +20,15 @@
 package org.apache.thrift.transport;
 
 import org.apache.thrift.TByteArrayOutputStream;
-import org.junit.Assert;
-import org.junit.Test;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.function.Executable;
 
 import java.nio.ByteBuffer;
 import java.util.Random;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+
 public class TestTMemoryTransport {
 
   @Test
@@ -41,14 +44,19 @@
     for (int i = 0; i < inputBytes.length; i++) {
       equal = equal && inputBytes[i] == read[i];
     }
-    Assert.assertEquals(ByteBuffer.wrap(inputBytes), ByteBuffer.wrap(read));
+    assertEquals(ByteBuffer.wrap(inputBytes), ByteBuffer.wrap(read));
   }
 
-  @Test (expected = TTransportException.class)
+  @Test
   public void testReadMoreThanRemaining() throws TTransportException {
     TMemoryTransport transport = new TMemoryTransport(new byte[] {0x00, 0x32});
     byte[] read = new byte[3];
-    transport.read(read, 0, 3);
+    assertThrows(TTransportException.class, new Executable() {
+      @Override
+      public void execute() throws Throwable {
+        transport.read(read, 0, 3);
+      }
+    });
   }
 
   @Test
@@ -60,6 +68,6 @@
     transport.write(output2, 0, 2);
     byte[] expected = {0x72, 0x56, 0x29, (byte) 0xAF, (byte) 0x9B, (byte) 0x83, 0x10};
     TByteArrayOutputStream outputByteArray = transport.getOutput();
-    Assert.assertEquals(ByteBuffer.wrap(expected), ByteBuffer.wrap(outputByteArray.get(), 0, outputByteArray.len()));
+    assertEquals(ByteBuffer.wrap(expected), ByteBuffer.wrap(outputByteArray.get(), 0, outputByteArray.len()));
   }
 }
diff --git a/lib/java/src/test/java/org/apache/thrift/transport/TestTSSLTransportFactory.java b/lib/java/src/test/java/org/apache/thrift/transport/TestTSSLTransportFactory.java
index 032c2eb..b5186c0 100644
--- a/lib/java/src/test/java/org/apache/thrift/transport/TestTSSLTransportFactory.java
+++ b/lib/java/src/test/java/org/apache/thrift/transport/TestTSSLTransportFactory.java
@@ -20,6 +20,7 @@
 package org.apache.thrift.transport;
 
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 
 import org.apache.thrift.TProcessor;
@@ -27,17 +28,35 @@
 import org.apache.thrift.protocol.TProtocolFactory;
 import org.apache.thrift.server.ServerTestBase;
 import org.apache.thrift.server.TServer;
-import org.apache.thrift.server.TSimpleServer;
 import org.apache.thrift.server.TServer.Args;
+import org.apache.thrift.server.TSimpleServer;
 
 public class TestTSSLTransportFactory extends ServerTestBase {
   private Thread serverThread;
   private TServer server;
 
-  private static final List<TProtocolFactory> protocols = new ArrayList<TProtocolFactory>();
-  static {
-    // TODO: Only supported on TBinaryProtocol. Doesn't work for TCompactProtocol
-    protocols.add(new TBinaryProtocol.Factory());
+  // TODO: Only supported on TBinaryProtocol. Doesn't work for TCompactProtocol
+  private static final List<TProtocolFactory> protocols = Collections.singletonList(new TBinaryProtocol.Factory());
+
+  private static final String keyStoreLocation = System.getProperty("javax.net.ssl.keyStore");
+  private static final String keyStorePassword = System.getProperty("javax.net.ssl.keyStorePassword");
+  private static final String trustStoreLocation = System.getProperty("javax.net.ssl.trustStore");
+  private static final String trustStorePassword = System.getProperty("javax.net.ssl.trustStorePassword");
+
+  protected final String getKeyStoreLocation() {
+    return keyStoreLocation;
+  }
+
+  protected final String getKeyStorePassword() {
+    return keyStorePassword;
+  }
+
+  protected final String getTrustStoreLocation() {
+    return trustStoreLocation;
+  }
+
+  protected final String getTrustStorePassword() {
+    return trustStorePassword;
   }
 
   @Override
@@ -45,7 +64,7 @@
   throws Exception {
     return TSSLTransportFactory.getClientSocket(HOST, PORT);
   }
-  
+
   protected TServerSocket getServerTransport() throws Exception {
     return TSSLTransportFactory.getServerSocket(PORT);
   }
@@ -53,19 +72,17 @@
   @Override
   public void startServer(final TProcessor processor, final TProtocolFactory protoFactory, final TTransportFactory factory)
   throws Exception {
-    serverThread = new Thread() {
-      public void run() {
-        try {
-          TServerTransport serverTransport = getServerTransport();
-          final Args args = new Args(serverTransport).processor(processor);
-          server = new TSimpleServer(args);
-          server.serve();
-        } catch (Exception e) {
-          e.printStackTrace();
-          assert false;
-        }
+    serverThread = new Thread(() -> {
+      try {
+        TServerTransport serverTransport = getServerTransport();
+        final Args args = new Args(serverTransport).processor(processor);
+        server = new TSimpleServer(args);
+        server.serve();
+      } catch (Exception e) {
+        e.printStackTrace();
+        assert false;
       }
-    };
+    });
 
     serverThread.start();
     Thread.sleep(SLEEP_DELAY);
diff --git a/lib/java/src/test/java/org/apache/thrift/transport/TestTSSLTransportFactoryCustomClient1.java b/lib/java/src/test/java/org/apache/thrift/transport/TestTSSLTransportFactoryCustomClient1.java
index da1659f..6b543e3 100644
--- a/lib/java/src/test/java/org/apache/thrift/transport/TestTSSLTransportFactoryCustomClient1.java
+++ b/lib/java/src/test/java/org/apache/thrift/transport/TestTSSLTransportFactoryCustomClient1.java
@@ -26,10 +26,7 @@
   throws Exception {
     TSSLTransportFactory.TSSLTransportParameters params = new
       TSSLTransportFactory.TSSLTransportParameters();
-
-    params.setTrustStore(System.getProperty("javax.net.ssl.trustStore"),
-      System.getProperty("javax.net.ssl.trustStorePassword"));
-
+    params.setTrustStore(getTrustStoreLocation(), getTrustStorePassword());
     return TSSLTransportFactory.getClientSocket(HOST, PORT, 0/*timeout*/, params);
   }
 }
diff --git a/lib/java/src/test/java/org/apache/thrift/transport/TestTSSLTransportFactoryCustomClient2.java b/lib/java/src/test/java/org/apache/thrift/transport/TestTSSLTransportFactoryCustomClient2.java
index eaed460..2427b9b 100644
--- a/lib/java/src/test/java/org/apache/thrift/transport/TestTSSLTransportFactoryCustomClient2.java
+++ b/lib/java/src/test/java/org/apache/thrift/transport/TestTSSLTransportFactoryCustomClient2.java
@@ -26,9 +26,7 @@
   throws Exception {
     TSSLTransportFactory.TSSLTransportParameters params = new
       TSSLTransportFactory.TSSLTransportParameters();
-
-    params.setTrustStore(System.getProperty("javax.net.ssl.trustStore"), null);
-
+    params.setTrustStore(getTrustStoreLocation(), null);
     return TSSLTransportFactory.getClientSocket(HOST, PORT, 0/*timeout*/, params);
   }
 }
diff --git a/lib/java/src/test/java/org/apache/thrift/transport/TestTSSLTransportFactoryStreamedStore.java b/lib/java/src/test/java/org/apache/thrift/transport/TestTSSLTransportFactoryStreamedStore.java
index 25bf5ce..cc3cb68 100644
--- a/lib/java/src/test/java/org/apache/thrift/transport/TestTSSLTransportFactoryStreamedStore.java
+++ b/lib/java/src/test/java/org/apache/thrift/transport/TestTSSLTransportFactoryStreamedStore.java
@@ -23,19 +23,6 @@
 import java.net.InetAddress;
 
 public class TestTSSLTransportFactoryStreamedStore extends TestTSSLTransportFactory {
-  private static String keyStoreLocation = System.getProperty("javax.net.ssl.keyStore");
-  private static String trustStoreLocation = System.getProperty("javax.net.ssl.trustStore");
-  
-  public TestTSSLTransportFactoryStreamedStore() {
-    super();
-    
-    /**
-     *  Override system properties to be able to test passing
-     *  the trustStore and keyStore as input stream
-     */
-    System.setProperty("javax.net.ssl.trustStore", "");
-    System.setProperty("javax.net.ssl.keyStore", "");
-  }
 
   @Override
   public TTransport getClientTransport(TTransport underlyingTransport)
@@ -43,9 +30,8 @@
     TSSLTransportFactory.TSSLTransportParameters params = new
       TSSLTransportFactory.TSSLTransportParameters();
 
-    params.setTrustStore(new FileInputStream(trustStoreLocation),
-                         System.getProperty("javax.net.ssl.trustStorePassword"));
-    
+    params.setTrustStore(new FileInputStream(getTrustStoreLocation()), getTrustStorePassword());
+
     return TSSLTransportFactory.getClientSocket(HOST, PORT, 0/*timeout*/, params);
   }
 
@@ -53,10 +39,9 @@
   protected TServerSocket getServerTransport() throws Exception {
     TSSLTransportFactory.TSSLTransportParameters params = new
         TSSLTransportFactory.TSSLTransportParameters();
-    
-    params.setKeyStore(new FileInputStream(keyStoreLocation), 
-                       System.getProperty("javax.net.ssl.keyStorePassword"));
-    
+
+    params.setKeyStore(new FileInputStream(getKeyStoreLocation()), getKeyStorePassword());
+
     return TSSLTransportFactory.getServerSocket(PORT, 0/*timeout*/, InetAddress.getByName(HOST), params);
   }
-}
\ No newline at end of file
+}
diff --git a/lib/java/src/test/java/org/apache/thrift/transport/TestTSaslTransports.java b/lib/java/src/test/java/org/apache/thrift/transport/TestTSaslTransports.java
index d384d7f..7cc5ca6 100644
--- a/lib/java/src/test/java/org/apache/thrift/transport/TestTSaslTransports.java
+++ b/lib/java/src/test/java/org/apache/thrift/transport/TestTSaslTransports.java
@@ -19,10 +19,16 @@
 
 package org.apache.thrift.transport;
 
-import java.io.IOException;
-import java.nio.charset.StandardCharsets;
-import java.util.HashMap;
-import java.util.Map;
+import org.apache.thrift.TConfiguration;
+import org.apache.thrift.TProcessor;
+import org.apache.thrift.protocol.TProtocolFactory;
+import org.apache.thrift.server.ServerTestBase;
+import org.apache.thrift.server.TServer;
+import org.apache.thrift.server.TServer.Args;
+import org.apache.thrift.server.TSimpleServer;
+import org.junit.jupiter.api.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import javax.security.auth.callback.Callback;
 import javax.security.auth.callback.CallbackHandler;
@@ -37,20 +43,19 @@
 import javax.security.sasl.SaslException;
 import javax.security.sasl.SaslServer;
 import javax.security.sasl.SaslServerFactory;
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+import java.util.HashMap;
+import java.util.Map;
 
-import junit.framework.TestCase;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.junit.jupiter.api.Assertions.fail;
 
-import org.apache.thrift.TConfiguration;
-import org.apache.thrift.TProcessor;
-import org.apache.thrift.protocol.TProtocolFactory;
-import org.apache.thrift.server.ServerTestBase;
-import org.apache.thrift.server.TServer;
-import org.apache.thrift.server.TSimpleServer;
-import org.apache.thrift.server.TServer.Args;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class TestTSaslTransports extends TestCase {
+public class TestTSaslTransports  {
 
   private static final Logger LOGGER = LoggerFactory.getLogger(TestTSaslTransports.class);
 
@@ -106,7 +111,7 @@
     }
   }
 
-  private class ServerThread extends Thread {
+  private static class ServerThread extends Thread {
     final String mechanism;
     final Map<String, String> props;
     volatile Throwable thrown;
@@ -125,13 +130,10 @@
     }
 
     private void internalRun() throws Exception {
-      TServerSocket serverSocket = new TServerSocket(
-        new TServerSocket.ServerSocketTransportArgs().
-          port(ServerTestBase.PORT));
-      try {
+      try (TServerSocket serverSocket = new TServerSocket(
+              new TServerSocket.ServerSocketTransportArgs().
+                      port(ServerTestBase.PORT))) {
         acceptAndWrite(serverSocket);
-      } finally {
-        serverSocket.close();
       }
     }
 
@@ -210,14 +212,17 @@
     }
   }
 
+  @Test
   public void testUnwrappedOpen() throws Exception {
     testSaslOpen(UNWRAPPED_MECHANISM, UNWRAPPED_PROPS);
   }
 
+  @Test
   public void testWrappedOpen() throws Exception {
     testSaslOpen(WRAPPED_MECHANISM, WRAPPED_PROPS);
   }
 
+  @Test
   public void testAnonymousOpen() throws Exception {
     testSaslOpen("ANONYMOUS", null);
   }
@@ -226,6 +231,7 @@
    * Test that we get the proper exceptions thrown back the server when
    * the client provides invalid password.
    */
+  @Test
   public void testBadPassword() throws Exception {
     ServerThread serverThread = new ServerThread(UNWRAPPED_MECHANISM, UNWRAPPED_PROPS);
     serverThread.start();
@@ -236,32 +242,23 @@
       // Ah well.
     }
 
-    boolean clientSidePassed = true;
-
-    try {
+    TTransportException tte = assertThrows(TTransportException.class, () -> {
       TSocket clientSocket = new TSocket(HOST, ServerTestBase.PORT);
       TTransport saslClientTransport = new TSaslClientTransport(
-        UNWRAPPED_MECHANISM, PRINCIPAL, SERVICE, HOST, UNWRAPPED_PROPS,
-        new TestSaslCallbackHandler("NOT THE PASSWORD"), clientSocket);
+              UNWRAPPED_MECHANISM, PRINCIPAL, SERVICE, HOST, UNWRAPPED_PROPS,
+              new TestSaslCallbackHandler("NOT THE PASSWORD"), clientSocket);
       saslClientTransport.open();
-      clientSidePassed = false;
-      fail("Was able to open transport with bad password");
-    } catch (TTransportException tte) {
-      LOGGER.error("Exception for bad password", tte);
-      assertNotNull(tte.getMessage());
-      assertTrue(tte.getMessage().contains("Invalid response"));
-
-    } finally {
-      serverThread.interrupt();
-      serverThread.join();
-
-      if (clientSidePassed) {
-        assertNotNull(serverThread.thrown);
-        assertTrue(serverThread.thrown.getMessage().contains("Invalid response"));
-      }
-    }
+    }, "Was able to open transport with bad password");
+    LOGGER.error("Exception for bad password", tte);
+    assertNotNull(tte.getMessage());
+    assertTrue(tte.getMessage().contains("Invalid response"));
+    serverThread.interrupt();
+    serverThread.join();
+    assertNotNull(serverThread.thrown);
+    assertTrue(serverThread.thrown.getMessage().contains("Invalid response"));
   }
 
+  @Test
   public void testWithServer() throws Exception {
     new TestTSaslTransportsWithServer().testIt();
   }
@@ -296,7 +293,7 @@
             server.serve();
           } catch (Exception e) {
             e.printStackTrace();
-            fail();
+            fail(e);
           }
         }
       };
@@ -309,7 +306,9 @@
       server.stop();
       try {
         serverThread.join();
-      } catch (InterruptedException e) {}
+      } catch (InterruptedException e) {
+        LOGGER.debug("interrupted during sleep", e);
+      }
     }
 
   }
@@ -327,8 +326,11 @@
       this.username = username;
     }
 
+    @Override
     public String getMechanismName() { return "ANONYMOUS"; }
+    @Override
     public boolean hasInitialResponse() { return true; }
+    @Override
     public byte[] evaluateChallenge(byte[] challenge) throws SaslException {
       if (hasProvidedInitialResponse) {
         throw new SaslException("Already complete!");
@@ -337,33 +339,46 @@
       hasProvidedInitialResponse = true;
       return username.getBytes(StandardCharsets.UTF_8);
     }
+    @Override
     public boolean isComplete() { return hasProvidedInitialResponse; }
+    @Override
     public byte[] unwrap(byte[] incoming, int offset, int len) {
       throw new UnsupportedOperationException();
     }
+    @Override
     public byte[] wrap(byte[] outgoing, int offset, int len) {
       throw new UnsupportedOperationException();
     }
+    @Override
     public Object getNegotiatedProperty(String propName) { return null; }
+    @Override
     public void dispose() {}
   }
 
   private static class AnonymousServer implements SaslServer {
     private String user;
+    @Override
     public String getMechanismName() { return "ANONYMOUS"; }
+    @Override
     public byte[] evaluateResponse(byte[] response) throws SaslException {
       this.user = new String(response, StandardCharsets.UTF_8);
       return null;
     }
+    @Override
     public boolean isComplete() { return user != null; }
+    @Override
     public String getAuthorizationID() { return user; }
+    @Override
     public byte[] unwrap(byte[] incoming, int offset, int len) {
       throw new UnsupportedOperationException();
     }
+    @Override
     public byte[] wrap(byte[] outgoing, int offset, int len) {
       throw new UnsupportedOperationException();
     }
+    @Override
     public Object getNegotiatedProperty(String propName) { return null; }
+    @Override
     public void dispose() {}
 
   }
@@ -371,6 +386,7 @@
   public static class SaslAnonymousFactory
     implements SaslClientFactory, SaslServerFactory {
 
+    @Override
     public SaslClient createSaslClient(
       String[] mechanisms, String authorizationId, String protocol,
       String serverName, Map<String,?> props, CallbackHandler cbh)
@@ -383,6 +399,7 @@
       return null;
     }
 
+    @Override
     public SaslServer createSaslServer(
       String mechanism, String protocol, String serverName, Map<String,?> props, CallbackHandler cbh)
     {
@@ -391,6 +408,7 @@
       }
       return null;
     }
+    @Override
     public String[] getMechanismNames(Map<String, ?> props) {
       return new String[] { "ANONYMOUS" };
     }
@@ -410,7 +428,7 @@
   private static class MockTTransport extends TTransport {
 
     byte[] badHeader = null;
-    private TMemoryInputTransport readBuffer;
+    private final TMemoryInputTransport readBuffer;
 
     public MockTTransport(int mode) throws TTransportException {
       readBuffer = new TMemoryInputTransport();
@@ -462,6 +480,7 @@
     }
   }
 
+  @Test
   public void testBadHeader() {
     TSaslTransport saslTransport;
     try {
diff --git a/lib/java/src/test/java/org/apache/thrift/transport/TestTSimpleFileTransport.java b/lib/java/src/test/java/org/apache/thrift/transport/TestTSimpleFileTransport.java
index 7b880f4..926b782 100644
--- a/lib/java/src/test/java/org/apache/thrift/transport/TestTSimpleFileTransport.java
+++ b/lib/java/src/test/java/org/apache/thrift/transport/TestTSimpleFileTransport.java
@@ -18,12 +18,17 @@
  */
 package org.apache.thrift.transport;
 
+import org.junit.jupiter.api.Test;
+
 import java.nio.file.Files;
 import java.nio.file.Path;
-import java.util.Arrays;
-import junit.framework.TestCase;
 
-public class TestTSimpleFileTransport extends TestCase {
+import static org.junit.jupiter.api.Assertions.assertArrayEquals;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNull;
+
+public class TestTSimpleFileTransport  {
+  @Test
   public void testFresh() throws Exception {
     //Test write side
     Path tempFilePathName = Files.createTempFile("TSimpleFileTransportTest", null);
@@ -43,31 +48,31 @@
     assert(trans.isOpen());
 
     //Simple file trans provides no buffer access
-    assert(0 == trans.getBufferPosition());
-    assert(null == trans.getBuffer());
-    assert(-1 == trans.getBytesRemainingInBuffer());
+    assertEquals(0, trans.getBufferPosition());
+    assertNull(trans.getBuffer());
+    assertEquals(-1, trans.getBytesRemainingInBuffer());
 
     //Test file pointer operations
-    assert(0 == trans.getFilePointer());
-    assert(12 == trans.length());
+    assertEquals(0, trans.getFilePointer());
+    assertEquals(12, trans.length());
 
     final int BUFSIZ = 4;
     byte[] buf1 = new byte[BUFSIZ];
     trans.readAll(buf1, 0, BUFSIZ);
-    assert(BUFSIZ == trans.getFilePointer());
-    assert(Arrays.equals(new byte[]{1, 2, 3, 4}, buf1));
+    assertEquals(BUFSIZ, trans.getFilePointer());
+    assertArrayEquals(new byte[]{1, 2, 3, 4}, buf1);
 
     int bytesRead = trans.read(buf1, 0, BUFSIZ);
     assert(bytesRead > 0);
     for (int i = 0; i < bytesRead; ++i) {
-      assert(buf1[i] == i+5);
+      assertEquals(buf1[i], i + 5);
     }
 
     trans.seek(0);
-    assert(0 == trans.getFilePointer());
+    assertEquals(0, trans.getFilePointer());
     trans.readAll(buf1, 0, BUFSIZ);
-    assert(Arrays.equals(new byte[]{1, 2, 3, 4}, buf1));
-    assert(BUFSIZ == trans.getFilePointer());
+    assertArrayEquals(new byte[]{1, 2, 3, 4}, buf1);
+    assertEquals(BUFSIZ, trans.getFilePointer());
     trans.close();
     Files.delete(tempFilePathName);
   }
diff --git a/lib/java/src/test/java/org/apache/thrift/transport/TestTZlibTransport.java b/lib/java/src/test/java/org/apache/thrift/transport/TestTZlibTransport.java
index 1b39700..75e917f 100644
--- a/lib/java/src/test/java/org/apache/thrift/transport/TestTZlibTransport.java
+++ b/lib/java/src/test/java/org/apache/thrift/transport/TestTZlibTransport.java
@@ -18,20 +18,22 @@
  */
 package org.apache.thrift.transport;
 
+import org.junit.jupiter.api.Test;
+
 import java.io.BufferedOutputStream;
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.DataInputStream;
 import java.io.DataOutputStream;
 import java.io.IOException;
-import java.util.Arrays;
 import java.util.zip.DataFormatException;
 import java.util.zip.DeflaterOutputStream;
 import java.util.zip.InflaterInputStream;
 
-import junit.framework.TestCase;
+import static org.junit.jupiter.api.Assertions.assertArrayEquals;
+import static org.junit.jupiter.api.Assertions.assertEquals;
 
-public class TestTZlibTransport extends TestCase {
+public class TestTZlibTransport  {
 
   protected TTransport getTransport(TTransport underlying) throws TTransportException {
     return new TZlibTransport(underlying);
@@ -45,6 +47,7 @@
     return result;
   }
 
+  @Test
   public void testClose() throws TTransportException {
     ByteArrayOutputStream baos = new ByteArrayOutputStream();
     WriteCountingTransport countingTrans = new WriteCountingTransport(new TIOStreamTransport(new BufferedOutputStream
@@ -55,6 +58,7 @@
     trans.close();
   }
 
+  @Test
   public void testCloseOpen() throws TTransportException {
     ByteArrayOutputStream baos = new ByteArrayOutputStream();
     TTransport trans = getTransport(new TIOStreamTransport(baos));
@@ -70,6 +74,7 @@
     transRead.close();
   }
 
+  @Test
   public void testRead() throws IOException, TTransportException {
     ByteArrayOutputStream baos = new ByteArrayOutputStream();
     DeflaterOutputStream deflaterOutputStream = new DeflaterOutputStream(baos);
@@ -87,11 +92,11 @@
 
     byte[] readBuf = new byte[10];
     trans.read(readBuf, 0, 10);
-    assertTrue(Arrays.equals(readBuf, byteSequence(0,9)));
+    assertArrayEquals(readBuf, byteSequence(0, 9));
     assertEquals(1, countTrans.readCount);
 
     trans.read(readBuf, 0, 10);
-    assertTrue(Arrays.equals(readBuf, byteSequence(10,19)));
+    assertArrayEquals(readBuf, byteSequence(10, 19));
     assertEquals(1, countTrans.readCount);
 
     assertEquals(30, trans.read(new byte[30], 0, 30));
@@ -99,10 +104,11 @@
 
     readBuf = new byte[220];
     assertEquals(220, trans.read(readBuf, 0, 220));
-    assertTrue(Arrays.equals(readBuf, byteSequence(0, 219)));
+    assertArrayEquals(readBuf, byteSequence(0, 219));
     assertEquals(1, countTrans.readCount);
   }
 
+  @Test
   public void testWrite() throws TTransportException, IOException, DataFormatException {
     ByteArrayOutputStream baos = new ByteArrayOutputStream();
     WriteCountingTransport countingTrans = new WriteCountingTransport(new TIOStreamTransport(new BufferedOutputStream(baos)));
@@ -125,16 +131,16 @@
     byte[] buf = new byte[256];
     int n = din.read(buf, 0, 256);
     assertEquals(n, 256);
-    assertTrue(Arrays.equals(byteSequence(0, 255), buf));
+    assertArrayEquals(byteSequence(0, 255), buf);
 
     buf = new byte[246];
     n = din.read(buf, 0, 246);
     assertEquals(n, 246);
     for (int i = 0; i<buf.length; i++) {
-      assertEquals("for "+i, byteSequence(0,245)[i], buf[i]);
+      assertEquals(byteSequence(0,245)[i], buf[i], "for "+i);
     }
 
-    assertTrue(Arrays.equals(byteSequence(0,245), buf));
+    assertArrayEquals(byteSequence(0, 245), buf);
   }
 
 }
diff --git a/lib/java/src/test/java/org/apache/thrift/transport/sasl/TestDataFrameReader.java b/lib/java/src/test/java/org/apache/thrift/transport/sasl/TestDataFrameReader.java
index 9ae0e1e..4b90cce 100644
--- a/lib/java/src/test/java/org/apache/thrift/transport/sasl/TestDataFrameReader.java
+++ b/lib/java/src/test/java/org/apache/thrift/transport/sasl/TestDataFrameReader.java
@@ -21,11 +21,14 @@
 
 import org.apache.thrift.transport.TMemoryInputTransport;
 import org.apache.thrift.transport.TTransportException;
-import org.junit.Assert;
-import org.junit.Test;
+import org.junit.jupiter.api.Test;
 
 import java.nio.ByteBuffer;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
 public class TestDataFrameReader {
 
   @Test
@@ -43,19 +46,19 @@
     DataFrameReader dataFrameReader = new DataFrameReader();
     // No bytes received.
     dataFrameReader.read(transport);
-    Assert.assertFalse("No bytes received", dataFrameReader.isComplete());
-    Assert.assertFalse("No bytes received", dataFrameReader.getHeader().isComplete());
+    assertFalse(dataFrameReader.isComplete(), "No bytes received");
+    assertFalse(dataFrameReader.getHeader().isComplete(), "No bytes received");
     // Payload size (header) and part of the payload are received.
     transport.reset(buffer.array(), 0, 6);
     dataFrameReader.read(transport);
-    Assert.assertFalse("Only header is complete", dataFrameReader.isComplete());
-    Assert.assertTrue("Header should be complete", dataFrameReader.getHeader().isComplete());
-    Assert.assertEquals("Payload size should be " + payloadSize, payloadSize, dataFrameReader.getHeader().payloadSize());
+    assertFalse(dataFrameReader.isComplete(), "Only header is complete");
+    assertTrue(dataFrameReader.getHeader().isComplete(), "Header should be complete");
+    assertEquals(payloadSize, dataFrameReader.getHeader().payloadSize(), "Payload size should be " + payloadSize);
     // Read the rest of payload.
     transport.reset(buffer.array(), 6, 21);
     dataFrameReader.read(transport);
-    Assert.assertTrue("Reader should be complete", dataFrameReader.isComplete());
+    assertTrue(dataFrameReader.isComplete(), "Reader should be complete");
     buffer.position(DataFrameHeaderReader.PAYLOAD_LENGTH_BYTES);
-    Assert.assertEquals("Payload should be the same as from the transport", buffer, ByteBuffer.wrap(dataFrameReader.getPayload()));
+    assertEquals(buffer, ByteBuffer.wrap(dataFrameReader.getPayload()), "Payload should be the same as from the transport");
   }
 }
diff --git a/lib/java/src/test/java/org/apache/thrift/transport/sasl/TestDataFrameWriter.java b/lib/java/src/test/java/org/apache/thrift/transport/sasl/TestDataFrameWriter.java
index 60fe5c9..b6f4529 100644
--- a/lib/java/src/test/java/org/apache/thrift/transport/sasl/TestDataFrameWriter.java
+++ b/lib/java/src/test/java/org/apache/thrift/transport/sasl/TestDataFrameWriter.java
@@ -19,83 +19,87 @@
 
 package org.apache.thrift.transport.sasl;
 
-import java.io.IOException;
-import java.nio.ByteBuffer;
-
 import org.apache.thrift.EncodingUtils;
 import org.apache.thrift.transport.TNonblockingTransport;
-import org.junit.Assert;
-import org.junit.Test;
+import org.junit.jupiter.api.Test;
 import org.mockito.Mockito;
 import org.mockito.invocation.InvocationOnMock;
 import org.mockito.stubbing.Answer;
 
+import java.nio.ByteBuffer;
+
 import static org.apache.thrift.transport.sasl.DataFrameHeaderReader.PAYLOAD_LENGTH_BYTES;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
 public class TestDataFrameWriter {
 
-  private static final byte[] BYTES = new byte[]{0x32, 0x2A, (byte) 0xE1, 0x18, (byte) 0x90, 0x75};
+    private static final byte[] BYTES = new byte[]{0x32, 0x2A, (byte) 0xE1, 0x18, (byte) 0x90, 0x75};
 
-  @Test
-  public void testProvideEntireByteArrayAsPayload() {
-    DataFrameWriter frameWriter = new DataFrameWriter();
-    frameWriter.withOnlyPayload(BYTES);
-    byte[] expectedBytes = new byte[BYTES.length + PAYLOAD_LENGTH_BYTES];
-    EncodingUtils.encodeBigEndian(BYTES.length, expectedBytes);
-    System.arraycopy(BYTES, 0, expectedBytes, PAYLOAD_LENGTH_BYTES, BYTES.length);
-    Assert.assertEquals(ByteBuffer.wrap(expectedBytes), frameWriter.frameBytes);
-  }
-
-  @Test
-  public void testProvideByteArrayPortionAsPayload() {
-    DataFrameWriter frameWriter = new DataFrameWriter();
-    int portionOffset = 2;
-    int portionLength = 3;
-    frameWriter.withOnlyPayload(BYTES, portionOffset, portionLength);
-    byte[] expectedBytes = new byte[portionLength + PAYLOAD_LENGTH_BYTES];
-    EncodingUtils.encodeBigEndian(portionLength, expectedBytes);
-    System.arraycopy(BYTES, portionOffset, expectedBytes, PAYLOAD_LENGTH_BYTES, portionLength);
-    Assert.assertEquals(ByteBuffer.wrap(expectedBytes), frameWriter.frameBytes);
-  }
-
-  @Test(expected = IllegalArgumentException.class)
-  public void testProvideHeaderAndPayload() {
-    DataFrameWriter frameWriter = new DataFrameWriter();
-    frameWriter.withHeaderAndPayload(new byte[1], new byte[1]);
-  }
-
-  @Test(expected = IllegalStateException.class)
-  public void testProvidePayloadToIncompleteFrame() {
-    DataFrameWriter frameWriter = new DataFrameWriter();
-    frameWriter.withOnlyPayload(BYTES);
-    frameWriter.withOnlyPayload(new byte[1]);
-  }
-
-  @Test
-  public void testWrite() throws Exception {
-    DataFrameWriter frameWriter = new DataFrameWriter();
-    frameWriter.withOnlyPayload(BYTES);
-    // Slow socket which writes one byte per call.
-    TNonblockingTransport transport = Mockito.mock(TNonblockingTransport.class);
-    SlowWriting slowWriting = new SlowWriting();
-    Mockito.when(transport.write(frameWriter.frameBytes)).thenAnswer(slowWriting);
-    frameWriter.write(transport);
-    while (slowWriting.written < frameWriter.frameBytes.limit()) {
-      Assert.assertFalse("Frame writer should not be complete", frameWriter.isComplete());
-      frameWriter.write(transport);
+    @Test
+    public void testProvideEntireByteArrayAsPayload() {
+        DataFrameWriter frameWriter = new DataFrameWriter();
+        frameWriter.withOnlyPayload(BYTES);
+        byte[] expectedBytes = new byte[BYTES.length + PAYLOAD_LENGTH_BYTES];
+        EncodingUtils.encodeBigEndian(BYTES.length, expectedBytes);
+        System.arraycopy(BYTES, 0, expectedBytes, PAYLOAD_LENGTH_BYTES, BYTES.length);
+        assertEquals(ByteBuffer.wrap(expectedBytes), frameWriter.frameBytes);
     }
-    Assert.assertTrue("Frame writer should be complete", frameWriter.isComplete());
-  }
 
-  private static class SlowWriting implements Answer<Integer> {
-    int written = 0;
-
-    @Override
-    public Integer answer(InvocationOnMock invocation) throws Throwable {
-      ByteBuffer bytes = (ByteBuffer) invocation.getArguments()[0];
-      bytes.get();
-      written ++;
-      return 1;
+    @Test
+    public void testProvideByteArrayPortionAsPayload() {
+        DataFrameWriter frameWriter = new DataFrameWriter();
+        int portionOffset = 2;
+        int portionLength = 3;
+        frameWriter.withOnlyPayload(BYTES, portionOffset, portionLength);
+        byte[] expectedBytes = new byte[portionLength + PAYLOAD_LENGTH_BYTES];
+        EncodingUtils.encodeBigEndian(portionLength, expectedBytes);
+        System.arraycopy(BYTES, portionOffset, expectedBytes, PAYLOAD_LENGTH_BYTES, portionLength);
+        assertEquals(ByteBuffer.wrap(expectedBytes), frameWriter.frameBytes);
     }
-  }
+
+    @Test
+    public void testProvideHeaderAndPayload() {
+        DataFrameWriter frameWriter = new DataFrameWriter();
+        assertThrows(IllegalArgumentException.class, () -> frameWriter.withHeaderAndPayload(new byte[1], new byte[1]));
+    }
+
+    @Test
+    public void testProvidePayloadToIncompleteFrame() {
+        DataFrameWriter frameWriter = new DataFrameWriter();
+        assertThrows(IllegalStateException.class, () -> {
+            frameWriter.withOnlyPayload(BYTES);
+            frameWriter.withOnlyPayload(new byte[1]);
+        });
+    }
+
+    @Test
+    public void testWrite() throws Exception {
+        DataFrameWriter frameWriter = new DataFrameWriter();
+        frameWriter.withOnlyPayload(BYTES);
+        // Slow socket which writes one byte per call.
+        TNonblockingTransport transport = Mockito.mock(TNonblockingTransport.class);
+        SlowWriting slowWriting = new SlowWriting();
+        Mockito.when(transport.write(frameWriter.frameBytes)).thenAnswer(slowWriting);
+        frameWriter.write(transport);
+        while (slowWriting.written < frameWriter.frameBytes.limit()) {
+            assertFalse(frameWriter.isComplete(), "Frame writer should not be complete");
+            frameWriter.write(transport);
+        }
+        assertTrue(frameWriter.isComplete(), "Frame writer should be complete");
+    }
+
+    private static class SlowWriting implements Answer<Integer> {
+        int written = 0;
+
+        @Override
+        public Integer answer(InvocationOnMock invocation) throws Throwable {
+            ByteBuffer bytes = (ByteBuffer) invocation.getArguments()[0];
+            bytes.get();
+            written++;
+            return 1;
+        }
+    }
 }
diff --git a/lib/java/src/test/java/org/apache/thrift/transport/sasl/TestSaslNegotiationFrameReader.java b/lib/java/src/test/java/org/apache/thrift/transport/sasl/TestSaslNegotiationFrameReader.java
index f2abbe6..7c4556a 100644
--- a/lib/java/src/test/java/org/apache/thrift/transport/sasl/TestSaslNegotiationFrameReader.java
+++ b/lib/java/src/test/java/org/apache/thrift/transport/sasl/TestSaslNegotiationFrameReader.java
@@ -21,44 +21,50 @@
 
 import org.apache.thrift.transport.TMemoryInputTransport;
 import org.apache.thrift.transport.TTransportException;
-import org.junit.Assert;
-import org.junit.Test;
+import org.junit.jupiter.api.Test;
 
 import java.nio.ByteBuffer;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
 public class TestSaslNegotiationFrameReader {
 
-  @Test
-  public void testRead() throws TTransportException {
-    TMemoryInputTransport transport = new TMemoryInputTransport();
-    SaslNegotiationFrameReader negotiationReader = new SaslNegotiationFrameReader();
-    // No bytes received
-    negotiationReader.read(transport);
-    Assert.assertFalse("No bytes received", negotiationReader.isComplete());
-    Assert.assertFalse("No bytes received", negotiationReader.getHeader().isComplete());
-    // Read header
-    ByteBuffer buffer = ByteBuffer.allocate(5);
-    buffer.put(0, NegotiationStatus.OK.getValue());
-    buffer.putInt(1, 10);
-    transport.reset(buffer.array());
-    negotiationReader.read(transport);
-    Assert.assertFalse("Only header is complete", negotiationReader.isComplete());
-    Assert.assertTrue("Header should be complete", negotiationReader.getHeader().isComplete());
-    Assert.assertEquals("Payload size should be 10", 10, negotiationReader.getHeader().payloadSize());
-    // Read payload
-    transport.reset(new byte[20]);
-    negotiationReader.read(transport);
-    Assert.assertTrue("Reader should be complete", negotiationReader.isComplete());
-    Assert.assertEquals("Payload length should be 10", 10, negotiationReader.getPayload().length);
-  }
+    @Test
+    public void testRead() throws TTransportException {
+        TMemoryInputTransport transport = new TMemoryInputTransport();
+        SaslNegotiationFrameReader negotiationReader = new SaslNegotiationFrameReader();
+        // No bytes received
+        negotiationReader.read(transport);
+        assertFalse(negotiationReader.isComplete(), "No bytes received");
+        assertFalse(negotiationReader.getHeader().isComplete(), "No bytes received");
+        // Read header
+        ByteBuffer buffer = ByteBuffer.allocate(5);
+        buffer.put(0, NegotiationStatus.OK.getValue());
+        buffer.putInt(1, 10);
+        transport.reset(buffer.array());
+        negotiationReader.read(transport);
+        assertFalse(negotiationReader.isComplete(), "Only header is complete");
+        assertTrue(negotiationReader.getHeader().isComplete(), "Header should be complete");
+        assertEquals(10, negotiationReader.getHeader().payloadSize(), "Payload size should be 10");
+        // Read payload
+        transport.reset(new byte[20]);
+        negotiationReader.read(transport);
+        assertTrue(negotiationReader.isComplete(), "Reader should be complete");
+        assertEquals(10, negotiationReader.getPayload().length, "Payload length should be 10");
+    }
 
-  @Test (expected = TSaslNegotiationException.class)
-  public void testReadInvalidNegotiationStatus() throws TTransportException {
-    byte[] bytes = new byte[5];
-    // Invalid status byte.
-    bytes[0] = -1;
-    TMemoryInputTransport transport = new TMemoryInputTransport(bytes);
-    SaslNegotiationFrameReader negotiationReader = new SaslNegotiationFrameReader();
-    negotiationReader.read(transport);
-  }
+    @Test
+    public void testReadInvalidNegotiationStatus() throws TTransportException {
+        byte[] bytes = new byte[5];
+        // Invalid status byte.
+        bytes[0] = -1;
+        TMemoryInputTransport transport = new TMemoryInputTransport(bytes);
+        SaslNegotiationFrameReader negotiationReader = new SaslNegotiationFrameReader();
+        assertThrows(TSaslNegotiationException.class, () -> {
+            negotiationReader.read(transport);
+        });
+    }
 }
diff --git a/lib/java/src/test/java/org/apache/thrift/transport/sasl/TestSaslNegotiationFrameWriter.java b/lib/java/src/test/java/org/apache/thrift/transport/sasl/TestSaslNegotiationFrameWriter.java
index ce7ff29..49110e4 100644
--- a/lib/java/src/test/java/org/apache/thrift/transport/sasl/TestSaslNegotiationFrameWriter.java
+++ b/lib/java/src/test/java/org/apache/thrift/transport/sasl/TestSaslNegotiationFrameWriter.java
@@ -19,38 +19,39 @@
 
 package org.apache.thrift.transport.sasl;
 
+import org.apache.thrift.EncodingUtils;
+import org.junit.jupiter.api.Test;
+
 import java.nio.ByteBuffer;
 
-import org.apache.thrift.EncodingUtils;
-import org.junit.Assert;
-import org.junit.Test;
-
 import static org.apache.thrift.transport.sasl.SaslNegotiationFrameWriter.HEADER_BYTES;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertThrows;
 
 public class TestSaslNegotiationFrameWriter {
 
-  private static final byte[] PAYLOAD = {0x11, 0x08, 0x3F, 0x58, 0x73, 0x22, 0x00, (byte) 0xFF};
+    private static final byte[] PAYLOAD = {0x11, 0x08, 0x3F, 0x58, 0x73, 0x22, 0x00, (byte) 0xFF};
 
-  @Test
-  public void testWithHeaderAndPayload() {
-    SaslNegotiationFrameWriter frameWriter = new SaslNegotiationFrameWriter();
-    frameWriter.withHeaderAndPayload(new byte[] {NegotiationStatus.OK.getValue()}, PAYLOAD);
-    byte[] expectedBytes = new byte[HEADER_BYTES + PAYLOAD.length];
-    expectedBytes[0] = NegotiationStatus.OK.getValue();
-    EncodingUtils.encodeBigEndian(PAYLOAD.length, expectedBytes, 1);
-    System.arraycopy(PAYLOAD, 0, expectedBytes, HEADER_BYTES, PAYLOAD.length);
-    Assert.assertEquals(ByteBuffer.wrap(expectedBytes), frameWriter.frameBytes);
-  }
+    @Test
+    public void testWithHeaderAndPayload() {
+        SaslNegotiationFrameWriter frameWriter = new SaslNegotiationFrameWriter();
+        frameWriter.withHeaderAndPayload(new byte[]{NegotiationStatus.OK.getValue()}, PAYLOAD);
+        byte[] expectedBytes = new byte[HEADER_BYTES + PAYLOAD.length];
+        expectedBytes[0] = NegotiationStatus.OK.getValue();
+        EncodingUtils.encodeBigEndian(PAYLOAD.length, expectedBytes, 1);
+        System.arraycopy(PAYLOAD, 0, expectedBytes, HEADER_BYTES, PAYLOAD.length);
+        assertEquals(ByteBuffer.wrap(expectedBytes), frameWriter.frameBytes);
+    }
 
-  @Test(expected = IllegalArgumentException.class)
-  public void testWithInvalidHeaderLength() {
-    SaslNegotiationFrameWriter frameWriter = new SaslNegotiationFrameWriter();
-    frameWriter.withHeaderAndPayload(new byte[5], 0, 2, PAYLOAD, 0, 1);
-  }
+    @Test
+    public void testWithInvalidHeaderLength() {
+        SaslNegotiationFrameWriter frameWriter = new SaslNegotiationFrameWriter();
+        assertThrows(IllegalArgumentException.class, () -> frameWriter.withHeaderAndPayload(new byte[5], 0, 2, PAYLOAD, 0, 1));
+    }
 
-  @Test(expected = UnsupportedOperationException.class)
-  public void testWithOnlyPayload() {
-    SaslNegotiationFrameWriter frameWriter = new SaslNegotiationFrameWriter();
-    frameWriter.withOnlyPayload(new byte[0]);
-  }
+    @Test
+    public void testWithOnlyPayload() {
+        SaslNegotiationFrameWriter frameWriter = new SaslNegotiationFrameWriter();
+        assertThrows(UnsupportedOperationException.class, () -> frameWriter.withOnlyPayload(new byte[0]));
+    }
 }
diff --git a/lib/java/src/test/java/org/apache/thrift/utils/TestStringUtils.java b/lib/java/src/test/java/org/apache/thrift/utils/TestStringUtils.java
index 3224e77..2728157 100644
--- a/lib/java/src/test/java/org/apache/thrift/utils/TestStringUtils.java
+++ b/lib/java/src/test/java/org/apache/thrift/utils/TestStringUtils.java
@@ -19,41 +19,44 @@
 
 package org.apache.thrift.utils;
 
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertThrows;
 
 public class TestStringUtils {
 
-  @Test
-  public void testToHexString() {
-    byte[] bytes = {0x00, 0x1A, (byte) 0xEF, (byte) 0xAB, (byte) 0x92};
-    Assert.assertEquals("001AEFAB92", StringUtils.bytesToHexString(bytes));
-    Assert.assertEquals("EFAB92", StringUtils.bytesToHexString(bytes, 2, 3));
-    Assert.assertNull(StringUtils.bytesToHexString(null));
-  }
+    @Test
+    public void testToHexString() {
+        byte[] bytes = {0x00, 0x1A, (byte) 0xEF, (byte) 0xAB, (byte) 0x92};
+        assertEquals("001AEFAB92", StringUtils.bytesToHexString(bytes));
+        assertEquals("EFAB92", StringUtils.bytesToHexString(bytes, 2, 3));
+        assertNull(StringUtils.bytesToHexString(null));
+    }
 
 
-  private byte[] bytes;
+    private byte[] bytes;
 
-  @Before
-  public void setUp() throws Exception {
-    bytes = new byte[]{1, 2, 3, 4, 5};
-  }
+    @BeforeEach
+    public void setUp() throws Exception {
+        bytes = new byte[]{1, 2, 3, 4, 5};
+    }
 
-  @Test(expected = IllegalArgumentException.class)
-  public void testNegativeLength() {
-    StringUtils.bytesToHexString(bytes, 0, -1);
-  }
+    @Test
+    public void testNegativeLength() {
+        assertThrows(IllegalArgumentException.class, () -> StringUtils.bytesToHexString(bytes, 0, -1));
+    }
 
-  @Test(expected = IndexOutOfBoundsException.class)
-  public void testNegativeStartOffset() {
-    StringUtils.bytesToHexString(bytes, -1, 1);
-  }
+    @Test
+    public void testNegativeStartOffset() {
+        assertThrows(IndexOutOfBoundsException.class, () -> StringUtils.bytesToHexString(bytes, -1, 1));
+    }
 
-  @Test(expected = IndexOutOfBoundsException.class)
-  public void testInvalidRange() {
-    StringUtils.bytesToHexString(bytes, 5, 1);
-  }
+    @Test
+    public void testInvalidRange() {
+        assertThrows(IndexOutOfBoundsException.class, () -> StringUtils.bytesToHexString(bytes, 5, 1));
+    }
 
 }