You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iceberg.apache.org by et...@apache.org on 2025/07/23 05:20:39 UTC

(iceberg) branch main updated: Test: Simplify collection and optional assertions (#13613)

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

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


The following commit(s) were added to refs/heads/main by this push:
     new 13871b2502 Test: Simplify collection and optional assertions (#13613)
13871b2502 is described below

commit 13871b2502fd8e6d271e5d39638eb05b5503887f
Author: Yuya Ebihara <eb...@gmail.com>
AuthorDate: Wed Jul 23 14:20:33 2025 +0900

    Test: Simplify collection and optional assertions (#13613)
---
 .../apache/iceberg/expressions/TestEvaluator.java  |  4 +-
 .../iceberg/aws/glue/TestGlueCatalogTable.java     |  3 +-
 .../apache/iceberg/aws/TestS3FileIOProperties.java |  6 +--
 .../iceberg/azure/adlsv2/TestADLSLocation.java     |  2 +-
 .../org/apache/iceberg/DataTableScanTestBase.java  |  2 +-
 .../org/apache/iceberg/TestMetadataTableScans.java |  5 ++-
 .../apache/iceberg/TestRowLineageAssignment.java   | 52 +++++++++++-----------
 .../apache/iceberg/avro/TestSchemaConversions.java |  2 +-
 .../apache/iceberg/hadoop/TestCachingCatalog.java  |  5 +--
 .../org/apache/iceberg/TestMergingMetrics.java     |  6 +--
 .../iceberg/data/parquet/TestGenericData.java      |  2 +-
 .../iceberg/delta/TestSnapshotDeltaLakeTable.java  |  2 +-
 .../iceberg/flink/data/TestFlinkParquetReader.java |  2 +-
 .../iceberg/flink/data/TestRowDataProjection.java  | 24 +++++-----
 .../TestBucketPartitionerFlinkIcebergSink.java     |  4 +-
 .../flink/sink/dynamic/TestDynamicIcebergSink.java |  2 +-
 .../flink/sink/dynamic/TestDynamicWriter.java      |  6 +--
 .../sink/dynamic/TestEvolveSchemaVisitor.java      |  6 +--
 .../iceberg/flink/sink/dynamic/TestLRUCache.java   |  8 ++--
 .../sink/shuffle/TestMapRangePartitioner.java      |  2 +-
 .../iceberg/flink/data/TestFlinkParquetReader.java |  2 +-
 .../iceberg/flink/data/TestRowDataProjection.java  | 24 +++++-----
 .../TestBucketPartitionerFlinkIcebergSink.java     |  4 +-
 .../flink/sink/dynamic/TestDynamicIcebergSink.java |  2 +-
 .../flink/sink/dynamic/TestDynamicWriter.java      |  6 +--
 .../sink/dynamic/TestEvolveSchemaVisitor.java      |  6 +--
 .../iceberg/flink/sink/dynamic/TestLRUCache.java   |  8 ++--
 .../sink/shuffle/TestMapRangePartitioner.java      |  2 +-
 .../iceberg/flink/data/TestFlinkParquetReader.java |  2 +-
 .../iceberg/flink/data/TestRowDataProjection.java  | 24 +++++-----
 .../TestBucketPartitionerFlinkIcebergSink.java     |  4 +-
 .../flink/sink/dynamic/TestDynamicIcebergSink.java |  2 +-
 .../flink/sink/dynamic/TestDynamicWriter.java      |  6 +--
 .../sink/dynamic/TestEvolveSchemaVisitor.java      |  6 +--
 .../iceberg/flink/sink/dynamic/TestLRUCache.java   |  8 ++--
 .../sink/shuffle/TestMapRangePartitioner.java      |  2 +-
 .../connect/transforms/TestJsonToMapTransform.java |  2 +-
 .../iceberg/connect/data/TestSinkWriter.java       | 12 ++---
 .../apache/iceberg/parquet/TestVariantMetrics.java | 20 ++++-----
 .../apache/iceberg/parquet/TestVariantWriters.java |  2 +-
 .../iceberg/spark/data/TestSparkParquetReader.java |  4 +-
 .../spark/source/DataFrameWriteTestBase.java       |  2 +-
 .../spark/source/DataFrameWriteTestBase.java       |  2 +-
 .../spark/source/DataFrameWriteTestBase.java       |  2 +-
 44 files changed, 146 insertions(+), 153 deletions(-)

diff --git a/api/src/test/java/org/apache/iceberg/expressions/TestEvaluator.java b/api/src/test/java/org/apache/iceberg/expressions/TestEvaluator.java
index 792e651a3d..995dde539f 100644
--- a/api/src/test/java/org/apache/iceberg/expressions/TestEvaluator.java
+++ b/api/src/test/java/org/apache/iceberg/expressions/TestEvaluator.java
@@ -240,7 +240,7 @@ public class TestEvaluator {
 
   @Test
   public void testEqual() {
-    assertThat(equal("x", 5).literals().size()).isEqualTo(1);
+    assertThat(equal("x", 5).literals()).hasSize(1);
 
     Evaluator evaluator = new Evaluator(STRUCT, equal("x", 7));
     assertThat(evaluator.eval(TestHelpers.Row.of(7, 8, null))).as("7 == 7 => true").isTrue();
@@ -271,7 +271,7 @@ public class TestEvaluator {
 
   @Test
   public void testNotEqual() {
-    assertThat(notEqual("x", 5).literals().size()).isEqualTo(1);
+    assertThat(notEqual("x", 5).literals()).hasSize(1);
 
     Evaluator evaluator = new Evaluator(STRUCT, notEqual("x", 7));
     assertThat(evaluator.eval(TestHelpers.Row.of(7, 8, null))).as("7 != 7 => false").isFalse();
diff --git a/aws/src/integration/java/org/apache/iceberg/aws/glue/TestGlueCatalogTable.java b/aws/src/integration/java/org/apache/iceberg/aws/glue/TestGlueCatalogTable.java
index aa1e669377..2c9459c5e3 100644
--- a/aws/src/integration/java/org/apache/iceberg/aws/glue/TestGlueCatalogTable.java
+++ b/aws/src/integration/java/org/apache/iceberg/aws/glue/TestGlueCatalogTable.java
@@ -439,8 +439,7 @@ public class TestGlueCatalogTable extends GlueTestBase {
       // might have directory markers left
       for (S3Object s3Object : response.contents()) {
         Optional<Long> size = s3Object.getValueForField("Size", Long.class);
-        assertThat(size.isPresent()).isTrue();
-        assertThat(size.get()).isEqualTo(0);
+        assertThat(size).contains(0L);
       }
     }
   }
diff --git a/aws/src/test/java/org/apache/iceberg/aws/TestS3FileIOProperties.java b/aws/src/test/java/org/apache/iceberg/aws/TestS3FileIOProperties.java
index 58332d4258..f374a18c04 100644
--- a/aws/src/test/java/org/apache/iceberg/aws/TestS3FileIOProperties.java
+++ b/aws/src/test/java/org/apache/iceberg/aws/TestS3FileIOProperties.java
@@ -290,7 +290,7 @@ public class TestS3FileIOProperties {
     S3ClientBuilder builder = S3Client.builder();
 
     s3Properties.applyS3AccessGrantsConfigurations(builder);
-    assertThat(builder.plugins().size()).isEqualTo(1);
+    assertThat(builder.plugins()).hasSize(1);
   }
 
   @Test
@@ -302,7 +302,7 @@ public class TestS3FileIOProperties {
     S3ClientBuilder builder = S3Client.builder();
 
     s3Properties.applyS3AccessGrantsConfigurations(builder);
-    assertThat(builder.plugins().size()).isEqualTo(0);
+    assertThat(builder.plugins()).hasSize(0);
 
     // Implicitly false
     properties = ImmutableMap.of();
@@ -310,7 +310,7 @@ public class TestS3FileIOProperties {
     builder = S3Client.builder();
 
     s3Properties.applyS3AccessGrantsConfigurations(builder);
-    assertThat(builder.plugins().size()).isEqualTo(0);
+    assertThat(builder.plugins()).hasSize(0);
   }
 
   @Test
diff --git a/azure/src/test/java/org/apache/iceberg/azure/adlsv2/TestADLSLocation.java b/azure/src/test/java/org/apache/iceberg/azure/adlsv2/TestADLSLocation.java
index e6308d5764..643e11fb7f 100644
--- a/azure/src/test/java/org/apache/iceberg/azure/adlsv2/TestADLSLocation.java
+++ b/azure/src/test/java/org/apache/iceberg/azure/adlsv2/TestADLSLocation.java
@@ -80,7 +80,7 @@ public class TestADLSLocation {
     ADLSLocation location = new ADLSLocation(p1);
 
     assertThat(location.storageAccount()).isEqualTo("account");
-    assertThat(location.container().isPresent()).isFalse();
+    assertThat(location.container()).isEmpty();
     assertThat(location.path()).isEqualTo("path/to/file");
   }
 
diff --git a/core/src/test/java/org/apache/iceberg/DataTableScanTestBase.java b/core/src/test/java/org/apache/iceberg/DataTableScanTestBase.java
index e4cf74a15c..b8433ae085 100644
--- a/core/src/test/java/org/apache/iceberg/DataTableScanTestBase.java
+++ b/core/src/test/java/org/apache/iceberg/DataTableScanTestBase.java
@@ -302,7 +302,7 @@ public abstract class DataTableScanTestBase<
       }
     }
 
-    assertThat(deletes.size()).isEqualTo(1);
+    assertThat(deletes).hasSize(1);
     ManifestFile deleteManifest =
         table.currentSnapshot().deleteManifests(table.io()).stream()
             .filter(manifest -> manifest.snapshotId() == table.currentSnapshot().snapshotId())
diff --git a/core/src/test/java/org/apache/iceberg/TestMetadataTableScans.java b/core/src/test/java/org/apache/iceberg/TestMetadataTableScans.java
index 0e77e38ca3..4d2971c7f1 100644
--- a/core/src/test/java/org/apache/iceberg/TestMetadataTableScans.java
+++ b/core/src/test/java/org/apache/iceberg/TestMetadataTableScans.java
@@ -1757,8 +1757,9 @@ public class TestMetadataTableScans extends MetadataTableScanTestBase {
 
     try (CloseableIterable<FileScanTask> tasks = scan.planFiles()) {
       List<FileScanTask> taskList = Lists.newArrayList(tasks);
-      assertThat(taskList.size()).isGreaterThan(0);
-      taskList.forEach(task -> assertThat(task.estimatedRowsCount()).isEqualTo(size));
+      assertThat(taskList)
+          .isNotEmpty()
+          .allSatisfy(task -> assertThat(task.estimatedRowsCount()).isEqualTo(size));
     }
   }
 }
diff --git a/core/src/test/java/org/apache/iceberg/TestRowLineageAssignment.java b/core/src/test/java/org/apache/iceberg/TestRowLineageAssignment.java
index d2fabc7849..5f027ccc88 100644
--- a/core/src/test/java/org/apache/iceberg/TestRowLineageAssignment.java
+++ b/core/src/test/java/org/apache/iceberg/TestRowLineageAssignment.java
@@ -303,7 +303,7 @@ public class TestRowLineageAssignment {
         table.io().newInputFile(current.manifestListLocation()), startingNextRowId, 0L);
 
     List<ManifestFile> manifests = current.dataManifests(table.io());
-    assertThat(manifests.size()).isEqualTo(2);
+    assertThat(manifests).hasSize(2);
     checkDataFileAssignment(table, manifests.get(0), startingNextRowId);
   }
 
@@ -325,7 +325,7 @@ public class TestRowLineageAssignment {
         table.io().newInputFile(staged.manifestListLocation()), startingNextRowId, 0L);
 
     List<ManifestFile> stagedManifests = staged.dataManifests(table.io());
-    assertThat(stagedManifests.size()).isEqualTo(2);
+    assertThat(stagedManifests).hasSize(2);
 
     ManifestFile stagedManifest = stagedManifests.get(0);
     checkDataFileAssignment(table, stagedManifest, startingNextRowId);
@@ -345,7 +345,7 @@ public class TestRowLineageAssignment {
         table.io().newInputFile(committedFirst.manifestListLocation()), startingNextRowId, 0L);
 
     List<ManifestFile> committedManifests = committedFirst.dataManifests(table.io());
-    assertThat(committedManifests.size()).isEqualTo(2);
+    assertThat(committedManifests).hasSize(2);
 
     ManifestFile committedManifest = committedManifests.get(0);
     checkDataFileAssignment(table, committedManifest, startingNextRowId);
@@ -368,7 +368,7 @@ public class TestRowLineageAssignment {
     checkManifestListAssignment(newManifestList, secondNextRowId, startingNextRowId, 0L);
 
     List<ManifestFile> newManifests = committedSecond.dataManifests(table.io());
-    assertThat(newManifests.size()).isEqualTo(3);
+    assertThat(newManifests).hasSize(3);
 
     ManifestFile newManifest = newManifests.get(0);
     checkDataFileAssignment(table, newManifest, secondNextRowId);
@@ -395,7 +395,7 @@ public class TestRowLineageAssignment {
     checkManifestListAssignment(manifestList, startingNextRowId, nextRowId);
 
     List<ManifestFile> manifests = current.dataManifests(table.io());
-    assertThat(manifests.size()).isEqualTo(2);
+    assertThat(manifests).hasSize(2);
     checkDataFileAssignment(table, manifests.get(0), startingNextRowId);
     checkDataFileAssignment(table, manifests.get(1), 0L);
   }
@@ -407,7 +407,7 @@ public class TestRowLineageAssignment {
 
     long startingNextRowId = table.operations().current().nextRowId();
 
-    assertThat(table.currentSnapshot().allManifests(table.io()).size()).isEqualTo(1);
+    assertThat(table.currentSnapshot().allManifests(table.io())).hasSize(1);
 
     table.newOverwrite().deleteFile(FILE_A).addFile(FILE_C).commit();
     // the table's nextRowId is incremented by FILE_B.recordCount() because it is in a new manifest
@@ -421,7 +421,7 @@ public class TestRowLineageAssignment {
         manifestList, startingNextRowId, startingNextRowId + FILE_C.recordCount());
 
     List<ManifestFile> manifests = current.dataManifests(table.io());
-    assertThat(manifests.size()).isEqualTo(2);
+    assertThat(manifests).hasSize(2);
     checkDataFileAssignment(table, manifests.get(0), startingNextRowId);
     // the starting row ID for FILE_B does not change
     checkDataFileAssignment(table, manifests.get(1), FILE_A.recordCount());
@@ -444,7 +444,7 @@ public class TestRowLineageAssignment {
     checkManifestListAssignment(manifestList, startingNextRowId, 0L);
 
     List<ManifestFile> manifests = current.dataManifests(table.io());
-    assertThat(manifests.size()).isEqualTo(2);
+    assertThat(manifests).hasSize(2);
     checkDataFileAssignment(table, manifests.get(0), startingNextRowId);
     checkDataFileAssignment(table, manifests.get(1), 0L);
   }
@@ -464,12 +464,12 @@ public class TestRowLineageAssignment {
 
     long preMergeNextRowId = startingFirstRowId + FILE_B.recordCount();
     assertThat(table.operations().current().nextRowId()).isEqualTo(preMergeNextRowId);
-    assertThat(table.currentSnapshot().allManifests(table.io()).size()).isEqualTo(2);
+    assertThat(table.currentSnapshot().allManifests(table.io())).hasSize(2);
     InputFile preMergeManifestList =
         table.io().newInputFile(table.currentSnapshot().manifestListLocation());
     checkManifestListAssignment(preMergeManifestList, startingFirstRowId, 0L);
     List<ManifestFile> preMergeManifests = table.currentSnapshot().dataManifests(table.io());
-    assertThat(preMergeManifests.size()).isEqualTo(2);
+    assertThat(preMergeManifests).hasSize(2);
     checkDataFileAssignment(table, preMergeManifests.get(0), startingFirstRowId);
     checkDataFileAssignment(table, preMergeManifests.get(1), 0L);
 
@@ -480,7 +480,7 @@ public class TestRowLineageAssignment {
         preMergeNextRowId + FILE_C.recordCount() + FILE_B.recordCount() + FILE_A.recordCount();
 
     assertThat(table.operations().current().nextRowId()).isEqualTo(mergedNextRowId);
-    assertThat(table.currentSnapshot().allManifests(table.io()).size()).isEqualTo(1);
+    assertThat(table.currentSnapshot().allManifests(table.io())).hasSize(1);
     InputFile mergedManifestList =
         table.io().newInputFile(table.currentSnapshot().manifestListLocation());
     checkManifestListAssignment(mergedManifestList, preMergeNextRowId);
@@ -523,7 +523,7 @@ public class TestRowLineageAssignment {
     checkManifestListAssignment(manifestList, null, null);
 
     List<ManifestFile> manifests = current.dataManifests(upgradeTable.io());
-    assertThat(manifests.size()).isEqualTo(2);
+    assertThat(manifests).hasSize(2);
     // manifests without first_row_id will not assign first_row_id
     checkDataFileAssignment(upgradeTable, manifests.get(0), (Long) null);
     checkDataFileAssignment(upgradeTable, manifests.get(1), (Long) null);
@@ -539,7 +539,7 @@ public class TestRowLineageAssignment {
 
     List<ManifestFile> existingManifests =
         upgradeTable.currentSnapshot().dataManifests(upgradeTable.io());
-    assertThat(existingManifests.size()).isEqualTo(2);
+    assertThat(existingManifests).hasSize(2);
 
     // any commit (even empty) should assign first_row_id to the entire metadata tree
     upgradeTable.newFastAppend().commit();
@@ -557,7 +557,7 @@ public class TestRowLineageAssignment {
     checkManifestListAssignment(manifestList, 0L, FILE_C.recordCount());
 
     List<ManifestFile> manifests = assigned.dataManifests(upgradeTable.io());
-    assertThat(manifests.size()).isEqualTo(2);
+    assertThat(manifests).hasSize(2);
     checkDataFileAssignment(upgradeTable, manifests.get(0), 0L);
     checkDataFileAssignment(upgradeTable, manifests.get(1), FILE_C.recordCount());
     // the existing manifests were reused without modification
@@ -575,7 +575,7 @@ public class TestRowLineageAssignment {
 
     List<ManifestFile> existingManifests =
         upgradeTable.currentSnapshot().dataManifests(upgradeTable.io());
-    assertThat(existingManifests.size()).isEqualTo(2);
+    assertThat(existingManifests).hasSize(2);
 
     // any commit (even empty) should assign first_row_id to the entire metadata tree
     upgradeTable.newDelete().deleteFile(FILE_C).commit();
@@ -593,7 +593,7 @@ public class TestRowLineageAssignment {
     checkManifestListAssignment(manifestList, 0L, 0L);
 
     List<ManifestFile> manifests = assigned.dataManifests(upgradeTable.io());
-    assertThat(manifests.size()).isEqualTo(2);
+    assertThat(manifests).hasSize(2);
     checkDataFileAssignment(upgradeTable, manifests.get(0), 0L);
     checkDataFileAssignment(upgradeTable, manifests.get(1), 0L);
     // the existing manifests were reused without modification
@@ -610,7 +610,7 @@ public class TestRowLineageAssignment {
 
     List<ManifestFile> existingManifests =
         upgradeTable.currentSnapshot().dataManifests(upgradeTable.io());
-    assertThat(existingManifests.size()).isEqualTo(2);
+    assertThat(existingManifests).hasSize(2);
 
     // any commit (even empty) should assign first_row_id to the branch's tree
     upgradeTable.manageSnapshots().createBranch("branch").commit();
@@ -627,7 +627,7 @@ public class TestRowLineageAssignment {
     checkManifestListAssignment(mainManifestList, null, null);
 
     List<ManifestFile> mainManifests = current.dataManifests(upgradeTable.io());
-    assertThat(mainManifests.size()).isEqualTo(2);
+    assertThat(mainManifests).hasSize(2);
     checkDataFileAssignment(upgradeTable, mainManifests.get(0), (Long) null);
     checkDataFileAssignment(upgradeTable, mainManifests.get(1), (Long) null);
     assertThat(mainManifests.get(0).path()).isEqualTo(existingManifests.get(0).path());
@@ -642,7 +642,7 @@ public class TestRowLineageAssignment {
     checkManifestListAssignment(branchManifestList, 0L, FILE_C.recordCount());
 
     List<ManifestFile> branchManifests = assigned.dataManifests(upgradeTable.io());
-    assertThat(branchManifests.size()).isEqualTo(2);
+    assertThat(branchManifests).hasSize(2);
     checkDataFileAssignment(upgradeTable, branchManifests.get(0), 0L);
     checkDataFileAssignment(upgradeTable, branchManifests.get(1), FILE_C.recordCount());
     // the existing manifests were reused without modification
@@ -660,7 +660,7 @@ public class TestRowLineageAssignment {
 
     List<ManifestFile> existingManifests =
         upgradeTable.currentSnapshot().dataManifests(upgradeTable.io());
-    assertThat(existingManifests.size()).isEqualTo(2);
+    assertThat(existingManifests).hasSize(2);
 
     // any commit should assign first_row_id to the entire metadata tree
     upgradeTable.newOverwrite().deleteFile(FILE_C).addFile(FILE_B).commit();
@@ -678,7 +678,7 @@ public class TestRowLineageAssignment {
     checkManifestListAssignment(manifestList, 0L, FILE_B.recordCount(), FILE_B.recordCount());
 
     List<ManifestFile> manifests = assigned.dataManifests(upgradeTable.io());
-    assertThat(manifests.size()).isEqualTo(3);
+    assertThat(manifests).hasSize(3);
     checkDataFileAssignment(upgradeTable, manifests.get(0), 0L);
     checkDataFileAssignment(upgradeTable, manifests.get(1)); // no live files
     checkDataFileAssignment(upgradeTable, manifests.get(2), FILE_B.recordCount());
@@ -696,7 +696,7 @@ public class TestRowLineageAssignment {
 
     List<ManifestFile> existingManifests =
         upgradeTable.currentSnapshot().dataManifests(upgradeTable.io());
-    assertThat(existingManifests.size()).isEqualTo(2);
+    assertThat(existingManifests).hasSize(2);
 
     // any commit (even empty) should assign first_row_id to the entire metadata tree
     upgradeTable.newRowDelta().addDeletes(FILE_A_DV).commit();
@@ -714,7 +714,7 @@ public class TestRowLineageAssignment {
     checkManifestListAssignment(manifestList, 0L, FILE_C.recordCount());
 
     List<ManifestFile> manifests = assigned.dataManifests(upgradeTable.io());
-    assertThat(manifests.size()).isEqualTo(2);
+    assertThat(manifests).hasSize(2);
     checkDataFileAssignment(upgradeTable, manifests.get(0), 0L);
     checkDataFileAssignment(upgradeTable, manifests.get(1), FILE_C.recordCount());
     // the existing manifests were reused without modification
@@ -750,13 +750,13 @@ public class TestRowLineageAssignment {
           .isNull();
     }
 
-    assertThat(upgradeTable.currentSnapshot().allManifests(upgradeTable.io()).size()).isEqualTo(2);
+    assertThat(upgradeTable.currentSnapshot().allManifests(upgradeTable.io())).hasSize(2);
     InputFile preMergeManifestList =
         upgradeTable.io().newInputFile(upgradeTable.currentSnapshot().manifestListLocation());
     checkManifestListAssignment(preMergeManifestList, null, null);
     List<ManifestFile> preMergeManifests =
         upgradeTable.currentSnapshot().dataManifests(upgradeTable.io());
-    assertThat(preMergeManifests.size()).isEqualTo(2);
+    assertThat(preMergeManifests).hasSize(2);
     checkDataFileAssignment(upgradeTable, preMergeManifests.get(0), (Long) null);
     checkDataFileAssignment(upgradeTable, preMergeManifests.get(1), (Long) null);
 
@@ -767,7 +767,7 @@ public class TestRowLineageAssignment {
     long mergedNextRowId = FILE_C.recordCount() + FILE_B.recordCount() + FILE_A.recordCount();
 
     assertThat(upgradeTable.operations().current().nextRowId()).isEqualTo(mergedNextRowId);
-    assertThat(upgradeTable.currentSnapshot().allManifests(upgradeTable.io()).size()).isEqualTo(1);
+    assertThat(upgradeTable.currentSnapshot().allManifests(upgradeTable.io())).hasSize(1);
     InputFile mergedManifestList =
         upgradeTable.io().newInputFile(upgradeTable.currentSnapshot().manifestListLocation());
     checkManifestListAssignment(mergedManifestList, 0L);
diff --git a/core/src/test/java/org/apache/iceberg/avro/TestSchemaConversions.java b/core/src/test/java/org/apache/iceberg/avro/TestSchemaConversions.java
index 2c31fe9283..0f822d3e4b 100644
--- a/core/src/test/java/org/apache/iceberg/avro/TestSchemaConversions.java
+++ b/core/src/test/java/org/apache/iceberg/avro/TestSchemaConversions.java
@@ -388,7 +388,7 @@ public class TestSchemaConversions {
       org.apache.avro.Schema variantSchema = avroSchema.getField("variantCol" + id).schema();
       assertThat(variantSchema.getName()).isEqualTo("r" + id);
       assertThat(variantSchema.getType()).isEqualTo(org.apache.avro.Schema.Type.RECORD);
-      assertThat(variantSchema.getFields().size()).isEqualTo(2);
+      assertThat(variantSchema.getFields()).hasSize(2);
       assertThat(variantSchema.getField("metadata").schema().getType())
           .isEqualTo(Schema.Type.BYTES);
       assertThat(variantSchema.getField("value").schema().getType()).isEqualTo(Schema.Type.BYTES);
diff --git a/core/src/test/java/org/apache/iceberg/hadoop/TestCachingCatalog.java b/core/src/test/java/org/apache/iceberg/hadoop/TestCachingCatalog.java
index c562788fa3..4c711c1187 100644
--- a/core/src/test/java/org/apache/iceberg/hadoop/TestCachingCatalog.java
+++ b/core/src/test/java/org/apache/iceberg/hadoop/TestCachingCatalog.java
@@ -27,7 +27,6 @@ import java.time.Duration;
 import java.util.Arrays;
 import java.util.List;
 import java.util.Locale;
-import java.util.Optional;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 import java.util.concurrent.TimeUnit;
@@ -301,7 +300,7 @@ public class TestCachingCatalog extends HadoopTableTestBase {
 
     assertThat(catalog.remainingAgeFor(tableIdent))
         .as("Loading a non-cached metadata table should refresh the main table's age")
-        .isEqualTo(Optional.of(EXPIRATION_TTL));
+        .contains(EXPIRATION_TTL);
 
     // Move time forward and access already cached metadata tables.
     ticker.advance(HALF_OF_EXPIRATION);
@@ -312,7 +311,7 @@ public class TestCachingCatalog extends HadoopTableTestBase {
 
     assertThat(catalog.remainingAgeFor(tableIdent))
         .as("Accessing a cached metadata table should not affect the main table's age")
-        .isEqualTo(Optional.of(HALF_OF_EXPIRATION));
+        .contains(HALF_OF_EXPIRATION);
 
     // Move time forward so the data table drops.
     ticker.advance(HALF_OF_EXPIRATION);
diff --git a/data/src/test/java/org/apache/iceberg/TestMergingMetrics.java b/data/src/test/java/org/apache/iceberg/TestMergingMetrics.java
index 31602766c5..9c2874a3e2 100644
--- a/data/src/test/java/org/apache/iceberg/TestMergingMetrics.java
+++ b/data/src/test/java/org/apache/iceberg/TestMergingMetrics.java
@@ -137,14 +137,14 @@ public abstract class TestMergingMetrics<T> {
     Map<Integer, ByteBuffer> upperBounds = metrics.upperBounds();
     Map<Integer, ByteBuffer> lowerBounds = metrics.lowerBounds();
 
-    assertThat(nanValueCount.size()).isEqualTo(2);
+    assertThat(nanValueCount).hasSize(2);
     assertNaNCountMatch(1L, nanValueCount, FLOAT_FIELD);
     assertNaNCountMatch(1L, nanValueCount, DOUBLE_FIELD);
 
-    assertThat(upperBounds.size()).isEqualTo(1);
+    assertThat(upperBounds).hasSize(1);
     assertBoundValueMatch(3, upperBounds, ID_FIELD);
 
-    assertThat(lowerBounds.size()).isEqualTo(1);
+    assertThat(lowerBounds).hasSize(1);
     assertBoundValueMatch(3, lowerBounds, ID_FIELD);
   }
 
diff --git a/data/src/test/java/org/apache/iceberg/data/parquet/TestGenericData.java b/data/src/test/java/org/apache/iceberg/data/parquet/TestGenericData.java
index c796e18eb2..58498e342e 100644
--- a/data/src/test/java/org/apache/iceberg/data/parquet/TestGenericData.java
+++ b/data/src/test/java/org/apache/iceberg/data/parquet/TestGenericData.java
@@ -174,7 +174,7 @@ public class TestGenericData extends DataTestBase {
         assertThat(actualRecord.get(1, ByteBuffer.class)).isEqualTo(expectedBinary);
       }
 
-      assertThat(Lists.newArrayList(reader).size()).isEqualTo(1);
+      assertThat(Lists.newArrayList(reader)).hasSize(1);
     }
   }
 }
diff --git a/delta-lake/src/integration/java/org/apache/iceberg/delta/TestSnapshotDeltaLakeTable.java b/delta-lake/src/integration/java/org/apache/iceberg/delta/TestSnapshotDeltaLakeTable.java
index b6b15e7668..b2dae682d2 100644
--- a/delta-lake/src/integration/java/org/apache/iceberg/delta/TestSnapshotDeltaLakeTable.java
+++ b/delta-lake/src/integration/java/org/apache/iceberg/delta/TestSnapshotDeltaLakeTable.java
@@ -404,7 +404,7 @@ public class TestSnapshotDeltaLakeTable extends SparkDeltaLakeSnapshotTestBase {
     Map<String, SnapshotRef> icebergSnapshotRefs = icebergTable.refs();
     List<Snapshot> icebergSnapshots = Lists.newArrayList(icebergTable.snapshots());
 
-    assertThat(icebergSnapshots.size()).isEqualTo(currentVersion - firstConstructableVersion + 1);
+    assertThat(icebergSnapshots).hasSize((int) (currentVersion - firstConstructableVersion + 1));
 
     for (int i = 0; i < icebergSnapshots.size(); i++) {
       long deltaVersion = firstConstructableVersion + i;
diff --git a/flink/v1.19/flink/src/test/java/org/apache/iceberg/flink/data/TestFlinkParquetReader.java b/flink/v1.19/flink/src/test/java/org/apache/iceberg/flink/data/TestFlinkParquetReader.java
index bb7c4c2e72..e6781356f7 100644
--- a/flink/v1.19/flink/src/test/java/org/apache/iceberg/flink/data/TestFlinkParquetReader.java
+++ b/flink/v1.19/flink/src/test/java/org/apache/iceberg/flink/data/TestFlinkParquetReader.java
@@ -166,7 +166,7 @@ public class TestFlinkParquetReader extends DataTestBase {
     ParquetValueReader<RowData> reader =
         FlinkParquetReaders.buildReader(new Schema(SUPPORTED_PRIMITIVES.fields()), fileSchema);
 
-    assertThat(reader.columns().size()).isEqualTo(SUPPORTED_PRIMITIVES.fields().size());
+    assertThat(reader.columns()).hasSameSizeAs(SUPPORTED_PRIMITIVES.fields());
   }
 
   @Test
diff --git a/flink/v1.19/flink/src/test/java/org/apache/iceberg/flink/data/TestRowDataProjection.java b/flink/v1.19/flink/src/test/java/org/apache/iceberg/flink/data/TestRowDataProjection.java
index d078b22284..4e5b38ffb0 100644
--- a/flink/v1.19/flink/src/test/java/org/apache/iceberg/flink/data/TestRowDataProjection.java
+++ b/flink/v1.19/flink/src/test/java/org/apache/iceberg/flink/data/TestRowDataProjection.java
@@ -164,7 +164,7 @@ public class TestRowDataProjection {
 
     // Project id only.
     Schema idOnly = new Schema(Types.NestedField.required(0, "id", Types.LongType.get()));
-    assertThat(idOnly.columns().size()).isGreaterThan(0);
+    assertThat(idOnly.columns()).isNotEmpty();
     generateAndValidate(schema, idOnly);
     testEqualsAndHashCode(schema, idOnly, rowData, copyRowData, otherRowData);
     testEqualsAndHashCode(
@@ -177,7 +177,7 @@ public class TestRowDataProjection {
                 3,
                 "location",
                 Types.StructType.of(Types.NestedField.required(1, "lat", Types.FloatType.get()))));
-    assertThat(latOnly.columns().size()).isGreaterThan(0);
+    assertThat(latOnly.columns()).isNotEmpty();
     generateAndValidate(schema, latOnly);
     testEqualsAndHashCode(schema, latOnly, rowData, copyRowData, otherRowData);
     testEqualsAndHashCode(
@@ -190,7 +190,7 @@ public class TestRowDataProjection {
                 3,
                 "location",
                 Types.StructType.of(Types.NestedField.required(2, "long", Types.FloatType.get()))));
-    assertThat(longOnly.columns().size()).isGreaterThan(0);
+    assertThat(longOnly.columns()).isNotEmpty();
     generateAndValidate(schema, longOnly);
     testEqualsAndHashCode(schema, longOnly, rowData, copyRowData, otherRowData);
     testEqualsAndHashCode(
@@ -198,7 +198,7 @@ public class TestRowDataProjection {
 
     // Project location.
     Schema locationOnly = schema.select("location");
-    assertThat(locationOnly.columns().size()).isGreaterThan(0);
+    assertThat(locationOnly.columns()).isNotEmpty();
     generateAndValidate(schema, locationOnly);
     testEqualsAndHashCode(schema, locationOnly, rowData, copyRowData, otherRowData);
     testEqualsAndHashCode(
@@ -253,12 +253,12 @@ public class TestRowDataProjection {
 
     // Project id only.
     Schema idOnly = schema.select("row_id");
-    assertThat(idOnly.columns().size()).isGreaterThan(0);
+    assertThat(idOnly.columns()).isNotEmpty();
     generateAndValidate(schema, idOnly);
 
     // Project map only.
     Schema mapOnly = schema.select("map_of_primitives");
-    assertThat(mapOnly.columns().size()).isGreaterThan(0);
+    assertThat(mapOnly.columns()).isNotEmpty();
     generateAndValidate(schema, mapOnly);
 
     // Project all.
@@ -311,12 +311,12 @@ public class TestRowDataProjection {
 
     // Project id only.
     Schema idOnly = schema.select("row_id");
-    assertThat(idOnly.columns().size()).isGreaterThan(0);
+    assertThat(idOnly.columns()).isNotEmpty();
     generateAndValidate(schema, idOnly);
 
     // Project map only.
     Schema mapOnly = schema.select("map");
-    assertThat(mapOnly.columns().size()).isGreaterThan(0);
+    assertThat(mapOnly.columns()).isNotEmpty();
     generateAndValidate(schema, mapOnly);
 
     // Project all.
@@ -415,12 +415,12 @@ public class TestRowDataProjection {
 
     // Project id only.
     Schema idOnly = schema.select("row_id");
-    assertThat(idOnly.columns().size()).isGreaterThan(0);
+    assertThat(idOnly.columns()).isNotEmpty();
     generateAndValidate(schema, idOnly);
 
     // Project list only.
     Schema arrayOnly = schema.select("array_of_int");
-    assertThat(arrayOnly.columns().size()).isGreaterThan(0);
+    assertThat(arrayOnly.columns()).isNotEmpty();
     generateAndValidate(schema, arrayOnly);
 
     // Project all.
@@ -477,12 +477,12 @@ public class TestRowDataProjection {
 
     // Project id only.
     Schema idOnly = schema.select("row_id");
-    assertThat(idOnly.columns().size()).isGreaterThan(0);
+    assertThat(idOnly.columns()).isNotEmpty();
     generateAndValidate(schema, idOnly);
 
     // Project list only.
     Schema arrayOnly = schema.select("array_of_struct");
-    assertThat(arrayOnly.columns().size()).isGreaterThan(0);
+    assertThat(arrayOnly.columns()).isNotEmpty();
     generateAndValidate(schema, arrayOnly);
 
     // Project all.
diff --git a/flink/v1.19/flink/src/test/java/org/apache/iceberg/flink/sink/TestBucketPartitionerFlinkIcebergSink.java b/flink/v1.19/flink/src/test/java/org/apache/iceberg/flink/sink/TestBucketPartitionerFlinkIcebergSink.java
index 69afba1202..caf0ac6f21 100644
--- a/flink/v1.19/flink/src/test/java/org/apache/iceberg/flink/sink/TestBucketPartitionerFlinkIcebergSink.java
+++ b/flink/v1.19/flink/src/test/java/org/apache/iceberg/flink/sink/TestBucketPartitionerFlinkIcebergSink.java
@@ -153,8 +153,8 @@ public class TestBucketPartitionerFlinkIcebergSink {
 
     assertThat(stats.totalRowCount).isEqualTo(rows.size());
     // All 4 buckets should've been written to
-    assertThat(stats.writersPerBucket.size()).isEqualTo(numBuckets);
-    assertThat(stats.numFilesPerBucket.size()).isEqualTo(numBuckets);
+    assertThat(stats.writersPerBucket).hasSize(numBuckets);
+    assertThat(stats.numFilesPerBucket).hasSize(numBuckets);
     // Writer expectation (2 writers per bucket):
     // - Bucket0 -> Writers [0, 4]
     // - Bucket1 -> Writers [1, 5]
diff --git a/flink/v1.19/flink/src/test/java/org/apache/iceberg/flink/sink/dynamic/TestDynamicIcebergSink.java b/flink/v1.19/flink/src/test/java/org/apache/iceberg/flink/sink/dynamic/TestDynamicIcebergSink.java
index 4ee4ede46d..9765f2f057 100644
--- a/flink/v1.19/flink/src/test/java/org/apache/iceberg/flink/sink/dynamic/TestDynamicIcebergSink.java
+++ b/flink/v1.19/flink/src/test/java/org/apache/iceberg/flink/sink/dynamic/TestDynamicIcebergSink.java
@@ -497,7 +497,7 @@ class TestDynamicIcebergSink extends TestFlinkIcebergSinkBase {
         records.add(record);
       }
 
-      assertThat(records.size()).isEqualTo(1);
+      assertThat(records).hasSize(1);
       Record actual = records.get(0);
       DynamicIcebergDataImpl input = rows.get(0);
       assertThat(actual.get(0)).isEqualTo(input.rowProvided.getField(0));
diff --git a/flink/v1.19/flink/src/test/java/org/apache/iceberg/flink/sink/dynamic/TestDynamicWriter.java b/flink/v1.19/flink/src/test/java/org/apache/iceberg/flink/sink/dynamic/TestDynamicWriter.java
index 0c223f3237..f634d01fb3 100644
--- a/flink/v1.19/flink/src/test/java/org/apache/iceberg/flink/sink/dynamic/TestDynamicWriter.java
+++ b/flink/v1.19/flink/src/test/java/org/apache/iceberg/flink/sink/dynamic/TestDynamicWriter.java
@@ -18,8 +18,8 @@
  */
 package org.apache.iceberg.flink.sink.dynamic;
 
+import static org.assertj.core.api.Assertions.assertThat;
 import static org.assertj.core.api.Assertions.assertThatThrownBy;
-import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
 
 import java.io.File;
 import java.net.URI;
@@ -59,7 +59,7 @@ class TestDynamicWriter extends TestFlinkIcebergSinkBase {
     dynamicWriter.write(record2, null);
     Collection<DynamicWriteResult> writeResults = dynamicWriter.prepareCommit();
 
-    assertThat(writeResults.size()).isEqualTo(2);
+    assertThat(writeResults).hasSize(2);
     assertThat(getNumDataFiles(table1)).isEqualTo(1);
     assertThat(
             dynamicWriter
@@ -85,7 +85,7 @@ class TestDynamicWriter extends TestFlinkIcebergSinkBase {
     dynamicWriter.write(record2, null);
     writeResults = dynamicWriter.prepareCommit();
 
-    assertThat(writeResults.size()).isEqualTo(2);
+    assertThat(writeResults).hasSize(2);
     assertThat(getNumDataFiles(table1)).isEqualTo(2);
     assertThat(
             dynamicWriter
diff --git a/flink/v1.19/flink/src/test/java/org/apache/iceberg/flink/sink/dynamic/TestEvolveSchemaVisitor.java b/flink/v1.19/flink/src/test/java/org/apache/iceberg/flink/sink/dynamic/TestEvolveSchemaVisitor.java
index 58ee845291..d67b46849d 100644
--- a/flink/v1.19/flink/src/test/java/org/apache/iceberg/flink/sink/dynamic/TestEvolveSchemaVisitor.java
+++ b/flink/v1.19/flink/src/test/java/org/apache/iceberg/flink/sink/dynamic/TestEvolveSchemaVisitor.java
@@ -101,7 +101,7 @@ public class TestEvolveSchemaVisitor {
     UpdateSchema updateApi = loadUpdateApi(existingSchema, 0);
     EvolveSchemaVisitor.visit(updateApi, existingSchema, new Schema());
     Schema newSchema = updateApi.apply();
-    assertThat(newSchema.asStruct().fields().size()).isEqualTo(14);
+    assertThat(newSchema.asStruct().fields()).hasSize(14);
     assertThat(newSchema.columns().stream().allMatch(Types.NestedField::isOptional)).isTrue();
   }
 
@@ -369,7 +369,7 @@ public class TestEvolveSchemaVisitor {
     UpdateSchema updateApi = loadUpdateApi(currentSchema, 0);
     EvolveSchemaVisitor.visit(updateApi, currentSchema, targetSchema);
     Schema applied = updateApi.apply();
-    assertThat(applied.asStruct().fields().size()).isEqualTo(1);
+    assertThat(applied.asStruct().fields()).hasSize(1);
     assertThat(applied.asStruct().fields().get(0).type()).isEqualTo(LongType.get());
   }
 
@@ -382,7 +382,7 @@ public class TestEvolveSchemaVisitor {
     UpdateSchema updateApi = loadUpdateApi(currentSchema, 0);
     EvolveSchemaVisitor.visit(updateApi, currentSchema, targetSchema);
     Schema applied = updateApi.apply();
-    assertThat(applied.asStruct().fields().size()).isEqualTo(1);
+    assertThat(applied.asStruct().fields()).hasSize(1);
     assertThat(applied.asStruct().fields().get(0).type()).isEqualTo(DoubleType.get());
   }
 
diff --git a/flink/v1.19/flink/src/test/java/org/apache/iceberg/flink/sink/dynamic/TestLRUCache.java b/flink/v1.19/flink/src/test/java/org/apache/iceberg/flink/sink/dynamic/TestLRUCache.java
index 59a020a496..679d3de978 100644
--- a/flink/v1.19/flink/src/test/java/org/apache/iceberg/flink/sink/dynamic/TestLRUCache.java
+++ b/flink/v1.19/flink/src/test/java/org/apache/iceberg/flink/sink/dynamic/TestLRUCache.java
@@ -34,8 +34,7 @@ class TestLRUCache {
     LRUCache<Integer, Integer> cache = new LRUCache<>(1, NO_OP_CALLBACK);
     cache.put(1, 1);
 
-    assertThat(cache.size()).isEqualTo(1);
-    assertThat(cache).containsExactlyEntriesOf(Map.of(1, 1));
+    assertThat(cache).hasSize(1).containsEntry(1, 1);
   }
 
   @Test
@@ -43,7 +42,7 @@ class TestLRUCache {
     LRUCache<Integer, Integer> cache = new LRUCache<>(1, NO_OP_CALLBACK);
     cache.put(1, 123);
 
-    assertThat(cache.size()).isEqualTo(1);
+    assertThat(cache).hasSize(1);
     assertThat(cache.get(1)).isEqualTo(123);
   }
 
@@ -59,8 +58,7 @@ class TestLRUCache {
 
     cache.put(3, 3); // "2" should be evicted
 
-    assertThat(cache.size()).isEqualTo(2);
-    assertThat(cache).containsExactly(Map.entry(1, 1), Map.entry(3, 3));
+    assertThat(cache).hasSize(2).containsEntry(1, 1).containsEntry(3, 3);
   }
 
   @Test
diff --git a/flink/v1.19/flink/src/test/java/org/apache/iceberg/flink/sink/shuffle/TestMapRangePartitioner.java b/flink/v1.19/flink/src/test/java/org/apache/iceberg/flink/sink/shuffle/TestMapRangePartitioner.java
index c95a9955b1..a59ed3b1c7 100644
--- a/flink/v1.19/flink/src/test/java/org/apache/iceberg/flink/sink/shuffle/TestMapRangePartitioner.java
+++ b/flink/v1.19/flink/src/test/java/org/apache/iceberg/flink/sink/shuffle/TestMapRangePartitioner.java
@@ -388,7 +388,7 @@ public class TestMapRangePartitioner {
       Map<Integer, Pair<AtomicLong, Set<RowData>>> partitionResults,
       double maxDriftPercentage) {
 
-    assertThat(partitionResults.size()).isEqualTo(expectedAssignmentInfo.size());
+    assertThat(partitionResults).hasSameSizeAs(expectedAssignmentInfo);
 
     List<Integer> expectedAssignedKeyCounts =
         Lists.newArrayListWithExpectedSize(expectedAssignmentInfo.size());
diff --git a/flink/v1.20/flink/src/test/java/org/apache/iceberg/flink/data/TestFlinkParquetReader.java b/flink/v1.20/flink/src/test/java/org/apache/iceberg/flink/data/TestFlinkParquetReader.java
index bb7c4c2e72..e6781356f7 100644
--- a/flink/v1.20/flink/src/test/java/org/apache/iceberg/flink/data/TestFlinkParquetReader.java
+++ b/flink/v1.20/flink/src/test/java/org/apache/iceberg/flink/data/TestFlinkParquetReader.java
@@ -166,7 +166,7 @@ public class TestFlinkParquetReader extends DataTestBase {
     ParquetValueReader<RowData> reader =
         FlinkParquetReaders.buildReader(new Schema(SUPPORTED_PRIMITIVES.fields()), fileSchema);
 
-    assertThat(reader.columns().size()).isEqualTo(SUPPORTED_PRIMITIVES.fields().size());
+    assertThat(reader.columns()).hasSameSizeAs(SUPPORTED_PRIMITIVES.fields());
   }
 
   @Test
diff --git a/flink/v1.20/flink/src/test/java/org/apache/iceberg/flink/data/TestRowDataProjection.java b/flink/v1.20/flink/src/test/java/org/apache/iceberg/flink/data/TestRowDataProjection.java
index d078b22284..4e5b38ffb0 100644
--- a/flink/v1.20/flink/src/test/java/org/apache/iceberg/flink/data/TestRowDataProjection.java
+++ b/flink/v1.20/flink/src/test/java/org/apache/iceberg/flink/data/TestRowDataProjection.java
@@ -164,7 +164,7 @@ public class TestRowDataProjection {
 
     // Project id only.
     Schema idOnly = new Schema(Types.NestedField.required(0, "id", Types.LongType.get()));
-    assertThat(idOnly.columns().size()).isGreaterThan(0);
+    assertThat(idOnly.columns()).isNotEmpty();
     generateAndValidate(schema, idOnly);
     testEqualsAndHashCode(schema, idOnly, rowData, copyRowData, otherRowData);
     testEqualsAndHashCode(
@@ -177,7 +177,7 @@ public class TestRowDataProjection {
                 3,
                 "location",
                 Types.StructType.of(Types.NestedField.required(1, "lat", Types.FloatType.get()))));
-    assertThat(latOnly.columns().size()).isGreaterThan(0);
+    assertThat(latOnly.columns()).isNotEmpty();
     generateAndValidate(schema, latOnly);
     testEqualsAndHashCode(schema, latOnly, rowData, copyRowData, otherRowData);
     testEqualsAndHashCode(
@@ -190,7 +190,7 @@ public class TestRowDataProjection {
                 3,
                 "location",
                 Types.StructType.of(Types.NestedField.required(2, "long", Types.FloatType.get()))));
-    assertThat(longOnly.columns().size()).isGreaterThan(0);
+    assertThat(longOnly.columns()).isNotEmpty();
     generateAndValidate(schema, longOnly);
     testEqualsAndHashCode(schema, longOnly, rowData, copyRowData, otherRowData);
     testEqualsAndHashCode(
@@ -198,7 +198,7 @@ public class TestRowDataProjection {
 
     // Project location.
     Schema locationOnly = schema.select("location");
-    assertThat(locationOnly.columns().size()).isGreaterThan(0);
+    assertThat(locationOnly.columns()).isNotEmpty();
     generateAndValidate(schema, locationOnly);
     testEqualsAndHashCode(schema, locationOnly, rowData, copyRowData, otherRowData);
     testEqualsAndHashCode(
@@ -253,12 +253,12 @@ public class TestRowDataProjection {
 
     // Project id only.
     Schema idOnly = schema.select("row_id");
-    assertThat(idOnly.columns().size()).isGreaterThan(0);
+    assertThat(idOnly.columns()).isNotEmpty();
     generateAndValidate(schema, idOnly);
 
     // Project map only.
     Schema mapOnly = schema.select("map_of_primitives");
-    assertThat(mapOnly.columns().size()).isGreaterThan(0);
+    assertThat(mapOnly.columns()).isNotEmpty();
     generateAndValidate(schema, mapOnly);
 
     // Project all.
@@ -311,12 +311,12 @@ public class TestRowDataProjection {
 
     // Project id only.
     Schema idOnly = schema.select("row_id");
-    assertThat(idOnly.columns().size()).isGreaterThan(0);
+    assertThat(idOnly.columns()).isNotEmpty();
     generateAndValidate(schema, idOnly);
 
     // Project map only.
     Schema mapOnly = schema.select("map");
-    assertThat(mapOnly.columns().size()).isGreaterThan(0);
+    assertThat(mapOnly.columns()).isNotEmpty();
     generateAndValidate(schema, mapOnly);
 
     // Project all.
@@ -415,12 +415,12 @@ public class TestRowDataProjection {
 
     // Project id only.
     Schema idOnly = schema.select("row_id");
-    assertThat(idOnly.columns().size()).isGreaterThan(0);
+    assertThat(idOnly.columns()).isNotEmpty();
     generateAndValidate(schema, idOnly);
 
     // Project list only.
     Schema arrayOnly = schema.select("array_of_int");
-    assertThat(arrayOnly.columns().size()).isGreaterThan(0);
+    assertThat(arrayOnly.columns()).isNotEmpty();
     generateAndValidate(schema, arrayOnly);
 
     // Project all.
@@ -477,12 +477,12 @@ public class TestRowDataProjection {
 
     // Project id only.
     Schema idOnly = schema.select("row_id");
-    assertThat(idOnly.columns().size()).isGreaterThan(0);
+    assertThat(idOnly.columns()).isNotEmpty();
     generateAndValidate(schema, idOnly);
 
     // Project list only.
     Schema arrayOnly = schema.select("array_of_struct");
-    assertThat(arrayOnly.columns().size()).isGreaterThan(0);
+    assertThat(arrayOnly.columns()).isNotEmpty();
     generateAndValidate(schema, arrayOnly);
 
     // Project all.
diff --git a/flink/v1.20/flink/src/test/java/org/apache/iceberg/flink/sink/TestBucketPartitionerFlinkIcebergSink.java b/flink/v1.20/flink/src/test/java/org/apache/iceberg/flink/sink/TestBucketPartitionerFlinkIcebergSink.java
index 69afba1202..caf0ac6f21 100644
--- a/flink/v1.20/flink/src/test/java/org/apache/iceberg/flink/sink/TestBucketPartitionerFlinkIcebergSink.java
+++ b/flink/v1.20/flink/src/test/java/org/apache/iceberg/flink/sink/TestBucketPartitionerFlinkIcebergSink.java
@@ -153,8 +153,8 @@ public class TestBucketPartitionerFlinkIcebergSink {
 
     assertThat(stats.totalRowCount).isEqualTo(rows.size());
     // All 4 buckets should've been written to
-    assertThat(stats.writersPerBucket.size()).isEqualTo(numBuckets);
-    assertThat(stats.numFilesPerBucket.size()).isEqualTo(numBuckets);
+    assertThat(stats.writersPerBucket).hasSize(numBuckets);
+    assertThat(stats.numFilesPerBucket).hasSize(numBuckets);
     // Writer expectation (2 writers per bucket):
     // - Bucket0 -> Writers [0, 4]
     // - Bucket1 -> Writers [1, 5]
diff --git a/flink/v1.20/flink/src/test/java/org/apache/iceberg/flink/sink/dynamic/TestDynamicIcebergSink.java b/flink/v1.20/flink/src/test/java/org/apache/iceberg/flink/sink/dynamic/TestDynamicIcebergSink.java
index 4ee4ede46d..9765f2f057 100644
--- a/flink/v1.20/flink/src/test/java/org/apache/iceberg/flink/sink/dynamic/TestDynamicIcebergSink.java
+++ b/flink/v1.20/flink/src/test/java/org/apache/iceberg/flink/sink/dynamic/TestDynamicIcebergSink.java
@@ -497,7 +497,7 @@ class TestDynamicIcebergSink extends TestFlinkIcebergSinkBase {
         records.add(record);
       }
 
-      assertThat(records.size()).isEqualTo(1);
+      assertThat(records).hasSize(1);
       Record actual = records.get(0);
       DynamicIcebergDataImpl input = rows.get(0);
       assertThat(actual.get(0)).isEqualTo(input.rowProvided.getField(0));
diff --git a/flink/v1.20/flink/src/test/java/org/apache/iceberg/flink/sink/dynamic/TestDynamicWriter.java b/flink/v1.20/flink/src/test/java/org/apache/iceberg/flink/sink/dynamic/TestDynamicWriter.java
index 0c223f3237..f634d01fb3 100644
--- a/flink/v1.20/flink/src/test/java/org/apache/iceberg/flink/sink/dynamic/TestDynamicWriter.java
+++ b/flink/v1.20/flink/src/test/java/org/apache/iceberg/flink/sink/dynamic/TestDynamicWriter.java
@@ -18,8 +18,8 @@
  */
 package org.apache.iceberg.flink.sink.dynamic;
 
+import static org.assertj.core.api.Assertions.assertThat;
 import static org.assertj.core.api.Assertions.assertThatThrownBy;
-import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
 
 import java.io.File;
 import java.net.URI;
@@ -59,7 +59,7 @@ class TestDynamicWriter extends TestFlinkIcebergSinkBase {
     dynamicWriter.write(record2, null);
     Collection<DynamicWriteResult> writeResults = dynamicWriter.prepareCommit();
 
-    assertThat(writeResults.size()).isEqualTo(2);
+    assertThat(writeResults).hasSize(2);
     assertThat(getNumDataFiles(table1)).isEqualTo(1);
     assertThat(
             dynamicWriter
@@ -85,7 +85,7 @@ class TestDynamicWriter extends TestFlinkIcebergSinkBase {
     dynamicWriter.write(record2, null);
     writeResults = dynamicWriter.prepareCommit();
 
-    assertThat(writeResults.size()).isEqualTo(2);
+    assertThat(writeResults).hasSize(2);
     assertThat(getNumDataFiles(table1)).isEqualTo(2);
     assertThat(
             dynamicWriter
diff --git a/flink/v1.20/flink/src/test/java/org/apache/iceberg/flink/sink/dynamic/TestEvolveSchemaVisitor.java b/flink/v1.20/flink/src/test/java/org/apache/iceberg/flink/sink/dynamic/TestEvolveSchemaVisitor.java
index 58ee845291..d67b46849d 100644
--- a/flink/v1.20/flink/src/test/java/org/apache/iceberg/flink/sink/dynamic/TestEvolveSchemaVisitor.java
+++ b/flink/v1.20/flink/src/test/java/org/apache/iceberg/flink/sink/dynamic/TestEvolveSchemaVisitor.java
@@ -101,7 +101,7 @@ public class TestEvolveSchemaVisitor {
     UpdateSchema updateApi = loadUpdateApi(existingSchema, 0);
     EvolveSchemaVisitor.visit(updateApi, existingSchema, new Schema());
     Schema newSchema = updateApi.apply();
-    assertThat(newSchema.asStruct().fields().size()).isEqualTo(14);
+    assertThat(newSchema.asStruct().fields()).hasSize(14);
     assertThat(newSchema.columns().stream().allMatch(Types.NestedField::isOptional)).isTrue();
   }
 
@@ -369,7 +369,7 @@ public class TestEvolveSchemaVisitor {
     UpdateSchema updateApi = loadUpdateApi(currentSchema, 0);
     EvolveSchemaVisitor.visit(updateApi, currentSchema, targetSchema);
     Schema applied = updateApi.apply();
-    assertThat(applied.asStruct().fields().size()).isEqualTo(1);
+    assertThat(applied.asStruct().fields()).hasSize(1);
     assertThat(applied.asStruct().fields().get(0).type()).isEqualTo(LongType.get());
   }
 
@@ -382,7 +382,7 @@ public class TestEvolveSchemaVisitor {
     UpdateSchema updateApi = loadUpdateApi(currentSchema, 0);
     EvolveSchemaVisitor.visit(updateApi, currentSchema, targetSchema);
     Schema applied = updateApi.apply();
-    assertThat(applied.asStruct().fields().size()).isEqualTo(1);
+    assertThat(applied.asStruct().fields()).hasSize(1);
     assertThat(applied.asStruct().fields().get(0).type()).isEqualTo(DoubleType.get());
   }
 
diff --git a/flink/v1.20/flink/src/test/java/org/apache/iceberg/flink/sink/dynamic/TestLRUCache.java b/flink/v1.20/flink/src/test/java/org/apache/iceberg/flink/sink/dynamic/TestLRUCache.java
index 59a020a496..679d3de978 100644
--- a/flink/v1.20/flink/src/test/java/org/apache/iceberg/flink/sink/dynamic/TestLRUCache.java
+++ b/flink/v1.20/flink/src/test/java/org/apache/iceberg/flink/sink/dynamic/TestLRUCache.java
@@ -34,8 +34,7 @@ class TestLRUCache {
     LRUCache<Integer, Integer> cache = new LRUCache<>(1, NO_OP_CALLBACK);
     cache.put(1, 1);
 
-    assertThat(cache.size()).isEqualTo(1);
-    assertThat(cache).containsExactlyEntriesOf(Map.of(1, 1));
+    assertThat(cache).hasSize(1).containsEntry(1, 1);
   }
 
   @Test
@@ -43,7 +42,7 @@ class TestLRUCache {
     LRUCache<Integer, Integer> cache = new LRUCache<>(1, NO_OP_CALLBACK);
     cache.put(1, 123);
 
-    assertThat(cache.size()).isEqualTo(1);
+    assertThat(cache).hasSize(1);
     assertThat(cache.get(1)).isEqualTo(123);
   }
 
@@ -59,8 +58,7 @@ class TestLRUCache {
 
     cache.put(3, 3); // "2" should be evicted
 
-    assertThat(cache.size()).isEqualTo(2);
-    assertThat(cache).containsExactly(Map.entry(1, 1), Map.entry(3, 3));
+    assertThat(cache).hasSize(2).containsEntry(1, 1).containsEntry(3, 3);
   }
 
   @Test
diff --git a/flink/v1.20/flink/src/test/java/org/apache/iceberg/flink/sink/shuffle/TestMapRangePartitioner.java b/flink/v1.20/flink/src/test/java/org/apache/iceberg/flink/sink/shuffle/TestMapRangePartitioner.java
index c95a9955b1..a59ed3b1c7 100644
--- a/flink/v1.20/flink/src/test/java/org/apache/iceberg/flink/sink/shuffle/TestMapRangePartitioner.java
+++ b/flink/v1.20/flink/src/test/java/org/apache/iceberg/flink/sink/shuffle/TestMapRangePartitioner.java
@@ -388,7 +388,7 @@ public class TestMapRangePartitioner {
       Map<Integer, Pair<AtomicLong, Set<RowData>>> partitionResults,
       double maxDriftPercentage) {
 
-    assertThat(partitionResults.size()).isEqualTo(expectedAssignmentInfo.size());
+    assertThat(partitionResults).hasSameSizeAs(expectedAssignmentInfo);
 
     List<Integer> expectedAssignedKeyCounts =
         Lists.newArrayListWithExpectedSize(expectedAssignmentInfo.size());
diff --git a/flink/v2.0/flink/src/test/java/org/apache/iceberg/flink/data/TestFlinkParquetReader.java b/flink/v2.0/flink/src/test/java/org/apache/iceberg/flink/data/TestFlinkParquetReader.java
index bb7c4c2e72..e6781356f7 100644
--- a/flink/v2.0/flink/src/test/java/org/apache/iceberg/flink/data/TestFlinkParquetReader.java
+++ b/flink/v2.0/flink/src/test/java/org/apache/iceberg/flink/data/TestFlinkParquetReader.java
@@ -166,7 +166,7 @@ public class TestFlinkParquetReader extends DataTestBase {
     ParquetValueReader<RowData> reader =
         FlinkParquetReaders.buildReader(new Schema(SUPPORTED_PRIMITIVES.fields()), fileSchema);
 
-    assertThat(reader.columns().size()).isEqualTo(SUPPORTED_PRIMITIVES.fields().size());
+    assertThat(reader.columns()).hasSameSizeAs(SUPPORTED_PRIMITIVES.fields());
   }
 
   @Test
diff --git a/flink/v2.0/flink/src/test/java/org/apache/iceberg/flink/data/TestRowDataProjection.java b/flink/v2.0/flink/src/test/java/org/apache/iceberg/flink/data/TestRowDataProjection.java
index d078b22284..4e5b38ffb0 100644
--- a/flink/v2.0/flink/src/test/java/org/apache/iceberg/flink/data/TestRowDataProjection.java
+++ b/flink/v2.0/flink/src/test/java/org/apache/iceberg/flink/data/TestRowDataProjection.java
@@ -164,7 +164,7 @@ public class TestRowDataProjection {
 
     // Project id only.
     Schema idOnly = new Schema(Types.NestedField.required(0, "id", Types.LongType.get()));
-    assertThat(idOnly.columns().size()).isGreaterThan(0);
+    assertThat(idOnly.columns()).isNotEmpty();
     generateAndValidate(schema, idOnly);
     testEqualsAndHashCode(schema, idOnly, rowData, copyRowData, otherRowData);
     testEqualsAndHashCode(
@@ -177,7 +177,7 @@ public class TestRowDataProjection {
                 3,
                 "location",
                 Types.StructType.of(Types.NestedField.required(1, "lat", Types.FloatType.get()))));
-    assertThat(latOnly.columns().size()).isGreaterThan(0);
+    assertThat(latOnly.columns()).isNotEmpty();
     generateAndValidate(schema, latOnly);
     testEqualsAndHashCode(schema, latOnly, rowData, copyRowData, otherRowData);
     testEqualsAndHashCode(
@@ -190,7 +190,7 @@ public class TestRowDataProjection {
                 3,
                 "location",
                 Types.StructType.of(Types.NestedField.required(2, "long", Types.FloatType.get()))));
-    assertThat(longOnly.columns().size()).isGreaterThan(0);
+    assertThat(longOnly.columns()).isNotEmpty();
     generateAndValidate(schema, longOnly);
     testEqualsAndHashCode(schema, longOnly, rowData, copyRowData, otherRowData);
     testEqualsAndHashCode(
@@ -198,7 +198,7 @@ public class TestRowDataProjection {
 
     // Project location.
     Schema locationOnly = schema.select("location");
-    assertThat(locationOnly.columns().size()).isGreaterThan(0);
+    assertThat(locationOnly.columns()).isNotEmpty();
     generateAndValidate(schema, locationOnly);
     testEqualsAndHashCode(schema, locationOnly, rowData, copyRowData, otherRowData);
     testEqualsAndHashCode(
@@ -253,12 +253,12 @@ public class TestRowDataProjection {
 
     // Project id only.
     Schema idOnly = schema.select("row_id");
-    assertThat(idOnly.columns().size()).isGreaterThan(0);
+    assertThat(idOnly.columns()).isNotEmpty();
     generateAndValidate(schema, idOnly);
 
     // Project map only.
     Schema mapOnly = schema.select("map_of_primitives");
-    assertThat(mapOnly.columns().size()).isGreaterThan(0);
+    assertThat(mapOnly.columns()).isNotEmpty();
     generateAndValidate(schema, mapOnly);
 
     // Project all.
@@ -311,12 +311,12 @@ public class TestRowDataProjection {
 
     // Project id only.
     Schema idOnly = schema.select("row_id");
-    assertThat(idOnly.columns().size()).isGreaterThan(0);
+    assertThat(idOnly.columns()).isNotEmpty();
     generateAndValidate(schema, idOnly);
 
     // Project map only.
     Schema mapOnly = schema.select("map");
-    assertThat(mapOnly.columns().size()).isGreaterThan(0);
+    assertThat(mapOnly.columns()).isNotEmpty();
     generateAndValidate(schema, mapOnly);
 
     // Project all.
@@ -415,12 +415,12 @@ public class TestRowDataProjection {
 
     // Project id only.
     Schema idOnly = schema.select("row_id");
-    assertThat(idOnly.columns().size()).isGreaterThan(0);
+    assertThat(idOnly.columns()).isNotEmpty();
     generateAndValidate(schema, idOnly);
 
     // Project list only.
     Schema arrayOnly = schema.select("array_of_int");
-    assertThat(arrayOnly.columns().size()).isGreaterThan(0);
+    assertThat(arrayOnly.columns()).isNotEmpty();
     generateAndValidate(schema, arrayOnly);
 
     // Project all.
@@ -477,12 +477,12 @@ public class TestRowDataProjection {
 
     // Project id only.
     Schema idOnly = schema.select("row_id");
-    assertThat(idOnly.columns().size()).isGreaterThan(0);
+    assertThat(idOnly.columns()).isNotEmpty();
     generateAndValidate(schema, idOnly);
 
     // Project list only.
     Schema arrayOnly = schema.select("array_of_struct");
-    assertThat(arrayOnly.columns().size()).isGreaterThan(0);
+    assertThat(arrayOnly.columns()).isNotEmpty();
     generateAndValidate(schema, arrayOnly);
 
     // Project all.
diff --git a/flink/v2.0/flink/src/test/java/org/apache/iceberg/flink/sink/TestBucketPartitionerFlinkIcebergSink.java b/flink/v2.0/flink/src/test/java/org/apache/iceberg/flink/sink/TestBucketPartitionerFlinkIcebergSink.java
index 69afba1202..caf0ac6f21 100644
--- a/flink/v2.0/flink/src/test/java/org/apache/iceberg/flink/sink/TestBucketPartitionerFlinkIcebergSink.java
+++ b/flink/v2.0/flink/src/test/java/org/apache/iceberg/flink/sink/TestBucketPartitionerFlinkIcebergSink.java
@@ -153,8 +153,8 @@ public class TestBucketPartitionerFlinkIcebergSink {
 
     assertThat(stats.totalRowCount).isEqualTo(rows.size());
     // All 4 buckets should've been written to
-    assertThat(stats.writersPerBucket.size()).isEqualTo(numBuckets);
-    assertThat(stats.numFilesPerBucket.size()).isEqualTo(numBuckets);
+    assertThat(stats.writersPerBucket).hasSize(numBuckets);
+    assertThat(stats.numFilesPerBucket).hasSize(numBuckets);
     // Writer expectation (2 writers per bucket):
     // - Bucket0 -> Writers [0, 4]
     // - Bucket1 -> Writers [1, 5]
diff --git a/flink/v2.0/flink/src/test/java/org/apache/iceberg/flink/sink/dynamic/TestDynamicIcebergSink.java b/flink/v2.0/flink/src/test/java/org/apache/iceberg/flink/sink/dynamic/TestDynamicIcebergSink.java
index 4ee4ede46d..9765f2f057 100644
--- a/flink/v2.0/flink/src/test/java/org/apache/iceberg/flink/sink/dynamic/TestDynamicIcebergSink.java
+++ b/flink/v2.0/flink/src/test/java/org/apache/iceberg/flink/sink/dynamic/TestDynamicIcebergSink.java
@@ -497,7 +497,7 @@ class TestDynamicIcebergSink extends TestFlinkIcebergSinkBase {
         records.add(record);
       }
 
-      assertThat(records.size()).isEqualTo(1);
+      assertThat(records).hasSize(1);
       Record actual = records.get(0);
       DynamicIcebergDataImpl input = rows.get(0);
       assertThat(actual.get(0)).isEqualTo(input.rowProvided.getField(0));
diff --git a/flink/v2.0/flink/src/test/java/org/apache/iceberg/flink/sink/dynamic/TestDynamicWriter.java b/flink/v2.0/flink/src/test/java/org/apache/iceberg/flink/sink/dynamic/TestDynamicWriter.java
index 0c223f3237..f634d01fb3 100644
--- a/flink/v2.0/flink/src/test/java/org/apache/iceberg/flink/sink/dynamic/TestDynamicWriter.java
+++ b/flink/v2.0/flink/src/test/java/org/apache/iceberg/flink/sink/dynamic/TestDynamicWriter.java
@@ -18,8 +18,8 @@
  */
 package org.apache.iceberg.flink.sink.dynamic;
 
+import static org.assertj.core.api.Assertions.assertThat;
 import static org.assertj.core.api.Assertions.assertThatThrownBy;
-import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
 
 import java.io.File;
 import java.net.URI;
@@ -59,7 +59,7 @@ class TestDynamicWriter extends TestFlinkIcebergSinkBase {
     dynamicWriter.write(record2, null);
     Collection<DynamicWriteResult> writeResults = dynamicWriter.prepareCommit();
 
-    assertThat(writeResults.size()).isEqualTo(2);
+    assertThat(writeResults).hasSize(2);
     assertThat(getNumDataFiles(table1)).isEqualTo(1);
     assertThat(
             dynamicWriter
@@ -85,7 +85,7 @@ class TestDynamicWriter extends TestFlinkIcebergSinkBase {
     dynamicWriter.write(record2, null);
     writeResults = dynamicWriter.prepareCommit();
 
-    assertThat(writeResults.size()).isEqualTo(2);
+    assertThat(writeResults).hasSize(2);
     assertThat(getNumDataFiles(table1)).isEqualTo(2);
     assertThat(
             dynamicWriter
diff --git a/flink/v2.0/flink/src/test/java/org/apache/iceberg/flink/sink/dynamic/TestEvolveSchemaVisitor.java b/flink/v2.0/flink/src/test/java/org/apache/iceberg/flink/sink/dynamic/TestEvolveSchemaVisitor.java
index 58ee845291..d67b46849d 100644
--- a/flink/v2.0/flink/src/test/java/org/apache/iceberg/flink/sink/dynamic/TestEvolveSchemaVisitor.java
+++ b/flink/v2.0/flink/src/test/java/org/apache/iceberg/flink/sink/dynamic/TestEvolveSchemaVisitor.java
@@ -101,7 +101,7 @@ public class TestEvolveSchemaVisitor {
     UpdateSchema updateApi = loadUpdateApi(existingSchema, 0);
     EvolveSchemaVisitor.visit(updateApi, existingSchema, new Schema());
     Schema newSchema = updateApi.apply();
-    assertThat(newSchema.asStruct().fields().size()).isEqualTo(14);
+    assertThat(newSchema.asStruct().fields()).hasSize(14);
     assertThat(newSchema.columns().stream().allMatch(Types.NestedField::isOptional)).isTrue();
   }
 
@@ -369,7 +369,7 @@ public class TestEvolveSchemaVisitor {
     UpdateSchema updateApi = loadUpdateApi(currentSchema, 0);
     EvolveSchemaVisitor.visit(updateApi, currentSchema, targetSchema);
     Schema applied = updateApi.apply();
-    assertThat(applied.asStruct().fields().size()).isEqualTo(1);
+    assertThat(applied.asStruct().fields()).hasSize(1);
     assertThat(applied.asStruct().fields().get(0).type()).isEqualTo(LongType.get());
   }
 
@@ -382,7 +382,7 @@ public class TestEvolveSchemaVisitor {
     UpdateSchema updateApi = loadUpdateApi(currentSchema, 0);
     EvolveSchemaVisitor.visit(updateApi, currentSchema, targetSchema);
     Schema applied = updateApi.apply();
-    assertThat(applied.asStruct().fields().size()).isEqualTo(1);
+    assertThat(applied.asStruct().fields()).hasSize(1);
     assertThat(applied.asStruct().fields().get(0).type()).isEqualTo(DoubleType.get());
   }
 
diff --git a/flink/v2.0/flink/src/test/java/org/apache/iceberg/flink/sink/dynamic/TestLRUCache.java b/flink/v2.0/flink/src/test/java/org/apache/iceberg/flink/sink/dynamic/TestLRUCache.java
index 59a020a496..679d3de978 100644
--- a/flink/v2.0/flink/src/test/java/org/apache/iceberg/flink/sink/dynamic/TestLRUCache.java
+++ b/flink/v2.0/flink/src/test/java/org/apache/iceberg/flink/sink/dynamic/TestLRUCache.java
@@ -34,8 +34,7 @@ class TestLRUCache {
     LRUCache<Integer, Integer> cache = new LRUCache<>(1, NO_OP_CALLBACK);
     cache.put(1, 1);
 
-    assertThat(cache.size()).isEqualTo(1);
-    assertThat(cache).containsExactlyEntriesOf(Map.of(1, 1));
+    assertThat(cache).hasSize(1).containsEntry(1, 1);
   }
 
   @Test
@@ -43,7 +42,7 @@ class TestLRUCache {
     LRUCache<Integer, Integer> cache = new LRUCache<>(1, NO_OP_CALLBACK);
     cache.put(1, 123);
 
-    assertThat(cache.size()).isEqualTo(1);
+    assertThat(cache).hasSize(1);
     assertThat(cache.get(1)).isEqualTo(123);
   }
 
@@ -59,8 +58,7 @@ class TestLRUCache {
 
     cache.put(3, 3); // "2" should be evicted
 
-    assertThat(cache.size()).isEqualTo(2);
-    assertThat(cache).containsExactly(Map.entry(1, 1), Map.entry(3, 3));
+    assertThat(cache).hasSize(2).containsEntry(1, 1).containsEntry(3, 3);
   }
 
   @Test
diff --git a/flink/v2.0/flink/src/test/java/org/apache/iceberg/flink/sink/shuffle/TestMapRangePartitioner.java b/flink/v2.0/flink/src/test/java/org/apache/iceberg/flink/sink/shuffle/TestMapRangePartitioner.java
index c95a9955b1..a59ed3b1c7 100644
--- a/flink/v2.0/flink/src/test/java/org/apache/iceberg/flink/sink/shuffle/TestMapRangePartitioner.java
+++ b/flink/v2.0/flink/src/test/java/org/apache/iceberg/flink/sink/shuffle/TestMapRangePartitioner.java
@@ -388,7 +388,7 @@ public class TestMapRangePartitioner {
       Map<Integer, Pair<AtomicLong, Set<RowData>>> partitionResults,
       double maxDriftPercentage) {
 
-    assertThat(partitionResults.size()).isEqualTo(expectedAssignmentInfo.size());
+    assertThat(partitionResults).hasSameSizeAs(expectedAssignmentInfo);
 
     List<Integer> expectedAssignedKeyCounts =
         Lists.newArrayListWithExpectedSize(expectedAssignmentInfo.size());
diff --git a/kafka-connect/kafka-connect-transforms/src/test/java/org/apache/iceberg/connect/transforms/TestJsonToMapTransform.java b/kafka-connect/kafka-connect-transforms/src/test/java/org/apache/iceberg/connect/transforms/TestJsonToMapTransform.java
index 5ed3eb0ceb..4d8b0dd40f 100644
--- a/kafka-connect/kafka-connect-transforms/src/test/java/org/apache/iceberg/connect/transforms/TestJsonToMapTransform.java
+++ b/kafka-connect/kafka-connect-transforms/src/test/java/org/apache/iceberg/connect/transforms/TestJsonToMapTransform.java
@@ -164,7 +164,7 @@ public class TestJsonToMapTransform extends FileLoads {
       SinkRecord result = smt.apply(record);
       assertThat(result.value()).isInstanceOf(Struct.class);
       Struct resultStruct = (Struct) result.value();
-      assertThat(resultStruct.schema().fields().size()).isEqualTo(19);
+      assertThat(resultStruct.schema().fields()).hasSize(19);
       assertThat(resultStruct.get("string")).isEqualTo("string");
     }
   }
diff --git a/kafka-connect/kafka-connect/src/test/java/org/apache/iceberg/connect/data/TestSinkWriter.java b/kafka-connect/kafka-connect/src/test/java/org/apache/iceberg/connect/data/TestSinkWriter.java
index 0ef2fd4f4b..a14ebcab73 100644
--- a/kafka-connect/kafka-connect/src/test/java/org/apache/iceberg/connect/data/TestSinkWriter.java
+++ b/kafka-connect/kafka-connect/src/test/java/org/apache/iceberg/connect/data/TestSinkWriter.java
@@ -89,7 +89,7 @@ public class TestSinkWriter {
     Map<String, Object> value = ImmutableMap.of();
 
     List<IcebergWriterResult> writerResults = sinkWriterTest(value, config);
-    assertThat(writerResults.size()).isEqualTo(1);
+    assertThat(writerResults).hasSize(1);
     IcebergWriterResult writerResult = writerResults.get(0);
     assertThat(writerResult.tableIdentifier()).isEqualTo(TABLE_IDENTIFIER);
   }
@@ -102,7 +102,7 @@ public class TestSinkWriter {
     Map<String, Object> value = ImmutableMap.of();
 
     List<IcebergWriterResult> writerResults = sinkWriterTest(value, config);
-    assertThat(writerResults.size()).isEqualTo(0);
+    assertThat(writerResults).isEmpty();
   }
 
   @Test
@@ -117,7 +117,7 @@ public class TestSinkWriter {
 
     Map<String, Object> value = ImmutableMap.of(ROUTE_FIELD, "val");
     List<IcebergWriterResult> writerResults = sinkWriterTest(value, config);
-    assertThat(writerResults.size()).isEqualTo(1);
+    assertThat(writerResults).hasSize(1);
     IcebergWriterResult writerResult = writerResults.get(0);
     assertThat(writerResult.tableIdentifier()).isEqualTo(TABLE_IDENTIFIER);
   }
@@ -134,7 +134,7 @@ public class TestSinkWriter {
 
     Map<String, Object> value = ImmutableMap.of(ROUTE_FIELD, "foobar");
     List<IcebergWriterResult> writerResults = sinkWriterTest(value, config);
-    assertThat(writerResults.size()).isEqualTo(0);
+    assertThat(writerResults).hasSize(0);
   }
 
   @Test
@@ -148,7 +148,7 @@ public class TestSinkWriter {
     Map<String, Object> value = ImmutableMap.of(ROUTE_FIELD, TABLE_IDENTIFIER.toString());
 
     List<IcebergWriterResult> writerResults = sinkWriterTest(value, config);
-    assertThat(writerResults.size()).isEqualTo(1);
+    assertThat(writerResults).hasSize(1);
     IcebergWriterResult writerResult = writerResults.get(0);
     assertThat(writerResult.tableIdentifier()).isEqualTo(TABLE_IDENTIFIER);
   }
@@ -164,7 +164,7 @@ public class TestSinkWriter {
     Map<String, Object> value = ImmutableMap.of(ROUTE_FIELD, "db.foobar");
 
     List<IcebergWriterResult> writerResults = sinkWriterTest(value, config);
-    assertThat(writerResults.size()).isEqualTo(0);
+    assertThat(writerResults).hasSize(0);
   }
 
   private List<IcebergWriterResult> sinkWriterTest(
diff --git a/parquet/src/test/java/org/apache/iceberg/parquet/TestVariantMetrics.java b/parquet/src/test/java/org/apache/iceberg/parquet/TestVariantMetrics.java
index 813de36f06..84a9bc67dd 100644
--- a/parquet/src/test/java/org/apache/iceberg/parquet/TestVariantMetrics.java
+++ b/parquet/src/test/java/org/apache/iceberg/parquet/TestVariantMetrics.java
@@ -117,7 +117,7 @@ public class TestVariantMetrics {
     assertThat(metrics.nullValueCounts()).isEqualTo(Map.of(1, 0L, 2, 1L));
     assertThat(metrics.nanValueCounts()).isEqualTo(Map.of());
 
-    assertThat(metrics.lowerBounds().size()).isEqualTo(2);
+    assertThat(metrics.lowerBounds()).hasSize(2);
     assertThat(metrics.lowerBounds().get(1))
         .extracting(bytes -> Conversions.fromByteBuffer(Types.LongType.get(), bytes))
         .isEqualTo(0L);
@@ -129,7 +129,7 @@ public class TestVariantMetrics {
             })
         .isEqualTo(value);
 
-    assertThat(metrics.upperBounds().size()).isEqualTo(2);
+    assertThat(metrics.upperBounds()).hasSize(2);
     assertThat(metrics.upperBounds().get(1))
         .extracting(bytes -> Conversions.fromByteBuffer(Types.LongType.get(), bytes))
         .isEqualTo(2L);
@@ -158,7 +158,7 @@ public class TestVariantMetrics {
     assertThat(metrics.nullValueCounts()).isEqualTo(Map.of(1, 0L, 2, 1L));
     assertThat(metrics.nanValueCounts()).isEqualTo(Map.of());
 
-    assertThat(metrics.lowerBounds().size()).isEqualTo(2);
+    assertThat(metrics.lowerBounds()).hasSize(2);
     assertThat(metrics.lowerBounds().get(1))
         .extracting(bytes -> Conversions.fromByteBuffer(Types.LongType.get(), bytes))
         .isEqualTo(0L);
@@ -170,7 +170,7 @@ public class TestVariantMetrics {
             })
         .isEqualTo(value);
 
-    assertThat(metrics.upperBounds().size()).isEqualTo(2);
+    assertThat(metrics.upperBounds()).hasSize(2);
     assertThat(metrics.upperBounds().get(1))
         .extracting(bytes -> Conversions.fromByteBuffer(Types.LongType.get(), bytes))
         .isEqualTo(3L);
@@ -318,7 +318,7 @@ public class TestVariantMetrics {
     expectedBounds.put("$['c']", str);
     expectedBounds.put("$['d']['e']", dec);
 
-    assertThat(metrics.lowerBounds().size()).isEqualTo(2);
+    assertThat(metrics.lowerBounds()).hasSize(2);
     assertThat(metrics.lowerBounds().get(1))
         .extracting(bytes -> Conversions.fromByteBuffer(Types.LongType.get(), bytes))
         .isEqualTo(0L);
@@ -326,7 +326,7 @@ public class TestVariantMetrics {
         .extracting(bytes -> Variant.from(bytes).value())
         .isEqualTo(expectedBounds);
 
-    assertThat(metrics.upperBounds().size()).isEqualTo(2);
+    assertThat(metrics.upperBounds()).hasSize(2);
     assertThat(metrics.upperBounds().get(1))
         .extracting(bytes -> Conversions.fromByteBuffer(Types.LongType.get(), bytes))
         .isEqualTo(4L);
@@ -374,7 +374,7 @@ public class TestVariantMetrics {
     expectedBounds.put("$['a']", date);
     expectedBounds.put("$['b']", num);
 
-    assertThat(metrics.lowerBounds().size()).isEqualTo(2);
+    assertThat(metrics.lowerBounds()).hasSize(2);
     assertThat(metrics.lowerBounds().get(1))
         .extracting(bytes -> Conversions.fromByteBuffer(Types.LongType.get(), bytes))
         .isEqualTo(0L);
@@ -382,7 +382,7 @@ public class TestVariantMetrics {
         .extracting(bytes -> Variant.from(bytes).value())
         .isEqualTo(expectedBounds);
 
-    assertThat(metrics.upperBounds().size()).isEqualTo(2);
+    assertThat(metrics.upperBounds()).hasSize(2);
     assertThat(metrics.upperBounds().get(1))
         .extracting(bytes -> Conversions.fromByteBuffer(Types.LongType.get(), bytes))
         .isEqualTo(4L);
@@ -432,7 +432,7 @@ public class TestVariantMetrics {
     expectedBounds.put("$['a']", date);
     expectedBounds.put("$['d']['e']", dec);
 
-    assertThat(metrics.lowerBounds().size()).isEqualTo(2);
+    assertThat(metrics.lowerBounds()).hasSize(2);
     assertThat(metrics.lowerBounds().get(1))
         .extracting(bytes -> Conversions.fromByteBuffer(Types.LongType.get(), bytes))
         .isEqualTo(0L);
@@ -440,7 +440,7 @@ public class TestVariantMetrics {
         .extracting(bytes -> Variant.from(bytes).value())
         .isEqualTo(expectedBounds);
 
-    assertThat(metrics.upperBounds().size()).isEqualTo(2);
+    assertThat(metrics.upperBounds()).hasSize(2);
     assertThat(metrics.upperBounds().get(1))
         .extracting(bytes -> Conversions.fromByteBuffer(Types.LongType.get(), bytes))
         .isEqualTo(5L);
diff --git a/parquet/src/test/java/org/apache/iceberg/parquet/TestVariantWriters.java b/parquet/src/test/java/org/apache/iceberg/parquet/TestVariantWriters.java
index f3d58ab00e..754f0c9ee3 100644
--- a/parquet/src/test/java/org/apache/iceberg/parquet/TestVariantWriters.java
+++ b/parquet/src/test/java/org/apache/iceberg/parquet/TestVariantWriters.java
@@ -221,7 +221,7 @@ public class TestVariantWriters {
     List<Record> actual =
         writeAndRead((id, name) -> ParquetVariantUtil.toParquetSchema(variant.value()), expected);
 
-    assertThat(actual.size()).isEqualTo(expected.size());
+    assertThat(actual).hasSameSizeAs(expected);
 
     for (int i = 0; i < expected.size(); i += 1) {
       InternalTestHelpers.assertEquals(SCHEMA.asStruct(), expected.get(i), actual.get(i));
diff --git a/spark/v3.4/spark/src/test/java/org/apache/iceberg/spark/data/TestSparkParquetReader.java b/spark/v3.4/spark/src/test/java/org/apache/iceberg/spark/data/TestSparkParquetReader.java
index 4969f9f12f..9ae8b8cbe5 100644
--- a/spark/v3.4/spark/src/test/java/org/apache/iceberg/spark/data/TestSparkParquetReader.java
+++ b/spark/v3.4/spark/src/test/java/org/apache/iceberg/spark/data/TestSparkParquetReader.java
@@ -185,7 +185,7 @@ public class TestSparkParquetReader extends AvroDataTestBase {
 
     InputFile parquetInputFile = Files.localInput(outputFilePath);
     List<InternalRow> readRows = rowsFromFile(parquetInputFile, schema);
-    assertThat(rows.size()).isEqualTo(readRows.size());
+    assertThat(rows).hasSameSizeAs(readRows);
     assertThat(readRows).isEqualTo(rows);
 
     // Now we try to import that file as an Iceberg table to make sure Iceberg can read
@@ -193,7 +193,7 @@ public class TestSparkParquetReader extends AvroDataTestBase {
     Table int96Table = tableFromInputFile(parquetInputFile, schema);
     List<Record> tableRecords = Lists.newArrayList(IcebergGenerics.read(int96Table).build());
 
-    assertThat(rows.size()).isEqualTo(tableRecords.size());
+    assertThat(rows).hasSameSizeAs(tableRecords);
 
     for (int i = 0; i < tableRecords.size(); i++) {
       GenericsHelpers.assertEqualsUnsafe(schema.asStruct(), tableRecords.get(i), rows.get(i));
diff --git a/spark/v3.4/spark/src/test/java/org/apache/iceberg/spark/source/DataFrameWriteTestBase.java b/spark/v3.4/spark/src/test/java/org/apache/iceberg/spark/source/DataFrameWriteTestBase.java
index 756370eec0..05dec42a03 100644
--- a/spark/v3.4/spark/src/test/java/org/apache/iceberg/spark/source/DataFrameWriteTestBase.java
+++ b/spark/v3.4/spark/src/test/java/org/apache/iceberg/spark/source/DataFrameWriteTestBase.java
@@ -97,7 +97,7 @@ public abstract class DataFrameWriteTestBase extends ScanTestBase {
     }
 
     // verify that the dataframe matches
-    assertThat(rows.size()).isEqualTo(records.size());
+    assertThat(rows).hasSameSizeAs(records);
     Iterator<GenericData.Record> recordIter = records.iterator();
     for (InternalRow row : rows) {
       assertEqualsUnsafe(schema.asStruct(), recordIter.next(), row);
diff --git a/spark/v3.5/spark/src/test/java/org/apache/iceberg/spark/source/DataFrameWriteTestBase.java b/spark/v3.5/spark/src/test/java/org/apache/iceberg/spark/source/DataFrameWriteTestBase.java
index 756370eec0..05dec42a03 100644
--- a/spark/v3.5/spark/src/test/java/org/apache/iceberg/spark/source/DataFrameWriteTestBase.java
+++ b/spark/v3.5/spark/src/test/java/org/apache/iceberg/spark/source/DataFrameWriteTestBase.java
@@ -97,7 +97,7 @@ public abstract class DataFrameWriteTestBase extends ScanTestBase {
     }
 
     // verify that the dataframe matches
-    assertThat(rows.size()).isEqualTo(records.size());
+    assertThat(rows).hasSameSizeAs(records);
     Iterator<GenericData.Record> recordIter = records.iterator();
     for (InternalRow row : rows) {
       assertEqualsUnsafe(schema.asStruct(), recordIter.next(), row);
diff --git a/spark/v4.0/spark/src/test/java/org/apache/iceberg/spark/source/DataFrameWriteTestBase.java b/spark/v4.0/spark/src/test/java/org/apache/iceberg/spark/source/DataFrameWriteTestBase.java
index b1796b397c..45e09fc961 100644
--- a/spark/v4.0/spark/src/test/java/org/apache/iceberg/spark/source/DataFrameWriteTestBase.java
+++ b/spark/v4.0/spark/src/test/java/org/apache/iceberg/spark/source/DataFrameWriteTestBase.java
@@ -98,7 +98,7 @@ public abstract class DataFrameWriteTestBase extends ScanTestBase {
     }
 
     // verify that the dataframe matches
-    assertThat(rows.size()).isEqualTo(records.size());
+    assertThat(rows).hasSameSizeAs(records);
     Iterator<GenericData.Record> recordIter = records.iterator();
     for (InternalRow row : rows) {
       assertEqualsUnsafe(schema.asStruct(), recordIter.next(), row);