From 2863fb054c97c0bcae2227d4599f2a859d75ca04 Mon Sep 17 00:00:00 2001 From: Deepak Vohra Date: Thu, 25 Sep 2025 15:29:18 -0700 Subject: [PATCH 01/28] BAEL-9439 Update pom.xml --- .../core-java-lang-oop-patterns-2/pom.xml | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/core-java-modules/core-java-lang-oop-patterns-2/pom.xml b/core-java-modules/core-java-lang-oop-patterns-2/pom.xml index 601b41d07ee4..a74efdb74e4e 100644 --- a/core-java-modules/core-java-lang-oop-patterns-2/pom.xml +++ b/core-java-modules/core-java-lang-oop-patterns-2/pom.xml @@ -24,6 +24,16 @@ jackson-databind ${jackson.version} + + org.springframework + spring-aop + 6.0.11 + + + org.springframework + spring-context + 6.0.11 + - \ No newline at end of file + From 72b122d1ad4391471a61e50a367eadf0104b4f31 Mon Sep 17 00:00:00 2001 From: Deepak Vohra Date: Thu, 25 Sep 2025 15:37:25 -0700 Subject: [PATCH 02/28] Create Calculator.java --- .../main/java/com/baeldung/overridemethod/Calculator.java | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 core-java-modules/core-java-lang-oop-patterns-2/src/main/java/com/baeldung/overridemethod/Calculator.java diff --git a/core-java-modules/core-java-lang-oop-patterns-2/src/main/java/com/baeldung/overridemethod/Calculator.java b/core-java-modules/core-java-lang-oop-patterns-2/src/main/java/com/baeldung/overridemethod/Calculator.java new file mode 100644 index 000000000000..5db060fa4c82 --- /dev/null +++ b/core-java-modules/core-java-lang-oop-patterns-2/src/main/java/com/baeldung/overridemethod/Calculator.java @@ -0,0 +1,6 @@ +package com.baeldung.overridemethod; + +public interface Calculator { + int add(int a, int b); + int subtract(int a, int b); +} From 94fbeb1dc047e128d8462a1bfc1dfc9afb1d8c35 Mon Sep 17 00:00:00 2001 From: Deepak Vohra Date: Thu, 25 Sep 2025 15:39:18 -0700 Subject: [PATCH 03/28] Create SimpleCalculator.java --- .../baeldung/overridemethod/SimpleCalculator.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 core-java-modules/core-java-lang-oop-patterns-2/src/main/java/com/baeldung/overridemethod/SimpleCalculator.java diff --git a/core-java-modules/core-java-lang-oop-patterns-2/src/main/java/com/baeldung/overridemethod/SimpleCalculator.java b/core-java-modules/core-java-lang-oop-patterns-2/src/main/java/com/baeldung/overridemethod/SimpleCalculator.java new file mode 100644 index 000000000000..d7775707ab19 --- /dev/null +++ b/core-java-modules/core-java-lang-oop-patterns-2/src/main/java/com/baeldung/overridemethod/SimpleCalculator.java @@ -0,0 +1,13 @@ +package com.baeldung.overridemethod; + +public class SimpleCalculator implements Calculator { + @Override + public int add(int a, int b) { + return a + b; + } + + @Override + public int subtract(int a, int b) { + return a - b; + } +} From df75dbe837b6620281767356f6b6248b557ce65e Mon Sep 17 00:00:00 2001 From: Deepak Vohra Date: Thu, 25 Sep 2025 16:00:56 -0700 Subject: [PATCH 04/28] Update pom.xml --- .../core-java-lang-oop-patterns-2/pom.xml | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/core-java-modules/core-java-lang-oop-patterns-2/pom.xml b/core-java-modules/core-java-lang-oop-patterns-2/pom.xml index a74efdb74e4e..fe6c0defd6ae 100644 --- a/core-java-modules/core-java-lang-oop-patterns-2/pom.xml +++ b/core-java-modules/core-java-lang-oop-patterns-2/pom.xml @@ -24,6 +24,17 @@ jackson-databind ${jackson.version} + + org.slf4j + slf4j-api + 2.0.7 + + + ch.qos.logback + logback-classic + 1.4.11 + runtime + org.springframework spring-aop From 78932750c734d95ecae19d8ae40ec80f180e986c Mon Sep 17 00:00:00 2001 From: Deepak Vohra Date: Thu, 25 Sep 2025 16:02:33 -0700 Subject: [PATCH 05/28] Create logback.xml --- .../src/main/resources/logback.xml | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 core-java-modules/core-java-lang-oop-patterns-2/src/main/resources/logback.xml diff --git a/core-java-modules/core-java-lang-oop-patterns-2/src/main/resources/logback.xml b/core-java-modules/core-java-lang-oop-patterns-2/src/main/resources/logback.xml new file mode 100644 index 000000000000..bd3dce1b11e3 --- /dev/null +++ b/core-java-modules/core-java-lang-oop-patterns-2/src/main/resources/logback.xml @@ -0,0 +1,17 @@ + + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + + + + + + + From 735e1b2b1bf9e641f1eb019a2317924c307848db Mon Sep 17 00:00:00 2001 From: Deepak Vohra Date: Thu, 25 Sep 2025 16:03:33 -0700 Subject: [PATCH 06/28] Update pom.xml --- core-java-modules/core-java-lang-oop-patterns-2/pom.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/core-java-modules/core-java-lang-oop-patterns-2/pom.xml b/core-java-modules/core-java-lang-oop-patterns-2/pom.xml index fe6c0defd6ae..9477b78b88f4 100644 --- a/core-java-modules/core-java-lang-oop-patterns-2/pom.xml +++ b/core-java-modules/core-java-lang-oop-patterns-2/pom.xml @@ -12,6 +12,10 @@ com.baeldung.core-java-modules 0.0.1-SNAPSHOT + + + logback.xml + From 1301b5f2bee0d522ce95060ba40dc5a15cd0aca7 Mon Sep 17 00:00:00 2001 From: Deepak Vohra Date: Thu, 25 Sep 2025 16:04:57 -0700 Subject: [PATCH 07/28] Update SimpleCalculator.java --- .../java/com/baeldung/overridemethod/SimpleCalculator.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/core-java-modules/core-java-lang-oop-patterns-2/src/main/java/com/baeldung/overridemethod/SimpleCalculator.java b/core-java-modules/core-java-lang-oop-patterns-2/src/main/java/com/baeldung/overridemethod/SimpleCalculator.java index d7775707ab19..7aa57787a671 100644 --- a/core-java-modules/core-java-lang-oop-patterns-2/src/main/java/com/baeldung/overridemethod/SimpleCalculator.java +++ b/core-java-modules/core-java-lang-oop-patterns-2/src/main/java/com/baeldung/overridemethod/SimpleCalculator.java @@ -1,13 +1,20 @@ package com.baeldung.overridemethod; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + public class SimpleCalculator implements Calculator { + private static final Logger log = LoggerFactory.getLogger(SimpleCalculator.class); + @Override public int add(int a, int b) { + log.info("SimpleCalculator: Adding {} and {}", a, b); // Use parameterized logging {} return a + b; } @Override public int subtract(int a, int b) { + log.info("SimpleCalculator: Subtracting {} from {}", b, a); return a - b; } } From 7c95af79aff5dba784fe5bc834685c991cabd738 Mon Sep 17 00:00:00 2001 From: Deepak Vohra Date: Thu, 25 Sep 2025 16:07:34 -0700 Subject: [PATCH 08/28] Create LoggingCalculator.java --- .../subclass/LoggingCalculator.java | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 core-java-modules/core-java-lang-oop-patterns-2/src/main/java/com/baeldung/overridemethod/subclass/LoggingCalculator.java diff --git a/core-java-modules/core-java-lang-oop-patterns-2/src/main/java/com/baeldung/overridemethod/subclass/LoggingCalculator.java b/core-java-modules/core-java-lang-oop-patterns-2/src/main/java/com/baeldung/overridemethod/subclass/LoggingCalculator.java new file mode 100644 index 000000000000..1e86d36bb42d --- /dev/null +++ b/core-java-modules/core-java-lang-oop-patterns-2/src/main/java/com/baeldung/overridemethod/subclass/LoggingCalculator.java @@ -0,0 +1,17 @@ +package com.baeldung.overridemethod.subclass; + +import com.baeldung.overridemethod.SimpleCalculator; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class LoggingCalculator extends SimpleCalculator { + private static final Logger log = LoggerFactory.getLogger(LoggingCalculator.class); + + @Override + public int add(int a, int b) { + log.debug("LOG: Before addition."); + int result = super.add(a, b); + log.debug("LOG: After addition. Result: {}", result); + return result; + } +} From ca00f4e9e60874f30947e5111809ee5cf687a712 Mon Sep 17 00:00:00 2001 From: Deepak Vohra Date: Thu, 25 Sep 2025 16:09:45 -0700 Subject: [PATCH 09/28] Create SubclassingTest.java --- .../overridemethod/subclass/SubclassingTest.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 core-java-modules/core-java-lang-oop-patterns-2/src/test/java/com/baeldung/overridemethod/subclass/SubclassingTest.java diff --git a/core-java-modules/core-java-lang-oop-patterns-2/src/test/java/com/baeldung/overridemethod/subclass/SubclassingTest.java b/core-java-modules/core-java-lang-oop-patterns-2/src/test/java/com/baeldung/overridemethod/subclass/SubclassingTest.java new file mode 100644 index 000000000000..ec7e8dc5dd9a --- /dev/null +++ b/core-java-modules/core-java-lang-oop-patterns-2/src/test/java/com/baeldung/overridemethod/subclass/SubclassingTest.java @@ -0,0 +1,14 @@ +package com.baeldung.overridemethod.subclass; + +import com.baeldung.overridemethod.Calculator; +import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class SubclassingTest { + + @Test + void testLoggingSubclass() { + Calculator calculator = new LoggingCalculator(); + assertEquals(8, calculator.add(5, 3)); + } +} From 1df54ab231bcc151013ecc9928495592c8f9293f Mon Sep 17 00:00:00 2001 From: Deepak Vohra Date: Thu, 25 Sep 2025 16:13:05 -0700 Subject: [PATCH 10/28] Create LoggingCalculatorDecorator.java --- .../decorator/LoggingCalculatorDecorator.java | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 core-java-modules/core-java-lang-oop-patterns-2/src/main/java/com/baeldung/overridemethod/decorator/LoggingCalculatorDecorator.java diff --git a/core-java-modules/core-java-lang-oop-patterns-2/src/main/java/com/baeldung/overridemethod/decorator/LoggingCalculatorDecorator.java b/core-java-modules/core-java-lang-oop-patterns-2/src/main/java/com/baeldung/overridemethod/decorator/LoggingCalculatorDecorator.java new file mode 100644 index 000000000000..46a690304025 --- /dev/null +++ b/core-java-modules/core-java-lang-oop-patterns-2/src/main/java/com/baeldung/overridemethod/decorator/LoggingCalculatorDecorator.java @@ -0,0 +1,28 @@ +package com.baeldung.overridemethod.decorator; + +import com.baeldung.overridemethod.Calculator; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class LoggingCalculatorDecorator implements Calculator { + private static final Logger log = LoggerFactory.getLogger(LoggingCalculatorDecorator.class); + private final Calculator wrappedCalculator; + + public LoggingCalculatorDecorator(Calculator calculator) { + this.wrappedCalculator = calculator; + } + + @Override + public int add(int a, int b) { + log.debug("DECORATOR LOG: Entering add({}, {})", a, b); + int result = wrappedCalculator.add(a, b); // Delegation + log.debug("DECORATOR LOG: Exiting add. Result: {}", result); + return result; + } + + @Override + public int subtract(int a, int b) { + // Just delegate + return wrappedCalculator.subtract(a, b); + } +} From ef2d98e85a0af787de003fd4f84a1409017515c3 Mon Sep 17 00:00:00 2001 From: Deepak Vohra Date: Thu, 25 Sep 2025 16:15:12 -0700 Subject: [PATCH 11/28] Create LoggingInvocationHandler.java --- .../proxy/jdk/LoggingInvocationHandler.java | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 core-java-modules/core-java-lang-oop-patterns-2/src/main/java/com/baeldung/overridemethod/proxy/jdk/LoggingInvocationHandler.java diff --git a/core-java-modules/core-java-lang-oop-patterns-2/src/main/java/com/baeldung/overridemethod/proxy/jdk/LoggingInvocationHandler.java b/core-java-modules/core-java-lang-oop-patterns-2/src/main/java/com/baeldung/overridemethod/proxy/jdk/LoggingInvocationHandler.java new file mode 100644 index 000000000000..06e33383aaf3 --- /dev/null +++ b/core-java-modules/core-java-lang-oop-patterns-2/src/main/java/com/baeldung/overridemethod/proxy/jdk/LoggingInvocationHandler.java @@ -0,0 +1,27 @@ +package com.baeldung.overridemethod.proxy.jdk; + +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.Method; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class LoggingInvocationHandler implements InvocationHandler { + private static final Logger log = LoggerFactory.getLogger(LoggingInvocationHandler.class); + private final Object target; + + public LoggingInvocationHandler(Object target) { + this.target = target; + } + + @Override + public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { + + log.debug("PROXY LOG: Intercepting method: {}", method.getName()); + + Object result = method.invoke(target, args); + + log.debug("PROXY LOG: Method {} executed.", method.getName()); + + return result; + } +} From f5780b76177b8d62b479efd47207352b7a12785e Mon Sep 17 00:00:00 2001 From: Deepak Vohra Date: Thu, 25 Sep 2025 16:16:40 -0700 Subject: [PATCH 12/28] Create LoggingMethodInterceptor.java --- .../spring/LoggingMethodInterceptor.java | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 core-java-modules/core-java-lang-oop-patterns-2/src/main/java/com/baeldung/overridemethod/proxy/spring/LoggingMethodInterceptor.java diff --git a/core-java-modules/core-java-lang-oop-patterns-2/src/main/java/com/baeldung/overridemethod/proxy/spring/LoggingMethodInterceptor.java b/core-java-modules/core-java-lang-oop-patterns-2/src/main/java/com/baeldung/overridemethod/proxy/spring/LoggingMethodInterceptor.java new file mode 100644 index 000000000000..c55e274ae3dd --- /dev/null +++ b/core-java-modules/core-java-lang-oop-patterns-2/src/main/java/com/baeldung/overridemethod/proxy/spring/LoggingMethodInterceptor.java @@ -0,0 +1,22 @@ +package com.baeldung.overridemethod.proxy.spring; + +import org.aopalliance.intercept.MethodInterceptor; +import org.aopalliance.intercept.MethodInvocation; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class LoggingMethodInterceptor implements MethodInterceptor { + private static final Logger log = LoggerFactory.getLogger(LoggingMethodInterceptor.class); + + @Override + public Object invoke(MethodInvocation invocation) throws Throwable { + + log.debug("SPRING PROXY: Intercepting method: {}", invocation.getMethod().getName()); + + Object result = invocation.proceed(); + + log.debug("SPRING PROXY: Method {} completed.", invocation.getMethod().getName()); + + return result; + } +} From 60e25944d515a7230320f34c74e7ac4ae3368cac Mon Sep 17 00:00:00 2001 From: Deepak Vohra Date: Thu, 25 Sep 2025 16:18:59 -0700 Subject: [PATCH 13/28] Create DecoratorPatternTest.java --- .../decorator/DecoratorPatternTest.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 core-java-modules/core-java-lang-oop-patterns-2/src/test/java/com/baeldung/overridemethod/decorator/DecoratorPatternTest.java diff --git a/core-java-modules/core-java-lang-oop-patterns-2/src/test/java/com/baeldung/overridemethod/decorator/DecoratorPatternTest.java b/core-java-modules/core-java-lang-oop-patterns-2/src/test/java/com/baeldung/overridemethod/decorator/DecoratorPatternTest.java new file mode 100644 index 000000000000..950dc99212fe --- /dev/null +++ b/core-java-modules/core-java-lang-oop-patterns-2/src/test/java/com/baeldung/overridemethod/decorator/DecoratorPatternTest.java @@ -0,0 +1,16 @@ +package com.baeldung.overridemethod.decorator; + +import com.baeldung.overridemethod.Calculator; +import com.baeldung.overridemethod.SimpleCalculator; +import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class DecoratorPatternTest { + + @Test + void testDecoratorWrapping() { + Calculator simpleCalc = new SimpleCalculator(); + Calculator decoratedCalc = new LoggingCalculatorDecorator(simpleCalc); + assertEquals(15, decoratedCalc.add(10, 5)); + } +} From 59de6e5f3e022bd6de2445df65737a38ee3d3dc7 Mon Sep 17 00:00:00 2001 From: Deepak Vohra Date: Thu, 25 Sep 2025 16:20:37 -0700 Subject: [PATCH 14/28] Create DynamicProxyTest.java --- .../proxy/jdk/DynamicProxyTest.java | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 core-java-modules/core-java-lang-oop-patterns-2/src/test/java/com/baeldung/overridemethod/proxy/jdk/DynamicProxyTest.java diff --git a/core-java-modules/core-java-lang-oop-patterns-2/src/test/java/com/baeldung/overridemethod/proxy/jdk/DynamicProxyTest.java b/core-java-modules/core-java-lang-oop-patterns-2/src/test/java/com/baeldung/overridemethod/proxy/jdk/DynamicProxyTest.java new file mode 100644 index 000000000000..91820699eb33 --- /dev/null +++ b/core-java-modules/core-java-lang-oop-patterns-2/src/test/java/com/baeldung/overridemethod/proxy/jdk/DynamicProxyTest.java @@ -0,0 +1,25 @@ +package com.baeldung.overridemethod.proxy.jdk; + +import com.baeldung.overridemethod.Calculator; +import com.baeldung.overridemethod.SimpleCalculator; +import org.junit.jupiter.api.Test; +import java.lang.reflect.Proxy; +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class DynamicProxyTest { + + @Test + void testJdkDynamicProxy() { + Calculator simpleCalc = new SimpleCalculator(); + LoggingInvocationHandler handler = new LoggingInvocationHandler(simpleCalc); + + Calculator proxyCalc = (Calculator) Proxy.newProxyInstance( + Calculator.class.getClassLoader(), + new Class[]{Calculator.class}, + handler + ); + + assertEquals(30, proxyCalc.add(20, 10)); + } +} + From e619016425ed78fd1c51a9b520a70aea71eb72e4 Mon Sep 17 00:00:00 2001 From: Deepak Vohra Date: Thu, 25 Sep 2025 16:22:01 -0700 Subject: [PATCH 15/28] Create SpringProxyFactoryTest.java --- .../proxy/spring/SpringProxyFactoryTest.java | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 core-java-modules/core-java-lang-oop-patterns-2/src/test/java/com/baeldung/overridemethod/proxy/spring/SpringProxyFactoryTest.java diff --git a/core-java-modules/core-java-lang-oop-patterns-2/src/test/java/com/baeldung/overridemethod/proxy/spring/SpringProxyFactoryTest.java b/core-java-modules/core-java-lang-oop-patterns-2/src/test/java/com/baeldung/overridemethod/proxy/spring/SpringProxyFactoryTest.java new file mode 100644 index 000000000000..c60e1af65029 --- /dev/null +++ b/core-java-modules/core-java-lang-oop-patterns-2/src/test/java/com/baeldung/overridemethod/proxy/spring/SpringProxyFactoryTest.java @@ -0,0 +1,23 @@ +package com.baeldung.overridemethod.proxy.spring; + +import com.baeldung.overridemethod.Calculator; +import com.baeldung.overridemethod.SimpleCalculator; +import org.junit.jupiter.api.Test; +import org.springframework.aop.framework.ProxyFactory; +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class SpringProxyFactoryTest { + + @Test + void testSpringProxyFactory() { + SimpleCalculator simpleCalc = new SimpleCalculator(); + ProxyFactory factory = new ProxyFactory(); + + factory.setTarget(simpleCalc); + factory.addAdvice(new LoggingMethodInterceptor()); + + Calculator proxyCalc = (Calculator) factory.getProxy(); + + assertEquals(40, proxyCalc.subtract(50, 10)); + } +} From b9d35f7709606419fb55761f08c61a3db01159c8 Mon Sep 17 00:00:00 2001 From: Deepak Vohra Date: Sat, 27 Sep 2025 16:58:09 -0700 Subject: [PATCH 16/28] Update LoggingCalculator.java --- .../overridemethod/subclass/LoggingCalculator.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/core-java-modules/core-java-lang-oop-patterns-2/src/main/java/com/baeldung/overridemethod/subclass/LoggingCalculator.java b/core-java-modules/core-java-lang-oop-patterns-2/src/main/java/com/baeldung/overridemethod/subclass/LoggingCalculator.java index 1e86d36bb42d..e89c870ad1da 100644 --- a/core-java-modules/core-java-lang-oop-patterns-2/src/main/java/com/baeldung/overridemethod/subclass/LoggingCalculator.java +++ b/core-java-modules/core-java-lang-oop-patterns-2/src/main/java/com/baeldung/overridemethod/subclass/LoggingCalculator.java @@ -14,4 +14,12 @@ public int add(int a, int b) { log.debug("LOG: After addition. Result: {}", result); return result; } + + @Override + public int subtract(int a, int b) { + log.debug("LOG: Before subtraction."); + int result = super.subtract(a, b); + log.debug("LOG: After subtraction. Result: {}", result); + return result; + } } From 196f927b6d35310a7f7cc00d3079ee501b91c0b9 Mon Sep 17 00:00:00 2001 From: Deepak Vohra Date: Sat, 27 Sep 2025 17:08:01 -0700 Subject: [PATCH 17/28] Update SubclassingTest.java --- .../com/baeldung/overridemethod/subclass/SubclassingTest.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core-java-modules/core-java-lang-oop-patterns-2/src/test/java/com/baeldung/overridemethod/subclass/SubclassingTest.java b/core-java-modules/core-java-lang-oop-patterns-2/src/test/java/com/baeldung/overridemethod/subclass/SubclassingTest.java index ec7e8dc5dd9a..eb45d1b42808 100644 --- a/core-java-modules/core-java-lang-oop-patterns-2/src/test/java/com/baeldung/overridemethod/subclass/SubclassingTest.java +++ b/core-java-modules/core-java-lang-oop-patterns-2/src/test/java/com/baeldung/overridemethod/subclass/SubclassingTest.java @@ -7,8 +7,9 @@ public class SubclassingTest { @Test - void testLoggingSubclass() { + void givenACalculatorClass_whenSubclassingToAddLogging_thenLoggingCalculatorCanBeUsed() { Calculator calculator = new LoggingCalculator(); assertEquals(8, calculator.add(5, 3)); + assertEquals(2, calculator.add(5, 3)); } } From f77994474b765ecab033fa06b3600b90f5479a28 Mon Sep 17 00:00:00 2001 From: Deepak Vohra Date: Sat, 27 Sep 2025 17:15:08 -0700 Subject: [PATCH 18/28] Update SubclassingTest.java --- .../com/baeldung/overridemethod/subclass/SubclassingTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core-java-modules/core-java-lang-oop-patterns-2/src/test/java/com/baeldung/overridemethod/subclass/SubclassingTest.java b/core-java-modules/core-java-lang-oop-patterns-2/src/test/java/com/baeldung/overridemethod/subclass/SubclassingTest.java index eb45d1b42808..6718b4da9198 100644 --- a/core-java-modules/core-java-lang-oop-patterns-2/src/test/java/com/baeldung/overridemethod/subclass/SubclassingTest.java +++ b/core-java-modules/core-java-lang-oop-patterns-2/src/test/java/com/baeldung/overridemethod/subclass/SubclassingTest.java @@ -10,6 +10,6 @@ public class SubclassingTest { void givenACalculatorClass_whenSubclassingToAddLogging_thenLoggingCalculatorCanBeUsed() { Calculator calculator = new LoggingCalculator(); assertEquals(8, calculator.add(5, 3)); - assertEquals(2, calculator.add(5, 3)); + assertEquals(2, calculator.subtract(5, 3)); } } From 2e25f301278e3149f287f8d2ed1f9c5c1d9d75f3 Mon Sep 17 00:00:00 2001 From: Deepak Vohra Date: Sat, 27 Sep 2025 17:28:25 -0700 Subject: [PATCH 19/28] Update LoggingCalculatorDecorator.java --- .../decorator/LoggingCalculatorDecorator.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/core-java-modules/core-java-lang-oop-patterns-2/src/main/java/com/baeldung/overridemethod/decorator/LoggingCalculatorDecorator.java b/core-java-modules/core-java-lang-oop-patterns-2/src/main/java/com/baeldung/overridemethod/decorator/LoggingCalculatorDecorator.java index 46a690304025..30a052f18d06 100644 --- a/core-java-modules/core-java-lang-oop-patterns-2/src/main/java/com/baeldung/overridemethod/decorator/LoggingCalculatorDecorator.java +++ b/core-java-modules/core-java-lang-oop-patterns-2/src/main/java/com/baeldung/overridemethod/decorator/LoggingCalculatorDecorator.java @@ -22,7 +22,9 @@ public int add(int a, int b) { @Override public int subtract(int a, int b) { - // Just delegate - return wrappedCalculator.subtract(a, b); + log.debug("DECORATOR LOG: Entering subtract({}, {})", a, b); + int result = wrappedCalculator.subtract(a, b); // Delegation + log.debug("DECORATOR LOG: Exiting subtract. Result: {}", result); + return result; } } From 8a796958fe9d6f67576e159a4112aff28cc04770 Mon Sep 17 00:00:00 2001 From: Deepak Vohra Date: Sat, 27 Sep 2025 17:39:18 -0700 Subject: [PATCH 20/28] Update DecoratorPatternTest.java --- .../baeldung/overridemethod/decorator/DecoratorPatternTest.java | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-lang-oop-patterns-2/src/test/java/com/baeldung/overridemethod/decorator/DecoratorPatternTest.java b/core-java-modules/core-java-lang-oop-patterns-2/src/test/java/com/baeldung/overridemethod/decorator/DecoratorPatternTest.java index 950dc99212fe..e4b04711a890 100644 --- a/core-java-modules/core-java-lang-oop-patterns-2/src/test/java/com/baeldung/overridemethod/decorator/DecoratorPatternTest.java +++ b/core-java-modules/core-java-lang-oop-patterns-2/src/test/java/com/baeldung/overridemethod/decorator/DecoratorPatternTest.java @@ -12,5 +12,6 @@ void testDecoratorWrapping() { Calculator simpleCalc = new SimpleCalculator(); Calculator decoratedCalc = new LoggingCalculatorDecorator(simpleCalc); assertEquals(15, decoratedCalc.add(10, 5)); + assertEquals(5, decoratedCalc.subtract(10, 5)); } } From 38801064bb791396ad5c224688417425059df696 Mon Sep 17 00:00:00 2001 From: Deepak Vohra Date: Sat, 27 Sep 2025 17:41:32 -0700 Subject: [PATCH 21/28] Update DecoratorPatternTest.java --- .../baeldung/overridemethod/decorator/DecoratorPatternTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core-java-modules/core-java-lang-oop-patterns-2/src/test/java/com/baeldung/overridemethod/decorator/DecoratorPatternTest.java b/core-java-modules/core-java-lang-oop-patterns-2/src/test/java/com/baeldung/overridemethod/decorator/DecoratorPatternTest.java index e4b04711a890..ac7758c40f94 100644 --- a/core-java-modules/core-java-lang-oop-patterns-2/src/test/java/com/baeldung/overridemethod/decorator/DecoratorPatternTest.java +++ b/core-java-modules/core-java-lang-oop-patterns-2/src/test/java/com/baeldung/overridemethod/decorator/DecoratorPatternTest.java @@ -8,7 +8,7 @@ public class DecoratorPatternTest { @Test - void testDecoratorWrapping() { + void givenACalculator_whenUsingDecoratorWrappingToAddLogging_thenDecoratorWrappingCanBeUsed() { Calculator simpleCalc = new SimpleCalculator(); Calculator decoratedCalc = new LoggingCalculatorDecorator(simpleCalc); assertEquals(15, decoratedCalc.add(10, 5)); From 8435b9285d4f5603b23741149b7292a5172c419b Mon Sep 17 00:00:00 2001 From: Deepak Vohra Date: Sat, 27 Sep 2025 17:51:45 -0700 Subject: [PATCH 22/28] Update DynamicProxyTest.java --- .../baeldung/overridemethod/proxy/jdk/DynamicProxyTest.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core-java-modules/core-java-lang-oop-patterns-2/src/test/java/com/baeldung/overridemethod/proxy/jdk/DynamicProxyTest.java b/core-java-modules/core-java-lang-oop-patterns-2/src/test/java/com/baeldung/overridemethod/proxy/jdk/DynamicProxyTest.java index 91820699eb33..221f254a07bb 100644 --- a/core-java-modules/core-java-lang-oop-patterns-2/src/test/java/com/baeldung/overridemethod/proxy/jdk/DynamicProxyTest.java +++ b/core-java-modules/core-java-lang-oop-patterns-2/src/test/java/com/baeldung/overridemethod/proxy/jdk/DynamicProxyTest.java @@ -9,7 +9,7 @@ public class DynamicProxyTest { @Test - void testJdkDynamicProxy() { + void givenACalculator_whenUsingJdkDynamicProxy_thenJdkDynamicProxyCanBeUsed() { Calculator simpleCalc = new SimpleCalculator(); LoggingInvocationHandler handler = new LoggingInvocationHandler(simpleCalc); @@ -20,6 +20,7 @@ void testJdkDynamicProxy() { ); assertEquals(30, proxyCalc.add(20, 10)); + assertEquals(10, proxyCalc.subtract(20, 10)); } } From 27b312a362395804fbd2686aee1c75786d98f0cc Mon Sep 17 00:00:00 2001 From: Deepak Vohra Date: Sat, 27 Sep 2025 18:05:49 -0700 Subject: [PATCH 23/28] Update SpringProxyFactoryTest.java --- .../overridemethod/proxy/spring/SpringProxyFactoryTest.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core-java-modules/core-java-lang-oop-patterns-2/src/test/java/com/baeldung/overridemethod/proxy/spring/SpringProxyFactoryTest.java b/core-java-modules/core-java-lang-oop-patterns-2/src/test/java/com/baeldung/overridemethod/proxy/spring/SpringProxyFactoryTest.java index c60e1af65029..0438e1f58f47 100644 --- a/core-java-modules/core-java-lang-oop-patterns-2/src/test/java/com/baeldung/overridemethod/proxy/spring/SpringProxyFactoryTest.java +++ b/core-java-modules/core-java-lang-oop-patterns-2/src/test/java/com/baeldung/overridemethod/proxy/spring/SpringProxyFactoryTest.java @@ -9,7 +9,7 @@ public class SpringProxyFactoryTest { @Test - void testSpringProxyFactory() { + void givenACalculator_whenUsingSpringProxyFactory_thenSpringProxyFactoryCanBeUsed() { SimpleCalculator simpleCalc = new SimpleCalculator(); ProxyFactory factory = new ProxyFactory(); @@ -18,6 +18,7 @@ void testSpringProxyFactory() { Calculator proxyCalc = (Calculator) factory.getProxy(); + assertEquals(60, proxyCalc.add(50, 10)); assertEquals(40, proxyCalc.subtract(50, 10)); } } From c740da02ffaf18a1e7a33ed5d98ae4251b172891 Mon Sep 17 00:00:00 2001 From: Deepak Vohra Date: Fri, 3 Oct 2025 07:25:13 -0700 Subject: [PATCH 24/28] Update LoggingCalculatorDecorator.java --- .../decorator/LoggingCalculatorDecorator.java | 33 +++++++++++-------- 1 file changed, 20 insertions(+), 13 deletions(-) diff --git a/core-java-modules/core-java-lang-oop-patterns-2/src/main/java/com/baeldung/overridemethod/decorator/LoggingCalculatorDecorator.java b/core-java-modules/core-java-lang-oop-patterns-2/src/main/java/com/baeldung/overridemethod/decorator/LoggingCalculatorDecorator.java index 30a052f18d06..fbdb118e7d14 100644 --- a/core-java-modules/core-java-lang-oop-patterns-2/src/main/java/com/baeldung/overridemethod/decorator/LoggingCalculatorDecorator.java +++ b/core-java-modules/core-java-lang-oop-patterns-2/src/main/java/com/baeldung/overridemethod/decorator/LoggingCalculatorDecorator.java @@ -1,30 +1,37 @@ package com.baeldung.overridemethod.decorator; import com.baeldung.overridemethod.Calculator; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import java.util.HashMap; +import java.util.Map; -public class LoggingCalculatorDecorator implements Calculator { - private static final Logger log = LoggerFactory.getLogger(LoggingCalculatorDecorator.class); +public class MeteredCalculator implements Calculator { private final Calculator wrappedCalculator; + private final Map methodCalls; - public LoggingCalculatorDecorator(Calculator calculator) { + public MeteredCalculator(Calculator calculator) { this.wrappedCalculator = calculator; + this.methodCalls = new HashMap<>(); + // Initialize counts for clarity + methodCalls.put("add", 0); + methodCalls.put("subtract", 0); } @Override public int add(int a, int b) { - log.debug("DECORATOR LOG: Entering add({}, {})", a, b); - int result = wrappedCalculator.add(a, b); // Delegation - log.debug("DECORATOR LOG: Exiting add. Result: {}", result); - return result; + // Track the call count + methodCalls.merge("add", 1, Integer::sum); + return wrappedCalculator.add(a, b); // Delegation } @Override public int subtract(int a, int b) { - log.debug("DECORATOR LOG: Entering subtract({}, {})", a, b); - int result = wrappedCalculator.subtract(a, b); // Delegation - log.debug("DECORATOR LOG: Exiting subtract. Result: {}", result); - return result; + // Track the call count + methodCalls.merge("subtract", 1, Integer::sum); + return wrappedCalculator.subtract(a, b); // Delegation + } + + // Public method to expose the call counts for testing + public int getCallCount(String methodName) { + return methodCalls.getOrDefault(methodName, 0); } } From b4db771ec97066d860ded9f4c9df2158702713d2 Mon Sep 17 00:00:00 2001 From: Deepak Vohra Date: Fri, 3 Oct 2025 07:26:24 -0700 Subject: [PATCH 25/28] Update DecoratorPatternTest.java --- .../decorator/DecoratorPatternTest.java | 27 ++++++++++++++++--- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/core-java-modules/core-java-lang-oop-patterns-2/src/test/java/com/baeldung/overridemethod/decorator/DecoratorPatternTest.java b/core-java-modules/core-java-lang-oop-patterns-2/src/test/java/com/baeldung/overridemethod/decorator/DecoratorPatternTest.java index ac7758c40f94..93919223135e 100644 --- a/core-java-modules/core-java-lang-oop-patterns-2/src/test/java/com/baeldung/overridemethod/decorator/DecoratorPatternTest.java +++ b/core-java-modules/core-java-lang-oop-patterns-2/src/test/java/com/baeldung/overridemethod/decorator/DecoratorPatternTest.java @@ -8,10 +8,29 @@ public class DecoratorPatternTest { @Test - void givenACalculator_whenUsingDecoratorWrappingToAddLogging_thenDecoratorWrappingCanBeUsed() { + void givenACalculator_whenUsingMeteredDecorator_thenMethodCallsAreCountedCorrectly() { + // ARRANGE Calculator simpleCalc = new SimpleCalculator(); - Calculator decoratedCalc = new LoggingCalculatorDecorator(simpleCalc); - assertEquals(15, decoratedCalc.add(10, 5)); - assertEquals(5, decoratedCalc.subtract(10, 5)); + + // Use the MeteredCalculator decorator + MeteredCalculator decoratedCalc = new MeteredCalculator(simpleCalc); + + // ACT + // Call add twice + decoratedCalc.add(10, 5); + decoratedCalc.add(2, 3); + + // Call subtract once + decoratedCalc.subtract(10, 5); + + // ASSERT Core Functionality (optional, but good practice) + assertEquals(15, decoratedCalc.add(10, 5), "Core functionality must still work."); + + // ASSERT the call counts + // 1. Assert 'add' was called 3 times (2 from ACT + 1 from ASSERT Core) + assertEquals(3, decoratedCalc.getCallCount("add"), "The 'add' method should have been called 3 times."); + + // 2. Assert 'subtract' was called 1 time + assertEquals(1, decoratedCalc.getCallCount("subtract"), "The 'subtract' method should have been called 1 time."); } } From b7fc563cdcd45681cfe273cf99a869750fa4bd4a Mon Sep 17 00:00:00 2001 From: Deepak Vohra Date: Fri, 3 Oct 2025 07:30:44 -0700 Subject: [PATCH 26/28] Update and rename LoggingCalculatorDecorator.java to MeteredCalculatorDecorator.java --- ...lculatorDecorator.java => MeteredCalculatorDecorator.java} | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) rename core-java-modules/core-java-lang-oop-patterns-2/src/main/java/com/baeldung/overridemethod/decorator/{LoggingCalculatorDecorator.java => MeteredCalculatorDecorator.java} (89%) diff --git a/core-java-modules/core-java-lang-oop-patterns-2/src/main/java/com/baeldung/overridemethod/decorator/LoggingCalculatorDecorator.java b/core-java-modules/core-java-lang-oop-patterns-2/src/main/java/com/baeldung/overridemethod/decorator/MeteredCalculatorDecorator.java similarity index 89% rename from core-java-modules/core-java-lang-oop-patterns-2/src/main/java/com/baeldung/overridemethod/decorator/LoggingCalculatorDecorator.java rename to core-java-modules/core-java-lang-oop-patterns-2/src/main/java/com/baeldung/overridemethod/decorator/MeteredCalculatorDecorator.java index fbdb118e7d14..af94bc02862a 100644 --- a/core-java-modules/core-java-lang-oop-patterns-2/src/main/java/com/baeldung/overridemethod/decorator/LoggingCalculatorDecorator.java +++ b/core-java-modules/core-java-lang-oop-patterns-2/src/main/java/com/baeldung/overridemethod/decorator/MeteredCalculatorDecorator.java @@ -4,11 +4,11 @@ import java.util.HashMap; import java.util.Map; -public class MeteredCalculator implements Calculator { +public class MeteredCalculatorDecorator implements Calculator { private final Calculator wrappedCalculator; private final Map methodCalls; - public MeteredCalculator(Calculator calculator) { + public MeteredCalculatorDecorator(Calculator calculator) { this.wrappedCalculator = calculator; this.methodCalls = new HashMap<>(); // Initialize counts for clarity From a18ce1c5f2ad5bb1051cb57c376c3094811f0903 Mon Sep 17 00:00:00 2001 From: Deepak Vohra Date: Fri, 3 Oct 2025 07:31:44 -0700 Subject: [PATCH 27/28] Update DecoratorPatternTest.java --- .../overridemethod/decorator/DecoratorPatternTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core-java-modules/core-java-lang-oop-patterns-2/src/test/java/com/baeldung/overridemethod/decorator/DecoratorPatternTest.java b/core-java-modules/core-java-lang-oop-patterns-2/src/test/java/com/baeldung/overridemethod/decorator/DecoratorPatternTest.java index 93919223135e..1de5af0ab5bc 100644 --- a/core-java-modules/core-java-lang-oop-patterns-2/src/test/java/com/baeldung/overridemethod/decorator/DecoratorPatternTest.java +++ b/core-java-modules/core-java-lang-oop-patterns-2/src/test/java/com/baeldung/overridemethod/decorator/DecoratorPatternTest.java @@ -12,8 +12,8 @@ void givenACalculator_whenUsingMeteredDecorator_thenMethodCallsAreCountedCorrect // ARRANGE Calculator simpleCalc = new SimpleCalculator(); - // Use the MeteredCalculator decorator - MeteredCalculator decoratedCalc = new MeteredCalculator(simpleCalc); + // Use the MeteredCalculatorDecorator decorator + MeteredCalculatorDecorator decoratedCalc = new MeteredCalculatorDecorator(simpleCalc); // ACT // Call add twice From 977c7d8b15ea4efde7a2f57777773f6171738044 Mon Sep 17 00:00:00 2001 From: Deepak Vohra Date: Fri, 3 Oct 2025 08:01:21 -0700 Subject: [PATCH 28/28] Update DynamicProxyTest.java --- .../com/baeldung/overridemethod/proxy/jdk/DynamicProxyTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core-java-modules/core-java-lang-oop-patterns-2/src/test/java/com/baeldung/overridemethod/proxy/jdk/DynamicProxyTest.java b/core-java-modules/core-java-lang-oop-patterns-2/src/test/java/com/baeldung/overridemethod/proxy/jdk/DynamicProxyTest.java index 221f254a07bb..248af8edba13 100644 --- a/core-java-modules/core-java-lang-oop-patterns-2/src/test/java/com/baeldung/overridemethod/proxy/jdk/DynamicProxyTest.java +++ b/core-java-modules/core-java-lang-oop-patterns-2/src/test/java/com/baeldung/overridemethod/proxy/jdk/DynamicProxyTest.java @@ -15,7 +15,7 @@ void givenACalculator_whenUsingJdkDynamicProxy_thenJdkDynamicProxyCanBeUsed() { Calculator proxyCalc = (Calculator) Proxy.newProxyInstance( Calculator.class.getClassLoader(), - new Class[]{Calculator.class}, + new Class[] { Calculator.class }, handler );