diff --git a/template-method/pom.xml b/template-method/pom.xml
index 482a7c5ca..f43d42e78 100644
--- a/template-method/pom.xml
+++ b/template-method/pom.xml
@@ -14,5 +14,10 @@
junit
test
+
+ org.mockito
+ mockito-core
+ test
+
diff --git a/template-method/src/test/java/com/iluwatar/templatemethod/HalflingThiefTest.java b/template-method/src/test/java/com/iluwatar/templatemethod/HalflingThiefTest.java
new file mode 100644
index 000000000..be049720f
--- /dev/null
+++ b/template-method/src/test/java/com/iluwatar/templatemethod/HalflingThiefTest.java
@@ -0,0 +1,50 @@
+package com.iluwatar.templatemethod;
+
+import org.junit.Test;
+
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
+
+/**
+ * Date: 12/29/15 - 18:15 PM
+ *
+ * @author Jeroen Meulemeester
+ */
+public class HalflingThiefTest {
+
+ /**
+ * Verify if the thief uses the provided stealing method
+ */
+ @Test
+ public void testSteal() {
+ final StealingMethod method = mock(StealingMethod.class);
+ final HalflingThief thief = new HalflingThief(method);
+
+ thief.steal();
+ verify(method).steal();
+
+ verifyNoMoreInteractions(method);
+ }
+
+ /**
+ * Verify if the thief uses the provided stealing method, and the new method after changing it
+ */
+ @Test
+ public void testChangeMethod() {
+ final StealingMethod initialMethod = mock(StealingMethod.class);
+ final HalflingThief thief = new HalflingThief(initialMethod);
+
+ thief.steal();
+ verify(initialMethod).steal();
+
+ final StealingMethod newMethod = mock(StealingMethod.class);
+ thief.changeMethod(newMethod);
+
+ thief.steal();
+ verify(newMethod).steal();
+
+ verifyNoMoreInteractions(initialMethod, newMethod);
+
+ }
+}
\ No newline at end of file
diff --git a/template-method/src/test/java/com/iluwatar/templatemethod/HitAndRunMethodTest.java b/template-method/src/test/java/com/iluwatar/templatemethod/HitAndRunMethodTest.java
new file mode 100644
index 000000000..86fc2591d
--- /dev/null
+++ b/template-method/src/test/java/com/iluwatar/templatemethod/HitAndRunMethodTest.java
@@ -0,0 +1,23 @@
+package com.iluwatar.templatemethod;
+
+/**
+ * Date: 12/30/15 - 18:12 PM
+ *
+ * @author Jeroen Meulemeester
+ */
+public class HitAndRunMethodTest extends StealingMethodTest {
+
+ /**
+ * Create a new test for the {@link HitAndRunMethod}
+ */
+ public HitAndRunMethodTest() {
+ super(
+ new HitAndRunMethod(),
+ "old goblin woman",
+ "The target has been chosen as old goblin woman.",
+ "Approach the old goblin woman from behind.",
+ "Grab the handbag and run away fast!"
+ );
+ }
+
+}
\ No newline at end of file
diff --git a/template-method/src/test/java/com/iluwatar/templatemethod/StealingMethodTest.java b/template-method/src/test/java/com/iluwatar/templatemethod/StealingMethodTest.java
new file mode 100644
index 000000000..61143a15d
--- /dev/null
+++ b/template-method/src/test/java/com/iluwatar/templatemethod/StealingMethodTest.java
@@ -0,0 +1,142 @@
+package com.iluwatar.templatemethod;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.InOrder;
+
+import java.io.PrintStream;
+
+import static org.junit.Assert.assertEquals;
+import static org.mockito.Mockito.inOrder;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
+import static org.mockito.Mockito.verifyZeroInteractions;
+
+/**
+ * Date: 12/30/15 - 18:12 PM
+ *
+ * @author Jeroen Meulemeester
+ */
+public abstract class StealingMethodTest {
+
+ /**
+ * The tested stealing method
+ */
+ private final M method;
+
+ /**
+ * The expected target
+ */
+ private final String expectedTarget;
+
+ /**
+ * The expected target picking result
+ */
+ private final String expectedTargetResult;
+
+ /**
+ * The expected confusion method
+ */
+ private final String expectedConfuseMethod;
+
+ /**
+ * The expected stealing method
+ */
+ private final String expectedStealMethod;
+
+ /**
+ * The mocked standard out {@link PrintStream}, required since some actions don't have any
+ * influence on accessible objects, except for writing to std-out using {@link System#out}
+ */
+ private final PrintStream stdOutMock = mock(PrintStream.class);
+
+ /**
+ * Keep the original std-out so it can be restored after the test
+ */
+ private final PrintStream stdOutOrig = System.out;
+
+ /**
+ * Create a new test for the given stealing method, together with the expected results
+ *
+ * @param method The tested stealing method
+ * @param expectedTarget The expected target name
+ * @param expectedTargetResult The expected target picking result
+ * @param expectedConfuseMethod The expected confusion method
+ * @param expectedStealMethod The expected stealing method
+ */
+ public StealingMethodTest(final M method, String expectedTarget, final String expectedTargetResult,
+ final String expectedConfuseMethod, final String expectedStealMethod) {
+
+ this.method = method;
+ this.expectedTarget = expectedTarget;
+ this.expectedTargetResult = expectedTargetResult;
+ this.expectedConfuseMethod = expectedConfuseMethod;
+ this.expectedStealMethod = expectedStealMethod;
+ }
+
+ /**
+ * Inject the mocked std-out {@link PrintStream} into the {@link System} class before each test
+ */
+ @Before
+ public void setUp() {
+ System.setOut(this.stdOutMock);
+ }
+
+ /**
+ * Removed the mocked std-out {@link PrintStream} again from the {@link System} class
+ */
+ @After
+ public void tearDown() {
+ System.setOut(this.stdOutOrig);
+ }
+
+ /**
+ * Verify if the thief picks the correct target
+ */
+ @Test
+ public void testPickTarget() {
+ assertEquals(expectedTarget, this.method.pickTarget());
+ }
+
+ /**
+ * Verify if the target confusing step goes as planned
+ */
+ @Test
+ public void testConfuseTarget() {
+ verifyZeroInteractions(this.stdOutMock);
+
+ this.method.confuseTarget(this.expectedTarget);
+ verify(this.stdOutMock).println(this.expectedConfuseMethod);
+ verifyNoMoreInteractions(this.stdOutMock);
+ }
+
+ /**
+ * Verify if the stealing step goes as planned
+ */
+ @Test
+ public void testStealTheItem() {
+ verifyZeroInteractions(this.stdOutMock);
+
+ this.method.stealTheItem(this.expectedTarget);
+ verify(this.stdOutMock).println(this.expectedStealMethod);
+ verifyNoMoreInteractions(this.stdOutMock);
+ }
+
+ /**
+ * Verify if the complete steal process goes as planned
+ */
+ @Test
+ public void testSteal() {
+ final InOrder inOrder = inOrder(this.stdOutMock);
+
+ this.method.steal();
+
+ inOrder.verify(this.stdOutMock).println(this.expectedTargetResult);
+ inOrder.verify(this.stdOutMock).println(this.expectedConfuseMethod);
+ inOrder.verify(this.stdOutMock).println(this.expectedStealMethod);
+ inOrder.verifyNoMoreInteractions();
+ }
+
+}
\ No newline at end of file
diff --git a/template-method/src/test/java/com/iluwatar/templatemethod/SubtleMethodTest.java b/template-method/src/test/java/com/iluwatar/templatemethod/SubtleMethodTest.java
new file mode 100644
index 000000000..8b3681a76
--- /dev/null
+++ b/template-method/src/test/java/com/iluwatar/templatemethod/SubtleMethodTest.java
@@ -0,0 +1,23 @@
+package com.iluwatar.templatemethod;
+
+/**
+ * Date: 12/30/15 - 18:19 PM
+ *
+ * @author Jeroen Meulemeester
+ */
+public class SubtleMethodTest extends StealingMethodTest {
+
+ /**
+ * Create a new test for the {@link SubtleMethod}
+ */
+ public SubtleMethodTest() {
+ super(
+ new SubtleMethod(),
+ "shop keeper",
+ "The target has been chosen as shop keeper.",
+ "Approach the shop keeper with tears running and hug him!",
+ "While in close contact grab the shop keeper's wallet."
+ );
+ }
+
+}
\ No newline at end of file