diff --git a/mediator/pom.xml b/mediator/pom.xml
index 0e9bff5d1..58fb73628 100644
--- a/mediator/pom.xml
+++ b/mediator/pom.xml
@@ -14,5 +14,10 @@
junit
test
+
+ org.mockito
+ mockito-core
+ test
+
diff --git a/mediator/src/test/java/com/iluwatar/mediator/PartyImplTest.java b/mediator/src/test/java/com/iluwatar/mediator/PartyImplTest.java
new file mode 100644
index 000000000..992662fb2
--- /dev/null
+++ b/mediator/src/test/java/com/iluwatar/mediator/PartyImplTest.java
@@ -0,0 +1,41 @@
+package com.iluwatar.mediator;
+
+import org.junit.Test;
+
+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/19/15 - 10:00 PM
+ *
+ * @author Jeroen Meulemeester
+ */
+public class PartyImplTest {
+
+ /**
+ * Verify if a member is notified when it's joining a party. Generate an action and see if the
+ * other member gets it. Also check members don't get their own actions.
+ */
+ @Test
+ public void testPartyAction() {
+ final PartyMember partyMember1 = mock(PartyMember.class);
+ final PartyMember partyMember2 = mock(PartyMember.class);
+
+ final PartyImpl party = new PartyImpl();
+ party.addMember(partyMember1);
+ party.addMember(partyMember2);
+
+ verify(partyMember1).joinedParty(party);
+ verify(partyMember2).joinedParty(party);
+
+ party.act(partyMember1, Action.GOLD);
+ verifyZeroInteractions(partyMember1);
+ verify(partyMember2).partyAction(Action.GOLD);
+
+ verifyNoMoreInteractions(partyMember1, partyMember2);
+
+ }
+
+}
diff --git a/mediator/src/test/java/com/iluwatar/mediator/PartyMemberTest.java b/mediator/src/test/java/com/iluwatar/mediator/PartyMemberTest.java
new file mode 100644
index 000000000..31b7222e9
--- /dev/null
+++ b/mediator/src/test/java/com/iluwatar/mediator/PartyMemberTest.java
@@ -0,0 +1,128 @@
+package com.iluwatar.mediator;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+
+import java.io.PrintStream;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.function.Supplier;
+
+import static org.junit.Assert.assertEquals;
+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/19/15 - 10:13 PM
+ *
+ * @author Jeroen Meulemeester
+ */
+@RunWith(Parameterized.class)
+public class PartyMemberTest {
+
+ @Parameterized.Parameters
+ public static Collection[]> data() {
+ return Arrays.asList(
+ new Supplier[]{Hobbit::new},
+ new Supplier[]{Hunter::new},
+ new Supplier[]{Rogue::new},
+ new Supplier[]{Wizard::new}
+ );
+ }
+
+ /**
+ * The mocked standard out {@link PrintStream}, required since some actions on a {@link
+ * PartyMember} have any influence on any other 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;
+
+ /**
+ * 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);
+ }
+
+ /**
+ * The factory, used to create a new instance of the tested party member
+ */
+ private final Supplier memberSupplier;
+
+ /**
+ * Create a new test instance, using the given {@link PartyMember} factory
+ *
+ * @param memberSupplier The party member factory
+ */
+ public PartyMemberTest(final Supplier memberSupplier) {
+ this.memberSupplier = memberSupplier;
+ }
+
+ /**
+ * Verify if a party action triggers the correct output to the std-Out
+ */
+ @Test
+ public void testPartyAction() {
+ final PartyMember member = this.memberSupplier.get();
+
+ for (final Action action : Action.values()) {
+ member.partyAction(action);
+ verify(this.stdOutMock).println(member.toString() + " " + action.getDescription());
+ }
+
+ verifyNoMoreInteractions(this.stdOutMock);
+ }
+
+ /**
+ * Verify if a member action triggers the expected interactions with the party class
+ */
+ @Test
+ public void testAct() {
+ final PartyMember member = this.memberSupplier.get();
+
+ member.act(Action.GOLD);
+ verifyZeroInteractions(this.stdOutMock);
+
+ final Party party = mock(Party.class);
+ member.joinedParty(party);
+ verify(this.stdOutMock).println(member.toString() + " joins the party");
+
+ for (final Action action : Action.values()) {
+ member.act(action);
+ verify(this.stdOutMock).println(member.toString() + " " + action.toString());
+ verify(party).act(member, action);
+ }
+
+ verifyNoMoreInteractions(party, this.stdOutMock);
+ }
+
+ /**
+ * Verify if {@link PartyMember#toString()} generate the expected output
+ */
+ @Test
+ public void testToString() throws Exception {
+ final PartyMember member = this.memberSupplier.get();
+ final Class extends PartyMember> memberClass = member.getClass();
+ assertEquals(memberClass.getSimpleName(), member.toString());
+ }
+
+}