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

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


The following commit(s) were added to refs/heads/master by this push:
     new 7c3c34897a Core: Remove usage of AssertHelpers (#7862)
7c3c34897a is described below

commit 7c3c34897a2e452311f085af67d6f546ba56e44e
Author: Liu Xiao <[email protected]>
AuthorDate: Mon Jun 19 21:46:46 2023 +0800

    Core: Remove usage of AssertHelpers (#7862)
---
 .../main/java/org/apache/iceberg/ScanSummary.java  |   2 +-
 .../org/apache/iceberg/TestMetricsTruncation.java  |   9 +-
 .../java/org/apache/iceberg/TestOverwrite.java     |  33 +++---
 .../java/org/apache/iceberg/TestPartitioning.java  |  18 ++--
 .../java/org/apache/iceberg/TestScanSummary.java   |  22 ++--
 .../apache/iceberg/TestSchemaAndMappingUpdate.java |  21 ++--
 .../iceberg/TestSequenceNumberForV2Table.java      |  17 ++-
 .../java/org/apache/iceberg/TestSortOrder.java     |  26 ++---
 .../java/org/apache/iceberg/TestSplitPlanning.java |  50 +++++----
 .../java/org/apache/iceberg/TestTransaction.java   |  61 +++++------
 .../java/org/apache/iceberg/TestWapWorkflow.java   |  79 ++++++--------
 .../apache/iceberg/avro/TestAvroNameMapping.java   |  13 ++-
 .../apache/iceberg/avro/TestReadProjection.java    | 119 +++++++++++----------
 .../iceberg/encryption/TestKeyMetadataParser.java  |  10 +-
 14 files changed, 220 insertions(+), 260 deletions(-)

diff --git a/core/src/main/java/org/apache/iceberg/ScanSummary.java 
b/core/src/main/java/org/apache/iceberg/ScanSummary.java
index 7b8cf22e9a..f975ef1636 100644
--- a/core/src/main/java/org/apache/iceberg/ScanSummary.java
+++ b/core/src/main/java/org/apache/iceberg/ScanSummary.java
@@ -190,7 +190,7 @@ public class ScanSummary {
               "Cannot satisfy time filters: time range may include expired 
snapshots");
         }
 
-        // filter down to the the set of manifest files that were added after 
the start of the
+        // filter down to the set of manifest files that were added after the 
start of the
         // time range. manifests after the end of the time range must be 
included because
         // compaction may create a manifest after the time range that includes 
files added in the
         // range.
diff --git a/core/src/test/java/org/apache/iceberg/TestMetricsTruncation.java 
b/core/src/test/java/org/apache/iceberg/TestMetricsTruncation.java
index e314385f7e..efb7d1da09 100644
--- a/core/src/test/java/org/apache/iceberg/TestMetricsTruncation.java
+++ b/core/src/test/java/org/apache/iceberg/TestMetricsTruncation.java
@@ -27,6 +27,7 @@ import static 
org.apache.iceberg.util.UnicodeUtil.truncateStringMin;
 import java.nio.ByteBuffer;
 import java.util.Comparator;
 import org.apache.iceberg.expressions.Literal;
+import org.assertj.core.api.Assertions;
 import org.junit.Assert;
 import org.junit.Test;
 
@@ -58,11 +59,9 @@ public class TestMetricsTruncation {
     Assert.assertTrue(
         "Truncating should not modify the input buffer",
         original.remaining() == 4 && original.position() == 0);
-    AssertHelpers.assertThrows(
-        "Should not allow a negative truncation length",
-        IllegalArgumentException.class,
-        "length should be non-negative",
-        () -> truncateBinary(original, -1));
+    Assertions.assertThatThrownBy(() -> truncateBinary(original, -1))
+        .isInstanceOf(IllegalArgumentException.class)
+        .hasMessage("Truncate length should be non-negative");
   }
 
   @Test
diff --git a/core/src/test/java/org/apache/iceberg/TestOverwrite.java 
b/core/src/test/java/org/apache/iceberg/TestOverwrite.java
index 4f6a184e9e..e5665d6714 100644
--- a/core/src/test/java/org/apache/iceberg/TestOverwrite.java
+++ b/core/src/test/java/org/apache/iceberg/TestOverwrite.java
@@ -33,6 +33,7 @@ import org.apache.iceberg.ManifestEntry.Status;
 import org.apache.iceberg.exceptions.ValidationException;
 import org.apache.iceberg.relocated.com.google.common.collect.ImmutableMap;
 import org.apache.iceberg.types.Types;
+import org.assertj.core.api.Assertions;
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
@@ -170,11 +171,9 @@ public class TestOverwrite extends TableTestBase {
             .newOverwrite()
             .overwriteByRowFilter(and(equal("date", "2018-06-09"), 
lessThan("id", 9)));
 
-    AssertHelpers.assertThrows(
-        "Should reject commit with file not matching delete expression",
-        ValidationException.class,
-        "Cannot delete file where some, but not all, rows match filter",
-        () -> commit(table, overwrite, branch));
+    Assertions.assertThatThrownBy(() -> commit(table, overwrite, branch))
+        .isInstanceOf(ValidationException.class)
+        .hasMessageStartingWith("Cannot delete file where some, but not all, 
rows match filter");
 
     Assert.assertEquals(
         "Should not create a new snapshot", baseId, latestSnapshot(base, 
branch).snapshotId());
@@ -264,11 +263,9 @@ public class TestOverwrite extends TableTestBase {
             .addFile(FILE_10_TO_14) // in 2018-06-09, NOT in 2018-06-08
             .validateAddedFilesMatchOverwriteFilter();
 
-    AssertHelpers.assertThrows(
-        "Should reject commit with file not matching delete expression",
-        ValidationException.class,
-        "Cannot append file with rows that do not match filter",
-        () -> commit(table, overwrite, branch));
+    Assertions.assertThatThrownBy(() -> commit(table, overwrite, branch))
+        .isInstanceOf(ValidationException.class)
+        .hasMessageStartingWith("Cannot append file with rows that do not 
match filter");
 
     Assert.assertEquals(
         "Should not create a new snapshot", baseId, latestSnapshot(table, 
branch).snapshotId());
@@ -287,11 +284,9 @@ public class TestOverwrite extends TableTestBase {
             .addFile(FILE_10_TO_14) // in 2018-06-09 matches, but IDs are 
outside range
             .validateAddedFilesMatchOverwriteFilter();
 
-    AssertHelpers.assertThrows(
-        "Should reject commit with file not matching delete expression",
-        ValidationException.class,
-        "Cannot append file with rows that do not match filter",
-        () -> commit(table, overwrite, branch));
+    Assertions.assertThatThrownBy(() -> commit(table, overwrite, branch))
+        .isInstanceOf(ValidationException.class)
+        .hasMessageStartingWith("Cannot append file with rows that do not 
match filter");
 
     Assert.assertEquals(
         "Should not create a new snapshot", baseId, latestSnapshot(base, 
branch).snapshotId());
@@ -310,11 +305,9 @@ public class TestOverwrite extends TableTestBase {
             .addFile(FILE_10_TO_14) // in 2018-06-09 matches and IDs are 
inside range
             .validateAddedFilesMatchOverwriteFilter();
 
-    AssertHelpers.assertThrows(
-        "Should reject commit with file not matching delete expression",
-        ValidationException.class,
-        "Cannot append file with rows that do not match filter",
-        () -> commit(table, overwrite, branch));
+    Assertions.assertThatThrownBy(() -> commit(table, overwrite, branch))
+        .isInstanceOf(ValidationException.class)
+        .hasMessageStartingWith("Cannot append file with rows that do not 
match filter");
 
     Assert.assertEquals(
         "Should not create a new snapshot", baseId, latestSnapshot(base, 
branch).snapshotId());
diff --git a/core/src/test/java/org/apache/iceberg/TestPartitioning.java 
b/core/src/test/java/org/apache/iceberg/TestPartitioning.java
index 21558be3da..4de62e3cfe 100644
--- a/core/src/test/java/org/apache/iceberg/TestPartitioning.java
+++ b/core/src/test/java/org/apache/iceberg/TestPartitioning.java
@@ -27,6 +27,7 @@ import org.apache.iceberg.expressions.Expressions;
 import org.apache.iceberg.types.Types;
 import org.apache.iceberg.types.Types.NestedField;
 import org.apache.iceberg.types.Types.StructType;
+import org.assertj.core.api.Assertions;
 import org.junit.After;
 import org.junit.Assert;
 import org.junit.Before;
@@ -167,11 +168,9 @@ public class TestPartitioning {
 
     Assert.assertEquals("Should have 2 specs", 2, table.specs().size());
 
-    AssertHelpers.assertThrows(
-        "Should complain about incompatible specs",
-        ValidationException.class,
-        "Conflicting partition fields",
-        () -> Partitioning.partitionType(table));
+    Assertions.assertThatThrownBy(() -> Partitioning.partitionType(table))
+        .isInstanceOf(ValidationException.class)
+        .hasMessageStartingWith("Conflicting partition fields");
   }
 
   @Test
@@ -380,11 +379,10 @@ public class TestPartitioning {
 
     Assert.assertEquals("Should have 2 specs", 2, table.specs().size());
 
-    AssertHelpers.assertThrows(
-        "Should complain about incompatible specs",
-        ValidationException.class,
-        "Conflicting partition fields",
-        () -> Partitioning.groupingKeyType(table.schema(), 
table.specs().values()));
+    Assertions.assertThatThrownBy(
+            () -> Partitioning.groupingKeyType(table.schema(), 
table.specs().values()))
+        .isInstanceOf(ValidationException.class)
+        .hasMessageStartingWith("Conflicting partition fields");
   }
 
   @Test
diff --git a/core/src/test/java/org/apache/iceberg/TestScanSummary.java 
b/core/src/test/java/org/apache/iceberg/TestScanSummary.java
index 5f54eecc26..5998601661 100644
--- a/core/src/test/java/org/apache/iceberg/TestScanSummary.java
+++ b/core/src/test/java/org/apache/iceberg/TestScanSummary.java
@@ -29,6 +29,7 @@ import static 
org.apache.iceberg.expressions.Expressions.lessThanOrEqual;
 import org.apache.iceberg.relocated.com.google.common.collect.ImmutableList;
 import org.apache.iceberg.relocated.com.google.common.collect.Lists;
 import org.apache.iceberg.util.Pair;
+import org.assertj.core.api.Assertions;
 import org.junit.Assert;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -89,11 +90,9 @@ public class TestScanSummary extends TableTestBase {
             .filter(greaterThanOrEqual("dateCreated", t0))
             .filter(lessThan("dateCreated", t2));
 
-    AssertHelpers.assertThrows(
-        "Should fail summary because range may include expired snapshots",
-        IllegalArgumentException.class,
-        "may include expired snapshots",
-        () -> new ScanSummary.Builder(scan).build());
+    Assertions.assertThatThrownBy(() -> new ScanSummary.Builder(scan).build())
+        .isInstanceOf(IllegalArgumentException.class)
+        .hasMessage("Cannot satisfy time filters: time range may include 
expired snapshots");
   }
 
   @Test
@@ -147,13 +146,12 @@ public class TestScanSummary extends TableTestBase {
             ImmutableList.of(greaterThanOrEqual("ts_ms", lower), 
lessThan("ts_ms", upper))));
 
     // >= lower and < lower is an empty range
-    AssertHelpers.assertThrows(
-        "Should reject empty ranges",
-        IllegalArgumentException.class,
-        "No timestamps can match filters",
-        () ->
-            timestampRange(
-                ImmutableList.of(greaterThanOrEqual("ts_ms", lower), 
lessThan("ts_ms", lower))));
+    Assertions.assertThatThrownBy(
+            () ->
+                timestampRange(
+                    ImmutableList.of(greaterThanOrEqual("ts_ms", lower), 
lessThan("ts_ms", lower))))
+        .isInstanceOf(IllegalArgumentException.class)
+        .hasMessageStartingWith("No timestamps can match filters");
   }
 
   @Test
diff --git 
a/core/src/test/java/org/apache/iceberg/TestSchemaAndMappingUpdate.java 
b/core/src/test/java/org/apache/iceberg/TestSchemaAndMappingUpdate.java
index 7db9ec7fdc..5b8aff686f 100644
--- a/core/src/test/java/org/apache/iceberg/TestSchemaAndMappingUpdate.java
+++ b/core/src/test/java/org/apache/iceberg/TestSchemaAndMappingUpdate.java
@@ -32,6 +32,7 @@ import 
org.apache.iceberg.relocated.com.google.common.collect.ImmutableList;
 import org.apache.iceberg.relocated.com.google.common.collect.Iterables;
 import org.apache.iceberg.relocated.com.google.common.collect.Sets;
 import org.apache.iceberg.types.Types;
+import org.assertj.core.api.Assertions;
 import org.junit.Assert;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -170,16 +171,16 @@ public class TestSchemaAndMappingUpdate extends 
TableTestBase {
         .set("write.metadata.metrics.column.id", "full")
         .commit();
 
-    AssertHelpers.assertThrows(
-        "Creating metrics for non-existent column fails",
-        ValidationException.class,
-        null,
-        () ->
-            table
-                .updateProperties()
-                .set(TableProperties.DEFAULT_NAME_MAPPING, mappingJson)
-                .set("write.metadata.metrics.column.ids", "full")
-                .commit());
+    Assertions.assertThatThrownBy(
+            () ->
+                table
+                    .updateProperties()
+                    .set(TableProperties.DEFAULT_NAME_MAPPING, mappingJson)
+                    .set("write.metadata.metrics.column.ids", "full")
+                    .commit())
+        .isInstanceOf(ValidationException.class)
+        .hasMessageStartingWith(
+            "Invalid metrics config, could not find column ids from table prop 
write.metadata.metrics.column.ids in schema table");
 
     // Re-naming a column with metrics succeeds;
     table.updateSchema().renameColumn("id", "bloop").commit();
diff --git 
a/core/src/test/java/org/apache/iceberg/TestSequenceNumberForV2Table.java 
b/core/src/test/java/org/apache/iceberg/TestSequenceNumberForV2Table.java
index ec6de6230b..08bdc64a08 100644
--- a/core/src/test/java/org/apache/iceberg/TestSequenceNumberForV2Table.java
+++ b/core/src/test/java/org/apache/iceberg/TestSequenceNumberForV2Table.java
@@ -23,6 +23,7 @@ import java.util.stream.Collectors;
 import org.apache.iceberg.ManifestEntry.Status;
 import org.apache.iceberg.exceptions.CommitFailedException;
 import org.apache.iceberg.relocated.com.google.common.collect.Sets;
+import org.assertj.core.api.Assertions;
 import org.junit.Test;
 
 public class TestSequenceNumberForV2Table extends TableTestBase {
@@ -104,11 +105,9 @@ public class TestSequenceNumberForV2Table extends 
TableTestBase {
 
     table.ops().failCommits(1);
 
-    AssertHelpers.assertThrows(
-        "Should reject commit",
-        CommitFailedException.class,
-        "Injected failure",
-        () -> table.newFastAppend().appendFile(FILE_B).commit());
+    Assertions.assertThatThrownBy(() -> 
table.newFastAppend().appendFile(FILE_B).commit())
+        .isInstanceOf(CommitFailedException.class)
+        .hasMessage("Injected failure");
 
     table.updateProperties().set(TableProperties.COMMIT_NUM_RETRIES, 
"5").commit();
 
@@ -352,11 +351,9 @@ public class TestSequenceNumberForV2Table extends 
TableTestBase {
     Transaction txn = table.newTransaction();
     txn.newAppend().appendFile(FILE_C).commit();
 
-    AssertHelpers.assertThrows(
-        "Transaction commit should fail",
-        CommitFailedException.class,
-        "Injected failure",
-        txn::commitTransaction);
+    Assertions.assertThatThrownBy(txn::commitTransaction)
+        .isInstanceOf(CommitFailedException.class)
+        .hasMessage("Injected failure");
 
     V2Assert.assertEquals(
         "Last sequence number should be 1", 1, 
readMetadata().lastSequenceNumber());
diff --git a/core/src/test/java/org/apache/iceberg/TestSortOrder.java 
b/core/src/test/java/org/apache/iceberg/TestSortOrder.java
index 597727c4f9..8fbc4e11fb 100644
--- a/core/src/test/java/org/apache/iceberg/TestSortOrder.java
+++ b/core/src/test/java/org/apache/iceberg/TestSortOrder.java
@@ -100,16 +100,14 @@ public class TestSortOrder {
         SortOrder.unsorted(),
         SortOrder.builderFor(SCHEMA).withOrderId(0).build());
 
-    AssertHelpers.assertThrows(
-        "Should not allow sort orders ID 0",
-        IllegalArgumentException.class,
-        "order ID 0 is reserved for unsorted order",
-        () -> SortOrder.builderFor(SCHEMA).asc("data").withOrderId(0).build());
-    AssertHelpers.assertThrows(
-        "Should not allow unsorted orders with arbitrary IDs",
-        IllegalArgumentException.class,
-        "order ID must be 0",
-        () -> SortOrder.builderFor(SCHEMA).withOrderId(1).build());
+    Assertions.assertThatThrownBy(
+            () -> 
SortOrder.builderFor(SCHEMA).asc("data").withOrderId(0).build())
+        .isInstanceOf(IllegalArgumentException.class)
+        .hasMessage("Sort order ID 0 is reserved for unsorted order");
+
+    Assertions.assertThatThrownBy(() -> 
SortOrder.builderFor(SCHEMA).withOrderId(1).build())
+        .isInstanceOf(IllegalArgumentException.class)
+        .hasMessage("Unsorted order ID must be 0");
   }
 
   @Test
@@ -335,11 +333,9 @@ public class TestSortOrder {
     TestTables.TestTable table =
         TestTables.create(tableDir, "test", SCHEMA, spec, order, 
formatVersion);
 
-    AssertHelpers.assertThrows(
-        "Should reject deletion of sort columns",
-        ValidationException.class,
-        "Cannot find source column",
-        () -> table.updateSchema().deleteColumn("s.id").commit());
+    Assertions.assertThatThrownBy(() -> 
table.updateSchema().deleteColumn("s.id").commit())
+        .isInstanceOf(ValidationException.class)
+        .hasMessageStartingWith("Cannot find source column for sort field");
   }
 
   @Test
diff --git a/core/src/test/java/org/apache/iceberg/TestSplitPlanning.java 
b/core/src/test/java/org/apache/iceberg/TestSplitPlanning.java
index d5d6cd4e41..ab83b27750 100644
--- a/core/src/test/java/org/apache/iceberg/TestSplitPlanning.java
+++ b/core/src/test/java/org/apache/iceberg/TestSplitPlanning.java
@@ -33,6 +33,7 @@ import org.apache.iceberg.io.CloseableIterable;
 import org.apache.iceberg.relocated.com.google.common.collect.Iterables;
 import org.apache.iceberg.relocated.com.google.common.collect.Lists;
 import org.apache.iceberg.types.Types;
+import org.assertj.core.api.Assertions;
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Rule;
@@ -177,32 +178,29 @@ public class TestSplitPlanning extends TableTestBase {
 
   @Test
   public void testSplitPlanningWithNegativeValues() {
-    AssertHelpers.assertThrows(
-        "User provided split size should be validated",
-        IllegalArgumentException.class,
-        "Split size must be > 0: -10",
-        () -> {
-          table.newScan().option(TableProperties.SPLIT_SIZE, 
String.valueOf(-10)).planTasks();
-        });
-
-    AssertHelpers.assertThrows(
-        "User provided split planning lookback should be validated",
-        IllegalArgumentException.class,
-        "Split planning lookback must be > 0: -10",
-        () -> {
-          table.newScan().option(TableProperties.SPLIT_LOOKBACK, 
String.valueOf(-10)).planTasks();
-        });
-
-    AssertHelpers.assertThrows(
-        "User provided split open file cost should be validated",
-        IllegalArgumentException.class,
-        "File open cost must be >= 0: -10",
-        () -> {
-          table
-              .newScan()
-              .option(TableProperties.SPLIT_OPEN_FILE_COST, 
String.valueOf(-10))
-              .planTasks();
-        });
+    Assertions.assertThatThrownBy(
+            () ->
+                table.newScan().option(TableProperties.SPLIT_SIZE, 
String.valueOf(-10)).planTasks())
+        .isInstanceOf(IllegalArgumentException.class)
+        .hasMessage("Split size must be > 0: -10");
+
+    Assertions.assertThatThrownBy(
+            () ->
+                table
+                    .newScan()
+                    .option(TableProperties.SPLIT_LOOKBACK, 
String.valueOf(-10))
+                    .planTasks())
+        .isInstanceOf(IllegalArgumentException.class)
+        .hasMessage("Split planning lookback must be > 0: -10");
+
+    Assertions.assertThatThrownBy(
+            () ->
+                table
+                    .newScan()
+                    .option(TableProperties.SPLIT_OPEN_FILE_COST, 
String.valueOf(-10))
+                    .planTasks())
+        .isInstanceOf(IllegalArgumentException.class)
+        .hasMessage("File open cost must be >= 0: -10");
   }
 
   @Test
diff --git a/core/src/test/java/org/apache/iceberg/TestTransaction.java 
b/core/src/test/java/org/apache/iceberg/TestTransaction.java
index f1c133633d..b76974e244 100644
--- a/core/src/test/java/org/apache/iceberg/TestTransaction.java
+++ b/core/src/test/java/org/apache/iceberg/TestTransaction.java
@@ -216,11 +216,9 @@ public class TestTransaction extends TableTestBase {
         "Base metadata should not change when commit is created", base, 
readMetadata());
     Assert.assertEquals("Table should be on version 0 after txn create", 0, 
(int) version());
 
-    AssertHelpers.assertThrows(
-        "Should reject commit when last operation has not committed",
-        IllegalStateException.class,
-        "Cannot create new DeleteFiles: last operation has not committed",
-        txn::newDelete);
+    Assertions.assertThatThrownBy(txn::newDelete)
+        .isInstanceOf(IllegalStateException.class)
+        .hasMessage("Cannot create new DeleteFiles: last operation has not 
committed");
   }
 
   @Test
@@ -241,11 +239,9 @@ public class TestTransaction extends TableTestBase {
         "Base metadata should not change when commit is created", base, 
readMetadata());
     Assert.assertEquals("Table should be on version 0 after txn create", 0, 
(int) version());
 
-    AssertHelpers.assertThrows(
-        "Should reject commit when last operation has not committed",
-        IllegalStateException.class,
-        "Cannot commit transaction: last operation has not committed",
-        txn::commitTransaction);
+    Assertions.assertThatThrownBy(txn::commitTransaction)
+        .isInstanceOf(IllegalStateException.class)
+        .hasMessage("Cannot commit transaction: last operation has not 
committed");
   }
 
   @Test
@@ -272,11 +268,9 @@ public class TestTransaction extends TableTestBase {
     // cause the transaction commit to fail
     table.ops().failCommits(1);
 
-    AssertHelpers.assertThrows(
-        "Transaction commit should fail",
-        CommitFailedException.class,
-        "Injected failure",
-        txn::commitTransaction);
+    Assertions.assertThatThrownBy(txn::commitTransaction)
+        .isInstanceOf(CommitFailedException.class)
+        .hasMessage("Injected failure");
   }
 
   @Test
@@ -445,11 +439,9 @@ public class TestTransaction extends TableTestBase {
         schemaId);
 
     // commit the transaction for adding "new-column"
-    AssertHelpers.assertThrows(
-        "Should fail due to conflicting transaction even after retry",
-        CommitFailedException.class,
-        "Table metadata refresh is required",
-        txn::commitTransaction);
+    Assertions.assertThatThrownBy(txn::commitTransaction)
+        .isInstanceOf(CommitFailedException.class)
+        .hasMessage("Table metadata refresh is required");
   }
 
   @Test
@@ -664,17 +656,16 @@ public class TestTransaction extends TableTestBase {
 
   @Test
   public void testTransactionNoCustomDeleteFunc() {
-    AssertHelpers.assertThrows(
-        "Should fail setting a custom delete function with a transaction",
-        IllegalArgumentException.class,
-        "Cannot set delete callback more than once",
-        () ->
-            table
-                .newTransaction()
-                .newAppend()
-                .appendFile(FILE_A)
-                .appendFile(FILE_B)
-                .deleteWith(file -> {}));
+    Assertions.assertThatThrownBy(
+            () ->
+                table
+                    .newTransaction()
+                    .newAppend()
+                    .appendFile(FILE_A)
+                    .appendFile(FILE_B)
+                    .deleteWith(file -> {}))
+        .isInstanceOf(IllegalArgumentException.class)
+        .hasMessage("Cannot set delete callback more than once");
   }
 
   @Test
@@ -758,11 +749,9 @@ public class TestTransaction extends TableTestBase {
     Transaction transaction = table.newTransaction();
     transaction.newAppend().appendFile(FILE_A).commit();
 
-    AssertHelpers.assertThrows(
-        "Transaction commit should fail with CommitStateUnknownException",
-        CommitStateUnknownException.class,
-        "datacenter on fire",
-        () -> transaction.commitTransaction());
+    Assertions.assertThatThrownBy(transaction::commitTransaction)
+        .isInstanceOf(CommitStateUnknownException.class)
+        .hasMessageStartingWith("datacenter on fire");
 
     // Make sure metadata files still exist
     Snapshot current = table.currentSnapshot();
diff --git a/core/src/test/java/org/apache/iceberg/TestWapWorkflow.java 
b/core/src/test/java/org/apache/iceberg/TestWapWorkflow.java
index 978027b814..c65d469e32 100644
--- a/core/src/test/java/org/apache/iceberg/TestWapWorkflow.java
+++ b/core/src/test/java/org/apache/iceberg/TestWapWorkflow.java
@@ -23,6 +23,7 @@ import 
org.apache.iceberg.exceptions.DuplicateWAPCommitException;
 import org.apache.iceberg.exceptions.ValidationException;
 import org.apache.iceberg.relocated.com.google.common.collect.Iterables;
 import org.apache.iceberg.relocated.com.google.common.collect.Streams;
+import org.assertj.core.api.Assertions;
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
@@ -86,11 +87,11 @@ public class TestWapWorkflow extends TableTestBase {
             .get();
 
     // try to cherry-pick, which should fail because the overwrite's parent is 
no longer current
-    AssertHelpers.assertThrows(
-        "Should reject overwrite that is not a fast-forward commit",
-        ValidationException.class,
-        "not append, dynamic overwrite, or fast-forward",
-        () -> 
table.manageSnapshots().cherrypick(overwrite.snapshotId()).commit());
+    Assertions.assertThatThrownBy(
+            () -> 
table.manageSnapshots().cherrypick(overwrite.snapshotId()).commit())
+        .isInstanceOf(ValidationException.class)
+        .hasMessage(
+            "Cannot cherry-pick snapshot 2: not append, dynamic overwrite, or 
fast-forward");
 
     // the table state should not have changed
     validateTableFiles(table, FILE_A, FILE_C);
@@ -193,14 +194,11 @@ public class TestWapWorkflow extends TableTestBase {
         "Snapshot log should indicate number of snapshots committed", 1, 
base.snapshotLog().size());
 
     // do rollback
-    AssertHelpers.assertThrows(
-        "should fail on invalid snapshot",
-        ValidationException.class,
-        "Cannot roll back to snapshot, not an ancestor of the current state: 
2",
-        () -> {
-          // rollback to snapshot that is not an ancestor
-          
table.manageSnapshots().rollbackTo(wapSnapshot.snapshotId()).commit();
-        });
+    Assertions.assertThatThrownBy(
+            // rollback to snapshot that is not an ancestor
+            () -> 
table.manageSnapshots().rollbackTo(wapSnapshot.snapshotId()).commit())
+        .isInstanceOf(ValidationException.class)
+        .hasMessage("Cannot roll back to snapshot, not an ancestor of the 
current state: 2");
     base = readMetadata();
 
     Assert.assertEquals(
@@ -652,14 +650,11 @@ public class TestWapWorkflow extends TableTestBase {
     Assert.assertEquals(
         "Snapshot log should indicate number of snapshots committed", 2, 
base.snapshotLog().size());
 
-    AssertHelpers.assertThrows(
-        "should throw exception",
-        CherrypickAncestorCommitException.class,
-        String.format("Cannot cherrypick snapshot %s: already an ancestor", 1),
-        () -> {
-          // duplicate cherry-pick snapshot
-          table.manageSnapshots().cherrypick(firstSnapshotId).commit();
-        });
+    Assertions.assertThatThrownBy(
+            // duplicate cherry-pick snapshot
+            () -> table.manageSnapshots().cherrypick(firstSnapshotId).commit())
+        .isInstanceOf(CherrypickAncestorCommitException.class)
+        .hasMessage("Cannot cherrypick snapshot 1: already an ancestor");
   }
 
   @Test
@@ -710,15 +705,12 @@ public class TestWapWorkflow extends TableTestBase {
     Assert.assertEquals(
         "Snapshot log should indicate number of snapshots committed", 2, 
base.snapshotLog().size());
 
-    AssertHelpers.assertThrows(
-        "should throw exception",
-        DuplicateWAPCommitException.class,
-        String.format(
-            "Duplicate request to cherry pick wap id that was published 
already: %s", 123456789),
-        () -> {
-          // duplicate cherry-pick snapshot
-          
table.manageSnapshots().cherrypick(wapSnapshot2.snapshotId()).commit();
-        });
+    Assertions.assertThatThrownBy(
+            // duplicate cherry-pick snapshot
+            () -> 
table.manageSnapshots().cherrypick(wapSnapshot2.snapshotId()).commit())
+        .isInstanceOf(DuplicateWAPCommitException.class)
+        .hasMessage(
+            "Duplicate request to cherry pick wap id that was published 
already: 123456789");
   }
 
   @Test
@@ -762,23 +754,18 @@ public class TestWapWorkflow extends TableTestBase {
         table.currentSnapshot().snapshotId());
 
     // try double cherrypicking of the third snapshot
-    AssertHelpers.assertThrows(
-        "should not allow cherrypicking ancestor",
-        CherrypickAncestorCommitException.class,
-        String.format("Cannot cherrypick snapshot %s: already an ancestor", 3),
-        () -> {
-          // double cherrypicking of second snapshot
-          table.manageSnapshots().cherrypick(thirdSnapshotId).commit();
-        });
+    Assertions.assertThatThrownBy(
+            // double cherrypicking of second snapshot
+            () -> table.manageSnapshots().cherrypick(thirdSnapshotId).commit())
+        .isInstanceOf(CherrypickAncestorCommitException.class)
+        .hasMessage("Cannot cherrypick snapshot 3: already an ancestor");
 
     // try cherrypicking an ancestor
-    AssertHelpers.assertThrows(
-        "should not allow double cherrypick",
-        CherrypickAncestorCommitException.class,
-        String.format("Cannot cherrypick snapshot %s: already an ancestor", 
firstSnapshotId),
-        () -> {
-          // double cherrypicking of second snapshot
-          table.manageSnapshots().cherrypick(firstSnapshotId).commit();
-        });
+    Assertions.assertThatThrownBy(
+            // double cherrypicking of second snapshot
+            () -> table.manageSnapshots().cherrypick(firstSnapshotId).commit())
+        .isInstanceOf(CherrypickAncestorCommitException.class)
+        .hasMessage(
+            String.format("Cannot cherrypick snapshot %s: already an 
ancestor", firstSnapshotId));
   }
 }
diff --git 
a/core/src/test/java/org/apache/iceberg/avro/TestAvroNameMapping.java 
b/core/src/test/java/org/apache/iceberg/avro/TestAvroNameMapping.java
index c6bdb88b7d..2efb5c8f9a 100644
--- a/core/src/test/java/org/apache/iceberg/avro/TestAvroNameMapping.java
+++ b/core/src/test/java/org/apache/iceberg/avro/TestAvroNameMapping.java
@@ -28,7 +28,6 @@ import org.apache.avro.file.DataFileWriter;
 import org.apache.avro.generic.GenericData;
 import org.apache.avro.generic.GenericDatumWriter;
 import org.apache.avro.io.DatumWriter;
-import org.apache.iceberg.AssertHelpers;
 import org.apache.iceberg.Files;
 import org.apache.iceberg.Schema;
 import org.apache.iceberg.mapping.MappedField;
@@ -41,6 +40,7 @@ import 
org.apache.iceberg.relocated.com.google.common.collect.Iterables;
 import org.apache.iceberg.relocated.com.google.common.collect.Lists;
 import org.apache.iceberg.types.Comparators;
 import org.apache.iceberg.types.Types;
+import org.assertj.core.api.Assertions;
 import org.junit.Assert;
 import org.junit.Test;
 
@@ -202,12 +202,11 @@ public class TestAvroNameMapping extends 
TestAvroReadProjection {
             new Schema(Types.NestedField.optional(18, "y", 
Types.IntegerType.get())));
 
     Schema readSchema = writeSchema;
-    AssertHelpers.assertThrows(
-        "Missing required field in nameMapping",
-        IllegalArgumentException.class,
-        "Missing required field: x",
-        // In this case, pruneColumns result is an empty record
-        () -> writeAndRead(writeSchema, readSchema, record, nameMapping));
+    Assertions.assertThatThrownBy(
+            // In this case, pruneColumns result is an empty record
+            () -> writeAndRead(writeSchema, readSchema, record, nameMapping))
+        .isInstanceOf(IllegalArgumentException.class)
+        .hasMessage("Missing required field: x");
   }
 
   @Test
diff --git a/core/src/test/java/org/apache/iceberg/avro/TestReadProjection.java 
b/core/src/test/java/org/apache/iceberg/avro/TestReadProjection.java
index 8c8e7b24d5..b6b6c2c967 100644
--- a/core/src/test/java/org/apache/iceberg/avro/TestReadProjection.java
+++ b/core/src/test/java/org/apache/iceberg/avro/TestReadProjection.java
@@ -21,8 +21,9 @@ package org.apache.iceberg.avro;
 import java.io.IOException;
 import java.util.List;
 import java.util.Map;
+import org.apache.avro.AvroRuntimeException;
 import org.apache.avro.generic.GenericData.Record;
-import org.apache.iceberg.AssertHelpers;
+import org.apache.avro.generic.GenericRecord;
 import org.apache.iceberg.Schema;
 import org.apache.iceberg.relocated.com.google.common.collect.ImmutableList;
 import org.apache.iceberg.relocated.com.google.common.collect.ImmutableMap;
@@ -140,14 +141,14 @@ public abstract class TestReadProjection {
     Schema idOnly = new Schema(Types.NestedField.required(0, "id", 
Types.LongType.get()));
 
     Record projected = writeAndRead("basic_projection_id", writeSchema, 
idOnly, record);
-    AssertHelpers.assertEmptyAvroField(projected, "data");
+    assertEmptyAvroField(projected, "data");
     Assert.assertEquals("Should contain the correct id value", 34L, (long) 
projected.get("id"));
 
     Schema dataOnly = new Schema(Types.NestedField.optional(1, "data", 
Types.StringType.get()));
 
     projected = writeAndRead("basic_projection_data", writeSchema, dataOnly, 
record);
 
-    AssertHelpers.assertEmptyAvroField(projected, "id");
+    assertEmptyAvroField(projected, "id");
     int cmp = Comparators.charSequences().compare("test", (CharSequence) 
projected.get("data"));
     Assert.assertEquals("Should contain the correct data value", 0, cmp);
   }
@@ -198,7 +199,7 @@ public abstract class TestReadProjection {
     Schema idOnly = new Schema(Types.NestedField.required(0, "id", 
Types.LongType.get()));
 
     Record projected = writeAndRead("id_only", writeSchema, idOnly, record);
-    AssertHelpers.assertEmptyAvroField(projected, "location");
+    assertEmptyAvroField(projected, "location");
     Assert.assertEquals("Should contain the correct id value", 34L, (long) 
projected.get("id"));
 
     Schema latOnly =
@@ -210,9 +211,9 @@ public abstract class TestReadProjection {
 
     projected = writeAndRead("latitude_only", writeSchema, latOnly, record);
     Record projectedLocation = (Record) projected.get("location");
-    AssertHelpers.assertEmptyAvroField(projected, "id");
+    assertEmptyAvroField(projected, "id");
     Assert.assertNotNull("Should project location", projected.get("location"));
-    AssertHelpers.assertEmptyAvroField(projectedLocation, "long");
+    assertEmptyAvroField(projectedLocation, "long");
     Assert.assertEquals(
         "Should project latitude", 52.995143f, (float) 
projectedLocation.get("lat"), 0.000001f);
 
@@ -225,16 +226,16 @@ public abstract class TestReadProjection {
 
     projected = writeAndRead("longitude_only", writeSchema, longOnly, record);
     projectedLocation = (Record) projected.get("location");
-    AssertHelpers.assertEmptyAvroField(projected, "id");
+    assertEmptyAvroField(projected, "id");
     Assert.assertNotNull("Should project location", projected.get("location"));
-    AssertHelpers.assertEmptyAvroField(projectedLocation, "lat");
+    assertEmptyAvroField(projectedLocation, "lat");
     Assert.assertEquals(
         "Should project longitude", -1.539054f, (float) 
projectedLocation.get("long"), 0.000001f);
 
     Schema locationOnly = writeSchema.select("location");
     projected = writeAndRead("location_only", writeSchema, locationOnly, 
record);
     projectedLocation = (Record) projected.get("location");
-    AssertHelpers.assertEmptyAvroField(projected, "id");
+    assertEmptyAvroField(projected, "id");
     Assert.assertNotNull("Should project location", projected.get("location"));
     Assert.assertEquals(
         "Should project latitude", 52.995143f, (float) 
projectedLocation.get("lat"), 0.000001f);
@@ -262,23 +263,23 @@ public abstract class TestReadProjection {
 
     Record projected = writeAndRead("id_only", writeSchema, idOnly, record);
     Assert.assertEquals("Should contain the correct id value", 34L, (long) 
projected.get("id"));
-    AssertHelpers.assertEmptyAvroField(projected, "properties");
+    assertEmptyAvroField(projected, "properties");
 
     Schema keyOnly = writeSchema.select("properties.key");
     projected = writeAndRead("key_only", writeSchema, keyOnly, record);
-    AssertHelpers.assertEmptyAvroField(projected, "id");
+    assertEmptyAvroField(projected, "id");
     Assert.assertEquals(
         "Should project entire map", properties, toStringMap((Map) 
projected.get("properties")));
 
     Schema valueOnly = writeSchema.select("properties.value");
     projected = writeAndRead("value_only", writeSchema, valueOnly, record);
-    AssertHelpers.assertEmptyAvroField(projected, "id");
+    assertEmptyAvroField(projected, "id");
     Assert.assertEquals(
         "Should project entire map", properties, toStringMap((Map) 
projected.get("properties")));
 
     Schema mapOnly = writeSchema.select("properties");
     projected = writeAndRead("map_only", writeSchema, mapOnly, record);
-    AssertHelpers.assertEmptyAvroField(projected, "id");
+    assertEmptyAvroField(projected, "id");
     Assert.assertEquals(
         "Should project entire map", properties, toStringMap((Map) 
projected.get("properties")));
   }
@@ -329,17 +330,17 @@ public abstract class TestReadProjection {
 
     Record projected = writeAndRead("id_only", writeSchema, idOnly, record);
     Assert.assertEquals("Should contain the correct id value", 34L, (long) 
projected.get("id"));
-    AssertHelpers.assertEmptyAvroField(projected, "locations");
+    assertEmptyAvroField(projected, "locations");
 
     projected = writeAndRead("all_locations", writeSchema, 
writeSchema.select("locations"), record);
-    AssertHelpers.assertEmptyAvroField(projected, "id");
+    assertEmptyAvroField(projected, "id");
     Assert.assertEquals(
         "Should project locations map",
         record.get("locations"),
         toStringMap((Map) projected.get("locations")));
 
     projected = writeAndRead("lat_only", writeSchema, 
writeSchema.select("locations.lat"), record);
-    AssertHelpers.assertEmptyAvroField(projected, "id");
+    assertEmptyAvroField(projected, "id");
     Map<String, ?> locations = toStringMap((Map) projected.get("locations"));
     Assert.assertNotNull("Should project locations map", locations);
     Assert.assertEquals(
@@ -348,28 +349,28 @@ public abstract class TestReadProjection {
     Assert.assertNotNull("L1 should not be null", projectedL1);
     Assert.assertEquals(
         "L1 should contain lat", 53.992811f, (float) projectedL1.get("lat"), 
0.000001);
-    AssertHelpers.assertEmptyAvroField(projectedL1, "long");
+    assertEmptyAvroField(projectedL1, "long");
     Record projectedL2 = (Record) locations.get("L2");
     Assert.assertNotNull("L2 should not be null", projectedL2);
     Assert.assertEquals(
         "L2 should contain lat", 52.995143f, (float) projectedL2.get("lat"), 
0.000001);
-    AssertHelpers.assertEmptyAvroField(projectedL2, "y");
+    assertEmptyAvroField(projectedL2, "y");
 
     projected =
         writeAndRead("long_only", writeSchema, 
writeSchema.select("locations.long"), record);
-    AssertHelpers.assertEmptyAvroField(projected, "id");
+    assertEmptyAvroField(projected, "id");
     locations = toStringMap((Map) projected.get("locations"));
     Assert.assertNotNull("Should project locations map", locations);
     Assert.assertEquals(
         "Should contain L1 and L2", Sets.newHashSet("L1", "L2"), 
locations.keySet());
     projectedL1 = (Record) locations.get("L1");
     Assert.assertNotNull("L1 should not be null", projectedL1);
-    AssertHelpers.assertEmptyAvroField(projectedL1, "lat");
+    assertEmptyAvroField(projectedL1, "lat");
     Assert.assertEquals(
         "L1 should contain long", -1.542616f, (float) projectedL1.get("long"), 
0.000001);
     projectedL2 = (Record) locations.get("L2");
     Assert.assertNotNull("L2 should not be null", projectedL2);
-    AssertHelpers.assertEmptyAvroField(projectedL2, "lat");
+    assertEmptyAvroField(projectedL2, "lat");
     Assert.assertEquals(
         "L2 should contain long", -1.539054f, (float) projectedL2.get("long"), 
0.000001);
 
@@ -386,7 +387,7 @@ public abstract class TestReadProjection {
                         Types.NestedField.required(1, "latitude", 
Types.FloatType.get())))));
 
     projected = writeAndRead("latitude_renamed", writeSchema, 
latitiudeRenamed, record);
-    AssertHelpers.assertEmptyAvroField(projected, "id");
+    assertEmptyAvroField(projected, "id");
     locations = toStringMap((Map) projected.get("locations"));
     Assert.assertNotNull("Should project locations map", locations);
     Assert.assertEquals(
@@ -395,14 +396,14 @@ public abstract class TestReadProjection {
     Assert.assertNotNull("L1 should not be null", projectedL1);
     Assert.assertEquals(
         "L1 should contain latitude", 53.992811f, (float) 
projectedL1.get("latitude"), 0.000001);
-    AssertHelpers.assertEmptyAvroField(projectedL1, "lat");
-    AssertHelpers.assertEmptyAvroField(projectedL1, "long");
+    assertEmptyAvroField(projectedL1, "lat");
+    assertEmptyAvroField(projectedL1, "long");
     projectedL2 = (Record) locations.get("L2");
     Assert.assertNotNull("L2 should not be null", projectedL2);
     Assert.assertEquals(
         "L2 should contain latitude", 52.995143f, (float) 
projectedL2.get("latitude"), 0.000001);
-    AssertHelpers.assertEmptyAvroField(projectedL2, "lat");
-    AssertHelpers.assertEmptyAvroField(projectedL2, "long");
+    assertEmptyAvroField(projectedL2, "lat");
+    assertEmptyAvroField(projectedL2, "long");
   }
 
   @Test
@@ -423,16 +424,16 @@ public abstract class TestReadProjection {
 
     Record projected = writeAndRead("id_only", writeSchema, idOnly, record);
     Assert.assertEquals("Should contain the correct id value", 34L, (long) 
projected.get("id"));
-    AssertHelpers.assertEmptyAvroField(projected, "values");
+    assertEmptyAvroField(projected, "values");
 
     Schema elementOnly = writeSchema.select("values.element");
     projected = writeAndRead("element_only", writeSchema, elementOnly, record);
-    AssertHelpers.assertEmptyAvroField(projected, "id");
+    assertEmptyAvroField(projected, "id");
     Assert.assertEquals("Should project entire list", values, 
projected.get("values"));
 
     Schema listOnly = writeSchema.select("values");
     projected = writeAndRead("list_only", writeSchema, listOnly, record);
-    AssertHelpers.assertEmptyAvroField(projected, "id");
+    assertEmptyAvroField(projected, "id");
     Assert.assertEquals("Should project entire list", values, 
projected.get("values"));
   }
 
@@ -469,35 +470,35 @@ public abstract class TestReadProjection {
 
     Record projected = writeAndRead("id_only", writeSchema, idOnly, record);
     Assert.assertEquals("Should contain the correct id value", 34L, (long) 
projected.get("id"));
-    AssertHelpers.assertEmptyAvroField(projected, "points");
+    assertEmptyAvroField(projected, "points");
 
     projected = writeAndRead("all_points", writeSchema, 
writeSchema.select("points"), record);
-    AssertHelpers.assertEmptyAvroField(projected, "id");
+    assertEmptyAvroField(projected, "id");
     Assert.assertEquals(
         "Should project points list", record.get("points"), 
projected.get("points"));
 
     projected = writeAndRead("x_only", writeSchema, 
writeSchema.select("points.x"), record);
-    AssertHelpers.assertEmptyAvroField(projected, "id");
+    assertEmptyAvroField(projected, "id");
     Assert.assertNotNull("Should project points list", 
projected.get("points"));
     List<Record> points = (List<Record>) projected.get("points");
     Assert.assertEquals("Should read 2 points", 2, points.size());
     Record projectedP1 = points.get(0);
     Assert.assertEquals("Should project x", 1, (int) projectedP1.get("x"));
-    AssertHelpers.assertEmptyAvroField(projectedP1, "y");
+    assertEmptyAvroField(projectedP1, "y");
     Record projectedP2 = points.get(1);
     Assert.assertEquals("Should project x", 3, (int) projectedP2.get("x"));
-    AssertHelpers.assertEmptyAvroField(projectedP2, "y");
+    assertEmptyAvroField(projectedP2, "y");
 
     projected = writeAndRead("y_only", writeSchema, 
writeSchema.select("points.y"), record);
-    AssertHelpers.assertEmptyAvroField(projected, "id");
+    assertEmptyAvroField(projected, "id");
     Assert.assertNotNull("Should project points list", 
projected.get("points"));
     points = (List<Record>) projected.get("points");
     Assert.assertEquals("Should read 2 points", 2, points.size());
     projectedP1 = points.get(0);
-    AssertHelpers.assertEmptyAvroField(projectedP1, "x");
+    assertEmptyAvroField(projectedP1, "x");
     Assert.assertEquals("Should project y", 2, (int) projectedP1.get("y"));
     projectedP2 = points.get(1);
-    AssertHelpers.assertEmptyAvroField(projectedP2, "x");
+    assertEmptyAvroField(projectedP2, "x");
     Assert.assertEquals("Should project null y", null, projectedP2.get("y"));
 
     Schema yRenamed =
@@ -511,17 +512,17 @@ public abstract class TestReadProjection {
                         Types.NestedField.optional(18, "z", 
Types.IntegerType.get())))));
 
     projected = writeAndRead("y_renamed", writeSchema, yRenamed, record);
-    AssertHelpers.assertEmptyAvroField(projected, "id");
+    assertEmptyAvroField(projected, "id");
     Assert.assertNotNull("Should project points list", 
projected.get("points"));
     points = (List<Record>) projected.get("points");
     Assert.assertEquals("Should read 2 points", 2, points.size());
     projectedP1 = points.get(0);
-    AssertHelpers.assertEmptyAvroField(projectedP1, "x");
-    AssertHelpers.assertEmptyAvroField(projectedP1, "y");
+    assertEmptyAvroField(projectedP1, "x");
+    assertEmptyAvroField(projectedP1, "y");
     Assert.assertEquals("Should project z", 2, (int) projectedP1.get("z"));
     projectedP2 = points.get(1);
-    AssertHelpers.assertEmptyAvroField(projectedP2, "x");
-    AssertHelpers.assertEmptyAvroField(projectedP2, "y");
+    assertEmptyAvroField(projectedP2, "x");
+    assertEmptyAvroField(projectedP2, "y");
     Assert.assertNull("Should project null z", projectedP2.get("z"));
   }
 
@@ -549,13 +550,13 @@ public abstract class TestReadProjection {
         new Schema(Types.NestedField.required(3, "location", 
Types.StructType.of()));
 
     Record projected = writeAndRead("empty_proj", writeSchema, emptyStruct, 
record);
-    AssertHelpers.assertEmptyAvroField(projected, "id");
+    assertEmptyAvroField(projected, "id");
     Record result = (Record) projected.get("location");
 
     Assert.assertEquals("location should be in the 0th position", result, 
projected.get(0));
     Assert.assertNotNull("Should contain an empty record", result);
-    AssertHelpers.assertEmptyAvroField(result, "lat");
-    AssertHelpers.assertEmptyAvroField(result, "long");
+    assertEmptyAvroField(result, "lat");
+    assertEmptyAvroField(result, "long");
   }
 
   @Test
@@ -581,12 +582,12 @@ public abstract class TestReadProjection {
         new Schema(Types.NestedField.required(3, "location", 
Types.StructType.of()));
 
     Record projected = writeAndRead("empty_req_proj", writeSchema, 
emptyStruct, record);
-    AssertHelpers.assertEmptyAvroField(projected, "id");
+    assertEmptyAvroField(projected, "id");
     Record result = (Record) projected.get("location");
     Assert.assertEquals("location should be in the 0th position", result, 
projected.get(0));
     Assert.assertNotNull("Should contain an empty record", result);
-    AssertHelpers.assertEmptyAvroField(result, "lat");
-    AssertHelpers.assertEmptyAvroField(result, "long");
+    assertEmptyAvroField(result, "lat");
+    assertEmptyAvroField(result, "long");
   }
 
   @Test
@@ -623,8 +624,8 @@ public abstract class TestReadProjection {
     Record result = (Record) projected.get("location");
     Assert.assertEquals("location should be in the 1st position", result, 
projected.get(1));
     Assert.assertNotNull("Should contain an empty record", result);
-    AssertHelpers.assertEmptyAvroField(result, "lat");
-    AssertHelpers.assertEmptyAvroField(result, "long");
+    assertEmptyAvroField(result, "lat");
+    assertEmptyAvroField(result, "long");
     Assert.assertNotNull("Should project empty", 
result.getSchema().getField("empty"));
     Assert.assertNotNull("Empty should not be null", result.get("empty"));
     Assert.assertEquals(
@@ -667,15 +668,15 @@ public abstract class TestReadProjection {
                     Types.NestedField.required(2, "inner", 
Types.StructType.of()))));
 
     Record projected = writeAndRead("nested_empty_proj", writeSchema, 
emptyStruct, record);
-    AssertHelpers.assertEmptyAvroField(projected, "id");
+    assertEmptyAvroField(projected, "id");
     Record outerResult = (Record) projected.get("outer");
     Assert.assertEquals("Outer should be in the 0th position", outerResult, 
projected.get(0));
     Assert.assertNotNull("Should contain the outer record", outerResult);
-    AssertHelpers.assertEmptyAvroField(outerResult, "lat");
+    assertEmptyAvroField(outerResult, "lat");
     Record innerResult = (Record) outerResult.get("inner");
     Assert.assertEquals("Inner should be in the 0th position", innerResult, 
outerResult.get(0));
     Assert.assertNotNull("Should contain the inner record", innerResult);
-    AssertHelpers.assertEmptyAvroField(innerResult, "lon");
+    assertEmptyAvroField(innerResult, "lon");
   }
 
   @Test
@@ -712,14 +713,20 @@ public abstract class TestReadProjection {
                     Types.NestedField.required(2, "inner", 
Types.StructType.of()))));
 
     Record projected = writeAndRead("nested_empty_req_proj", writeSchema, 
emptyStruct, record);
-    AssertHelpers.assertEmptyAvroField(projected, "id");
+    assertEmptyAvroField(projected, "id");
     Record outerResult = (Record) projected.get("outer");
     Assert.assertEquals("Outer should be in the 0th position", outerResult, 
projected.get(0));
     Assert.assertNotNull("Should contain the outer record", outerResult);
-    AssertHelpers.assertEmptyAvroField(outerResult, "lat");
+    assertEmptyAvroField(outerResult, "lat");
     Record innerResult = (Record) outerResult.get("inner");
     Assert.assertEquals("Inner should be in the 0th position", innerResult, 
outerResult.get(0));
     Assert.assertNotNull("Should contain the inner record", innerResult);
-    AssertHelpers.assertEmptyAvroField(innerResult, "lon");
+    assertEmptyAvroField(innerResult, "lon");
+  }
+
+  private void assertEmptyAvroField(GenericRecord record, String field) {
+    Assertions.assertThatThrownBy(() -> record.get(field))
+        .isInstanceOf(AvroRuntimeException.class)
+        .hasMessage("Not a valid schema field: " + field);
   }
 }
diff --git 
a/core/src/test/java/org/apache/iceberg/encryption/TestKeyMetadataParser.java 
b/core/src/test/java/org/apache/iceberg/encryption/TestKeyMetadataParser.java
index 19836254d2..27b00b1829 100644
--- 
a/core/src/test/java/org/apache/iceberg/encryption/TestKeyMetadataParser.java
+++ 
b/core/src/test/java/org/apache/iceberg/encryption/TestKeyMetadataParser.java
@@ -20,7 +20,7 @@ package org.apache.iceberg.encryption;
 
 import java.nio.ByteBuffer;
 import java.nio.charset.StandardCharsets;
-import org.apache.iceberg.AssertHelpers;
+import org.assertj.core.api.Assertions;
 import org.junit.Assert;
 import org.junit.Test;
 
@@ -41,10 +41,8 @@ public class TestKeyMetadataParser {
   @Test
   public void testUnsupportedVersion() {
     ByteBuffer badBuffer = ByteBuffer.wrap(new byte[] {0x02});
-    AssertHelpers.assertThrows(
-        "Should throw when attempting to parse a buffer with wrong key 
metadata version",
-        UnsupportedOperationException.class,
-        "Cannot resolve schema for version",
-        () -> KeyMetadata.parse(badBuffer));
+    Assertions.assertThatThrownBy(() -> KeyMetadata.parse(badBuffer))
+        .isInstanceOf(UnsupportedOperationException.class)
+        .hasMessage("Cannot resolve schema for version: 2");
   }
 }

Reply via email to