diff --git a/factory-method/pom.xml b/factory-method/pom.xml
index 0d1e435f9..97c1c5681 100644
--- a/factory-method/pom.xml
+++ b/factory-method/pom.xml
@@ -14,5 +14,10 @@
junit
test
+
+ org.mockito
+ mockito-core
+ test
+
diff --git a/factory-method/src/main/java/com/iluwatar/factory/method/ElfWeapon.java b/factory-method/src/main/java/com/iluwatar/factory/method/ElfWeapon.java
index d2f38bc48..b0ff33f2b 100644
--- a/factory-method/src/main/java/com/iluwatar/factory/method/ElfWeapon.java
+++ b/factory-method/src/main/java/com/iluwatar/factory/method/ElfWeapon.java
@@ -1,9 +1,7 @@
package com.iluwatar.factory.method;
/**
- *
- * ElfWeapon
- *
+ * ElfWeapon.
*/
public class ElfWeapon implements Weapon {
@@ -17,4 +15,9 @@ public class ElfWeapon implements Weapon {
public String toString() {
return "Elven " + weaponType;
}
+
+ @Override
+ public WeaponType getWeaponType() {
+ return weaponType;
+ }
}
diff --git a/factory-method/src/main/java/com/iluwatar/factory/method/OrcWeapon.java b/factory-method/src/main/java/com/iluwatar/factory/method/OrcWeapon.java
index 48cd9c5a3..e1ec0f560 100644
--- a/factory-method/src/main/java/com/iluwatar/factory/method/OrcWeapon.java
+++ b/factory-method/src/main/java/com/iluwatar/factory/method/OrcWeapon.java
@@ -1,9 +1,7 @@
package com.iluwatar.factory.method;
/**
- *
- * OrcWeapon
- *
+ * OrcWeapon.
*/
public class OrcWeapon implements Weapon {
@@ -17,4 +15,9 @@ public class OrcWeapon implements Weapon {
public String toString() {
return "Orcish " + weaponType;
}
+
+ @Override
+ public WeaponType getWeaponType() {
+ return weaponType;
+ }
}
diff --git a/factory-method/src/main/java/com/iluwatar/factory/method/Weapon.java b/factory-method/src/main/java/com/iluwatar/factory/method/Weapon.java
index a5ae99254..3b9a80f0f 100644
--- a/factory-method/src/main/java/com/iluwatar/factory/method/Weapon.java
+++ b/factory-method/src/main/java/com/iluwatar/factory/method/Weapon.java
@@ -1,10 +1,10 @@
package com.iluwatar.factory.method;
/**
- *
- * Weapon interface
- *
+ * Weapon interface.
*/
public interface Weapon {
+ WeaponType getWeaponType();
+
}
diff --git a/factory-method/src/test/java/com/iluwatar/factory/method/AppTest.java b/factory-method/src/test/java/com/iluwatar/factory/method/AppTest.java
deleted file mode 100644
index cb48d9ad7..000000000
--- a/factory-method/src/test/java/com/iluwatar/factory/method/AppTest.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package com.iluwatar.factory.method;
-
-import org.junit.Test;
-
-import com.iluwatar.factory.method.App;
-
-/**
- *
- * Application test
- *
- */
-public class AppTest {
-
- @Test
- public void test() {
- String[] args = {};
- App.main(args);
- }
-}
diff --git a/factory-method/src/test/java/com/iluwatar/factory/method/FactoryMethodTest.java b/factory-method/src/test/java/com/iluwatar/factory/method/FactoryMethodTest.java
new file mode 100644
index 000000000..a6786a717
--- /dev/null
+++ b/factory-method/src/test/java/com/iluwatar/factory/method/FactoryMethodTest.java
@@ -0,0 +1,79 @@
+package com.iluwatar.factory.method;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import org.junit.Test;
+
+/**
+ * The Factory Method is a creational design pattern which uses factory methods to deal with the
+ * problem of creating objects without specifying the exact class of object that will be created.
+ * This is done by creating objects via calling a factory method either specified in an interface
+ * and implemented by child classes, or implemented in a base class and optionally overridden by
+ * derived classes—rather than by calling a constructor.
+ *
+ *
Factory produces the object of its liking.
+ * The weapon {@link Weapon} manufactured by the
+ * blacksmith depends on the kind of factory implementation it is referring to.
+ *
+ */
+public class FactoryMethodTest {
+
+ /**
+ * Testing {@link OrcBlacksmith} to produce a SPEAR asserting that the Weapon is an instance
+ * of {@link OrcWeapon}.
+ */
+ @Test
+ public void testOrcBlacksmithWithSpear() {
+ Blacksmith blacksmith = new OrcBlacksmith();
+ Weapon weapon = blacksmith.manufactureWeapon(WeaponType.SPEAR);
+ verifyWeapon(weapon, WeaponType.SPEAR, OrcWeapon.class);
+ }
+
+ /**
+ * Testing {@link OrcBlacksmith} to produce a AXE asserting that the Weapon is an instance
+ * of {@link OrcWeapon}.
+ */
+ @Test
+ public void testOrcBlacksmithWithAxe() {
+ Blacksmith blacksmith = new OrcBlacksmith();
+ Weapon weapon = blacksmith.manufactureWeapon(WeaponType.AXE);
+ verifyWeapon(weapon, WeaponType.AXE, OrcWeapon.class);
+ }
+
+ /**
+ * Testing {@link ElfBlacksmith} to produce a SHORT_SWORD asserting that the Weapon is an
+ * instance of {@link ElfWeapon}.
+ */
+ @Test
+ public void testElfBlacksmithWithShortSword() {
+ Blacksmith blacksmith = new ElfBlacksmith();
+ Weapon weapon = blacksmith.manufactureWeapon(WeaponType.SHORT_SWORD);
+ verifyWeapon(weapon, WeaponType.SHORT_SWORD, ElfWeapon.class);
+ }
+
+ /**
+ * Testing {@link ElfBlacksmith} to produce a SPEAR asserting that the Weapon is an instance
+ * of {@link ElfWeapon}.
+ */
+ @Test
+ public void testElfBlacksmithWithSpear() {
+ Blacksmith blacksmith = new ElfBlacksmith();
+ Weapon weapon = blacksmith.manufactureWeapon(WeaponType.SPEAR);
+ verifyWeapon(weapon, WeaponType.SPEAR, ElfWeapon.class);
+ }
+
+ /**
+ * This method asserts that the weapon object that is passed is an instance of the clazz and the
+ * weapon is of type expectedWeaponType.
+ *
+ * @param weapon weapon object which is to be verified
+ * @param expectedWeaponType expected WeaponType of the weapon
+ * @param clazz expected class of the weapon
+ */
+ private void verifyWeapon(Weapon weapon, WeaponType expectedWeaponType, Class clazz) {
+ assertTrue("Weapon must be an object of: " + clazz.getName(), clazz.isInstance(weapon));
+ assertEquals("Weapon must be of weaponType: " + clazz.getName(), expectedWeaponType,
+ weapon.getWeaponType());
+ }
+}