diff --git a/testing-modules/testing/pom.xml b/testing-modules/testing/pom.xml
index 1fd6357b87..c76045380b 100644
--- a/testing-modules/testing/pom.xml
+++ b/testing-modules/testing/pom.xml
@@ -154,6 +154,16 @@
+
+ org.assertj
+ assertj-assertions-generator-maven-plugin
+ ${assertj-generator.version}
+
+
+ com.baeldung.testing.assertj.custom.Person
+
+
+
@@ -164,6 +174,7 @@
21.0
3.1.0
3.6.1
+ 2.1.0
0.32
1.1.0
0.12
diff --git a/testing-modules/testing/src/main/java/com/baeldung/testing/assertj/custom/Car.java b/testing-modules/testing/src/main/java/com/baeldung/testing/assertj/custom/Car.java
new file mode 100644
index 0000000000..e52ffee8e5
--- /dev/null
+++ b/testing-modules/testing/src/main/java/com/baeldung/testing/assertj/custom/Car.java
@@ -0,0 +1,22 @@
+package com.baeldung.testing.assertj.custom;
+
+public class Car {
+ private String type;
+ private Person owner;
+
+ public Car(String type) {
+ this.type = type;
+ }
+
+ public String getType() {
+ return type;
+ }
+
+ public Person getOwner() {
+ return owner;
+ }
+
+ public void setOwner(Person owner) {
+ this.owner = owner;
+ }
+}
diff --git a/testing-modules/testing/src/main/java/com/baeldung/testing/assertj/custom/Person.java b/testing-modules/testing/src/main/java/com/baeldung/testing/assertj/custom/Person.java
new file mode 100644
index 0000000000..34afc480e4
--- /dev/null
+++ b/testing-modules/testing/src/main/java/com/baeldung/testing/assertj/custom/Person.java
@@ -0,0 +1,32 @@
+package com.baeldung.testing.assertj.custom;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class Person {
+ private String fullName;
+ private int age;
+ private List nicknames;
+
+ public Person(String fullName, int age) {
+ this.fullName = fullName;
+ this.age = age;
+ this.nicknames = new ArrayList<>();
+ }
+
+ public void addNickname(String nickname) {
+ nicknames.add(nickname);
+ }
+
+ public String getFullName() {
+ return fullName;
+ }
+
+ public int getAge() {
+ return age;
+ }
+
+ public List getNicknames() {
+ return nicknames;
+ }
+}
diff --git a/testing-modules/testing/src/test/java/com/baeldung/testing/assertj/custom/AssertJCustomAssertionsUnitTest.java b/testing-modules/testing/src/test/java/com/baeldung/testing/assertj/custom/AssertJCustomAssertionsUnitTest.java
new file mode 100644
index 0000000000..4c09311bac
--- /dev/null
+++ b/testing-modules/testing/src/test/java/com/baeldung/testing/assertj/custom/AssertJCustomAssertionsUnitTest.java
@@ -0,0 +1,44 @@
+package com.baeldung.testing.assertj.custom;
+
+import static com.baeldung.testing.assertj.custom.Assertions.assertThat;
+import static org.junit.Assert.fail;
+
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.ExpectedException;
+
+public class AssertJCustomAssertionsUnitTest {
+ @Rule
+ public ExpectedException thrown = ExpectedException.none();
+
+ @Test
+ public void whenPersonNameMatches_thenCorrect() {
+ Person person = new Person("John Doe", 20);
+ assertThat(person).hasFullName("John Doe");
+ }
+
+ @Test
+ public void whenPersonAgeLessThanEighteen_thenNotAdult() {
+ Person person = new Person("Jane Roe", 16);
+
+ try {
+ assertThat(person).isAdult();
+ fail();
+ } catch (AssertionError e) {
+ org.assertj.core.api.Assertions.assertThat(e).hasMessage("Expected person to be adult");
+ }
+ }
+
+ @Test
+ public void whenPersonDoesNotHaveAMatchingNickname_thenIncorrect() {
+ Person person = new Person("John Doe", 20);
+ person.addNickname("Nick");
+
+ try {
+ assertThat(person).hasNickname("John");
+ fail();
+ } catch (AssertionError e) {
+ org.assertj.core.api.Assertions.assertThat(e).hasMessage("Expected person to have nickname John");
+ }
+ }
+}
diff --git a/testing-modules/testing/src/test/java/com/baeldung/testing/assertj/custom/Assertions.java b/testing-modules/testing/src/test/java/com/baeldung/testing/assertj/custom/Assertions.java
new file mode 100644
index 0000000000..fcffb8fc6c
--- /dev/null
+++ b/testing-modules/testing/src/test/java/com/baeldung/testing/assertj/custom/Assertions.java
@@ -0,0 +1,9 @@
+package com.baeldung.testing.assertj.custom;
+
+public class Assertions {
+ public static PersonAssert assertThat(Person actual) {
+ return new PersonAssert(actual);
+ }
+
+ // static factory methods of other assertion classes
+}
diff --git a/testing-modules/testing/src/test/java/com/baeldung/testing/assertj/custom/PersonAssert.java b/testing-modules/testing/src/test/java/com/baeldung/testing/assertj/custom/PersonAssert.java
new file mode 100644
index 0000000000..d6cc585e96
--- /dev/null
+++ b/testing-modules/testing/src/test/java/com/baeldung/testing/assertj/custom/PersonAssert.java
@@ -0,0 +1,38 @@
+package com.baeldung.testing.assertj.custom;
+
+import org.assertj.core.api.AbstractAssert;
+
+public class PersonAssert extends AbstractAssert {
+
+ public PersonAssert(Person actual) {
+ super(actual, PersonAssert.class);
+ }
+
+ public static PersonAssert assertThat(Person actual) {
+ return new PersonAssert(actual);
+ }
+
+ public PersonAssert hasFullName(String fullName) {
+ isNotNull();
+ if (!actual.getFullName().equals(fullName)) {
+ failWithMessage("Expected person to have full name %s but was %s", fullName, actual.getFullName());
+ }
+ return this;
+ }
+
+ public PersonAssert isAdult() {
+ isNotNull();
+ if (actual.getAge() < 18) {
+ failWithMessage("Expected person to be adult");
+ }
+ return this;
+ }
+
+ public PersonAssert hasNickname(String nickName) {
+ isNotNull();
+ if (!actual.getNicknames().contains(nickName)) {
+ failWithMessage("Expected person to have nickname %s", nickName);
+ }
+ return this;
+ }
+}