From 9f418cd99643d3ef988adbd3748b6eda193df5cc Mon Sep 17 00:00:00 2001 From: jason-m-s <45552030+jason-m-s@users.noreply.github.com> Date: Tue, 14 Dec 2021 07:34:51 +0530 Subject: [PATCH] BAEL-5138: Implementation code for Lombok @With Methods (#11494) * BAEL-5138: Implementation code for Lombok @With Methods * BAEL-5138: Implementation code for Lombok @With Methods * Fixed a type issue in HolderUnitTest * Removed a constructor from User to avoid confusion with article --- .../java/com/baeldung/lombok/with/Device.java | 13 ++++++++++ .../java/com/baeldung/lombok/with/Holder.java | 16 +++++++++++++ .../baeldung/lombok/with/ImprovedUser.java | 14 +++++++++++ .../com/baeldung/lombok/with/KioskDevice.java | 13 ++++++++++ .../java/com/baeldung/lombok/with/Stock.java | 23 ++++++++++++++++++ .../java/com/baeldung/lombok/with/User.java | 14 +++++++++++ .../baeldung/lombok/with/HolderUnitTest.java | 24 +++++++++++++++++++ .../lombok/with/ImprovedUserUnitTest.java | 22 +++++++++++++++++ .../lombok/with/KioskDeviceWithUnitTest.java | 21 ++++++++++++++++ .../lombok/with/StockWithUnitTest.java | 22 +++++++++++++++++ .../lombok/with/UserWithUnitTest.java | 21 ++++++++++++++++ 11 files changed, 203 insertions(+) create mode 100644 lombok/src/main/java/com/baeldung/lombok/with/Device.java create mode 100644 lombok/src/main/java/com/baeldung/lombok/with/Holder.java create mode 100644 lombok/src/main/java/com/baeldung/lombok/with/ImprovedUser.java create mode 100644 lombok/src/main/java/com/baeldung/lombok/with/KioskDevice.java create mode 100644 lombok/src/main/java/com/baeldung/lombok/with/Stock.java create mode 100644 lombok/src/main/java/com/baeldung/lombok/with/User.java create mode 100644 lombok/src/test/java/com/baeldung/lombok/with/HolderUnitTest.java create mode 100644 lombok/src/test/java/com/baeldung/lombok/with/ImprovedUserUnitTest.java create mode 100644 lombok/src/test/java/com/baeldung/lombok/with/KioskDeviceWithUnitTest.java create mode 100644 lombok/src/test/java/com/baeldung/lombok/with/StockWithUnitTest.java create mode 100644 lombok/src/test/java/com/baeldung/lombok/with/UserWithUnitTest.java diff --git a/lombok/src/main/java/com/baeldung/lombok/with/Device.java b/lombok/src/main/java/com/baeldung/lombok/with/Device.java new file mode 100644 index 0000000000..d2c6c33feb --- /dev/null +++ b/lombok/src/main/java/com/baeldung/lombok/with/Device.java @@ -0,0 +1,13 @@ +package com.baeldung.lombok.with; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.With; + +@Getter +@AllArgsConstructor +public abstract class Device { + private final String serial; + @With + private final boolean isInspected; +} \ No newline at end of file diff --git a/lombok/src/main/java/com/baeldung/lombok/with/Holder.java b/lombok/src/main/java/com/baeldung/lombok/with/Holder.java new file mode 100644 index 0000000000..f379eae0c1 --- /dev/null +++ b/lombok/src/main/java/com/baeldung/lombok/with/Holder.java @@ -0,0 +1,16 @@ +package com.baeldung.lombok.with; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.With; + +@Getter +@AllArgsConstructor +public class Holder { + @With + private String variableA; + @With + private String _variableB; + @With + private String $variableC; +} \ No newline at end of file diff --git a/lombok/src/main/java/com/baeldung/lombok/with/ImprovedUser.java b/lombok/src/main/java/com/baeldung/lombok/with/ImprovedUser.java new file mode 100644 index 0000000000..5fafa08eda --- /dev/null +++ b/lombok/src/main/java/com/baeldung/lombok/with/ImprovedUser.java @@ -0,0 +1,14 @@ +package com.baeldung.lombok.with; + +import lombok.AllArgsConstructor; +import lombok.NonNull; +import lombok.With; + +@With +@AllArgsConstructor +public class ImprovedUser { + @NonNull + private final String username; + @NonNull + private final String emailAddress; +} \ No newline at end of file diff --git a/lombok/src/main/java/com/baeldung/lombok/with/KioskDevice.java b/lombok/src/main/java/com/baeldung/lombok/with/KioskDevice.java new file mode 100644 index 0000000000..de015b69af --- /dev/null +++ b/lombok/src/main/java/com/baeldung/lombok/with/KioskDevice.java @@ -0,0 +1,13 @@ +package com.baeldung.lombok.with; + +public class KioskDevice extends Device { + + public KioskDevice(String serial, boolean isInspected) { + super(serial, isInspected); + } + + @Override + public Device withInspected(boolean isInspected) { + return new KioskDevice(getSerial(), isInspected); + } +} \ No newline at end of file diff --git a/lombok/src/main/java/com/baeldung/lombok/with/Stock.java b/lombok/src/main/java/com/baeldung/lombok/with/Stock.java new file mode 100644 index 0000000000..33b29737cf --- /dev/null +++ b/lombok/src/main/java/com/baeldung/lombok/with/Stock.java @@ -0,0 +1,23 @@ +package com.baeldung.lombok.with; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.With; + +@Getter +@AllArgsConstructor +public class Stock { + @With + private String sku; + private int stockCount; + + public Stock withSku(String sku) { + return new Stock("mod-" + sku, stockCount); + } + + public Stock withSKU(String... sku) { + return sku == null || sku.length == 0 ? + new Stock("unknown", stockCount) : + new Stock("mod-" + sku[0], stockCount); + } +} \ No newline at end of file diff --git a/lombok/src/main/java/com/baeldung/lombok/with/User.java b/lombok/src/main/java/com/baeldung/lombok/with/User.java new file mode 100644 index 0000000000..3aa03d692b --- /dev/null +++ b/lombok/src/main/java/com/baeldung/lombok/with/User.java @@ -0,0 +1,14 @@ +package com.baeldung.lombok.with; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.With; + +@Getter +@AllArgsConstructor +public class User { + private final String username; + private final String emailAddress; + @With + private final boolean isAuthenticated; +} \ No newline at end of file diff --git a/lombok/src/test/java/com/baeldung/lombok/with/HolderUnitTest.java b/lombok/src/test/java/com/baeldung/lombok/with/HolderUnitTest.java new file mode 100644 index 0000000000..c0a3306a76 --- /dev/null +++ b/lombok/src/test/java/com/baeldung/lombok/with/HolderUnitTest.java @@ -0,0 +1,24 @@ +package com.baeldung.lombok.with; + + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotSame; + +public class HolderUnitTest { + + @Test + public void whenWithMethodsGenerated_thenUsable() { + Holder value = new Holder("a", "b"); + + Holder valueModifiedA = value.withVariableA("mod-a"); + Holder valueModifiedB = value.with_variableB("mod-b"); + // Holder valueModifiedC = value.with$VariableC("mod-c"); not possible + + assertNotSame(valueModifiedA, value); + assertNotSame(valueModifiedB, value); + assertEquals("mod-a", valueModifiedA.getVariableA()); + assertEquals("mod-b", valueModifiedB.get_variableB()); + } +} diff --git a/lombok/src/test/java/com/baeldung/lombok/with/ImprovedUserUnitTest.java b/lombok/src/test/java/com/baeldung/lombok/with/ImprovedUserUnitTest.java new file mode 100644 index 0000000000..b8d466ac4f --- /dev/null +++ b/lombok/src/test/java/com/baeldung/lombok/with/ImprovedUserUnitTest.java @@ -0,0 +1,22 @@ +package com.baeldung.lombok.with; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertThrows; + +public class ImprovedUserUnitTest { + + @Test + public void whenUsernameNull_thenException() { + ImprovedUser user = new ImprovedUser("testuser", "test@mail.com"); + + assertThrows(NullPointerException.class, () -> user.withUsername(null)); + } + + @Test + public void whenEmailNull_thenException() { + ImprovedUser user = new ImprovedUser("testuser", "test@mail.com"); + + assertThrows(NullPointerException.class, () -> user.withEmailAddress(null)); + } +} \ No newline at end of file diff --git a/lombok/src/test/java/com/baeldung/lombok/with/KioskDeviceWithUnitTest.java b/lombok/src/test/java/com/baeldung/lombok/with/KioskDeviceWithUnitTest.java new file mode 100644 index 0000000000..40bd5de8a1 --- /dev/null +++ b/lombok/src/test/java/com/baeldung/lombok/with/KioskDeviceWithUnitTest.java @@ -0,0 +1,21 @@ +package com.baeldung.lombok.with; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotSame; +import static org.junit.jupiter.api.Assertions.assertTrue; + +public class KioskDeviceWithUnitTest { + + @Test + public void whenDeviceInspected_thenClonedAndUpdated() { + KioskDevice device = new KioskDevice("S-001", false); + + Device inspectedDevice = device.withInspected(true); + + assertNotSame(inspectedDevice, device); + assertFalse(device.isInspected()); + assertTrue(inspectedDevice.isInspected()); + } +} diff --git a/lombok/src/test/java/com/baeldung/lombok/with/StockWithUnitTest.java b/lombok/src/test/java/com/baeldung/lombok/with/StockWithUnitTest.java new file mode 100644 index 0000000000..8d757e86ef --- /dev/null +++ b/lombok/src/test/java/com/baeldung/lombok/with/StockWithUnitTest.java @@ -0,0 +1,22 @@ +package com.baeldung.lombok.with; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertNotSame; +import static org.junit.jupiter.api.Assertions.assertTrue; + +public class StockWithUnitTest { + + @Test + public void givenWithManuallyProvided_whenSkuChanged_thenManualMethodUsed() { + Stock stock = new Stock("sku-001", 5); + + Stock modifiedStock = stock.withSku("sku-002"); + Stock anotherModifiedStock = stock.withSKU("sku-003", "sku-004"); + + assertNotSame(modifiedStock, stock); + assertNotSame(anotherModifiedStock, stock); + assertTrue(modifiedStock.getSku().startsWith("mod")); + assertTrue(anotherModifiedStock.getSku().startsWith("mod")); + } +} \ No newline at end of file diff --git a/lombok/src/test/java/com/baeldung/lombok/with/UserWithUnitTest.java b/lombok/src/test/java/com/baeldung/lombok/with/UserWithUnitTest.java new file mode 100644 index 0000000000..ce32ab9ee3 --- /dev/null +++ b/lombok/src/test/java/com/baeldung/lombok/with/UserWithUnitTest.java @@ -0,0 +1,21 @@ +package com.baeldung.lombok.with; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotSame; +import static org.junit.jupiter.api.Assertions.assertTrue; + +public class UserWithUnitTest { + + @Test + public void whenUserAuthenticated_thenClonedAndUpdated() { + User immutableUser = new User("testuser", "test@mail.com", false); + + User authenticatedUser = immutableUser.withAuthenticated(true); + + assertNotSame(immutableUser, authenticatedUser); + assertFalse(immutableUser.isAuthenticated()); + assertTrue(authenticatedUser.isAuthenticated()); + } +} \ No newline at end of file