diff --git a/template-method/README.md b/template-method/README.md index 7209176f2..ba34441e0 100644 --- a/template-method/README.md +++ b/template-method/README.md @@ -39,6 +39,10 @@ Wikipedia says **Programmatic Example** Let's first introduce the template method class along with its concrete implementations. +To make sure that subclasses don’t override the template method, the template method (in our case +method `steal`) should be declared `final`, otherwise the skeleton defined in the base class could +be overridden in subclasses. + ```java @Slf4j @@ -50,7 +54,7 @@ public abstract class StealingMethod { protected abstract void stealTheItem(String target); - public void steal() { + public final void steal() { var target = pickTarget(); LOGGER.info("The target has been chosen as {}.", target); confuseTarget(target); diff --git a/template-method/pom.xml b/template-method/pom.xml index ec791eae4..dc75fdef0 100644 --- a/template-method/pom.xml +++ b/template-method/pom.xml @@ -41,7 +41,7 @@ org.mockito - mockito-core + mockito-inline test diff --git a/template-method/src/main/java/com/iluwatar/templatemethod/StealingMethod.java b/template-method/src/main/java/com/iluwatar/templatemethod/StealingMethod.java index ea4248548..db8813fa2 100644 --- a/template-method/src/main/java/com/iluwatar/templatemethod/StealingMethod.java +++ b/template-method/src/main/java/com/iluwatar/templatemethod/StealingMethod.java @@ -41,7 +41,7 @@ public abstract class StealingMethod { /** * Steal. */ - public void steal() { + public final void steal() { var target = pickTarget(); LOGGER.info("The target has been chosen as {}.", target); confuseTarget(target); diff --git a/template-method/src/test/java/com/iluwatar/templatemethod/HalflingThiefTest.java b/template-method/src/test/java/com/iluwatar/templatemethod/HalflingThiefTest.java index eaf7699ac..9f8025973 100644 --- a/template-method/src/test/java/com/iluwatar/templatemethod/HalflingThiefTest.java +++ b/template-method/src/test/java/com/iluwatar/templatemethod/HalflingThiefTest.java @@ -24,7 +24,7 @@ */ package com.iluwatar.templatemethod; -import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoMoreInteractions; @@ -42,11 +42,14 @@ public class HalflingThiefTest { */ @Test void testSteal() { - final var method = mock(StealingMethod.class); + final var method = spy(StealingMethod.class); final var thief = new HalflingThief(method); thief.steal(); verify(method).steal(); + String target = verify(method).pickTarget(); + verify(method).confuseTarget(target); + verify(method).stealTheItem(target); verifyNoMoreInteractions(method); } @@ -56,19 +59,23 @@ public class HalflingThiefTest { */ @Test void testChangeMethod() { - final var initialMethod = mock(StealingMethod.class); + final var initialMethod = spy(StealingMethod.class); final var thief = new HalflingThief(initialMethod); thief.steal(); verify(initialMethod).steal(); + String target = verify(initialMethod).pickTarget(); + verify(initialMethod).confuseTarget(target); + verify(initialMethod).stealTheItem(target); - final var newMethod = mock(StealingMethod.class); + final var newMethod = spy(StealingMethod.class); thief.changeMethod(newMethod); thief.steal(); verify(newMethod).steal(); - + String newTarget = verify(newMethod).pickTarget(); + verify(newMethod).confuseTarget(newTarget); + verify(newMethod).stealTheItem(newTarget); verifyNoMoreInteractions(initialMethod, newMethod); - } } \ No newline at end of file