From 67f01d43aaa06a8b1191e55665f3fa5b6805c1c9 Mon Sep 17 00:00:00 2001 From: Dominik Gruntz Date: Mon, 10 Oct 2022 18:19:04 +0200 Subject: [PATCH] refactor: Declares the template method as final (Issue 1099) (#2057) --- template-method/README.md | 6 +++++- template-method/pom.xml | 2 +- .../templatemethod/StealingMethod.java | 2 +- .../templatemethod/HalflingThiefTest.java | 19 +++++++++++++------ 4 files changed, 20 insertions(+), 9 deletions(-) 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