Added tests for observer pattern
This commit is contained in:
		@@ -14,5 +14,10 @@
 | 
				
			|||||||
      <artifactId>junit</artifactId>
 | 
					      <artifactId>junit</artifactId>
 | 
				
			||||||
      <scope>test</scope>
 | 
					      <scope>test</scope>
 | 
				
			||||||
    </dependency>
 | 
					    </dependency>
 | 
				
			||||||
 | 
					    <dependency>
 | 
				
			||||||
 | 
					      <groupId>org.mockito</groupId>
 | 
				
			||||||
 | 
					      <artifactId>mockito-core</artifactId>
 | 
				
			||||||
 | 
					      <scope>test</scope>
 | 
				
			||||||
 | 
					    </dependency>
 | 
				
			||||||
  </dependencies>
 | 
					  </dependencies>
 | 
				
			||||||
</project>
 | 
					</project>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -0,0 +1,37 @@
 | 
				
			|||||||
 | 
					package com.iluwatar.observer;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import org.junit.runner.RunWith;
 | 
				
			||||||
 | 
					import org.junit.runners.Parameterized;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import java.util.ArrayList;
 | 
				
			||||||
 | 
					import java.util.Collection;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Date: 12/27/15 - 12:07 PM
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @author Jeroen Meulemeester
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					@RunWith(Parameterized.class)
 | 
				
			||||||
 | 
					public class HobbitsTest extends WeatherObserverTest<Hobbits> {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  @Parameterized.Parameters
 | 
				
			||||||
 | 
					  public static Collection<Object[]> data() {
 | 
				
			||||||
 | 
					    final ArrayList<Object[]> testData = new ArrayList<>();
 | 
				
			||||||
 | 
					    testData.add(new Object[]{WeatherType.SUNNY, "The happy hobbits bade in the warm sun."});
 | 
				
			||||||
 | 
					    testData.add(new Object[]{WeatherType.RAINY, "The hobbits look for cover from the rain."});
 | 
				
			||||||
 | 
					    testData.add(new Object[]{WeatherType.WINDY, "The hobbits hold their hats tightly in the windy weather."});
 | 
				
			||||||
 | 
					    testData.add(new Object[]{WeatherType.COLD, "The hobbits are shivering in the cold weather."});
 | 
				
			||||||
 | 
					    return testData;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /**
 | 
				
			||||||
 | 
					   * Create a new test with the given weather and expected response
 | 
				
			||||||
 | 
					   *
 | 
				
			||||||
 | 
					   * @param weather  The weather that should be unleashed on the observer
 | 
				
			||||||
 | 
					   * @param response The expected response from the observer
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					  public HobbitsTest(final WeatherType weather, final String response) {
 | 
				
			||||||
 | 
					    super(weather, response, Hobbits::new);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										37
									
								
								observer/src/test/java/com/iluwatar/observer/OrcsTest.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								observer/src/test/java/com/iluwatar/observer/OrcsTest.java
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,37 @@
 | 
				
			|||||||
 | 
					package com.iluwatar.observer;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import org.junit.runner.RunWith;
 | 
				
			||||||
 | 
					import org.junit.runners.Parameterized;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import java.util.ArrayList;
 | 
				
			||||||
 | 
					import java.util.Collection;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Date: 12/27/15 - 12:07 PM
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @author Jeroen Meulemeester
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					@RunWith(Parameterized.class)
 | 
				
			||||||
 | 
					public class OrcsTest extends WeatherObserverTest<Orcs> {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  @Parameterized.Parameters
 | 
				
			||||||
 | 
					  public static Collection<Object[]> data() {
 | 
				
			||||||
 | 
					    final ArrayList<Object[]> testData = new ArrayList<>();
 | 
				
			||||||
 | 
					    testData.add(new Object[]{WeatherType.SUNNY, "The sun hurts the orcs' eyes."});
 | 
				
			||||||
 | 
					    testData.add(new Object[]{WeatherType.RAINY, "The orcs are dripping wet."});
 | 
				
			||||||
 | 
					    testData.add(new Object[]{WeatherType.WINDY, "The orc smell almost vanishes in the wind."});
 | 
				
			||||||
 | 
					    testData.add(new Object[]{WeatherType.COLD, "The orcs are freezing cold."});
 | 
				
			||||||
 | 
					    return testData;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /**
 | 
				
			||||||
 | 
					   * Create a new test with the given weather and expected response
 | 
				
			||||||
 | 
					   *
 | 
				
			||||||
 | 
					   * @param weather  The weather that should be unleashed on the observer
 | 
				
			||||||
 | 
					   * @param response The expected response from the observer
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					  public OrcsTest(final WeatherType weather, final String response) {
 | 
				
			||||||
 | 
					    super(weather, response, Orcs::new);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										54
									
								
								observer/src/test/java/com/iluwatar/observer/StdOutTest.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										54
									
								
								observer/src/test/java/com/iluwatar/observer/StdOutTest.java
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,54 @@
 | 
				
			|||||||
 | 
					package com.iluwatar.observer;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import org.junit.After;
 | 
				
			||||||
 | 
					import org.junit.Before;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import java.io.PrintStream;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import static org.mockito.Mockito.mock;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Date: 12/27/15 - 12:16 PM
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @author Jeroen Meulemeester
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					public abstract class StdOutTest {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /**
 | 
				
			||||||
 | 
					   * The mocked standard out {@link PrintStream}, required since changes in the weather doesn't has
 | 
				
			||||||
 | 
					   * 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);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /**
 | 
				
			||||||
 | 
					   * Get the mocked stdOut {@link PrintStream}
 | 
				
			||||||
 | 
					   *
 | 
				
			||||||
 | 
					   * @return The stdOut print stream mock, renewed before each test
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					  final PrintStream getStdOutMock() {
 | 
				
			||||||
 | 
					    return this.stdOutMock;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -0,0 +1,59 @@
 | 
				
			|||||||
 | 
					package com.iluwatar.observer;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import org.junit.Test;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import java.util.function.Supplier;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import static org.mockito.Mockito.verify;
 | 
				
			||||||
 | 
					import static org.mockito.Mockito.verifyNoMoreInteractions;
 | 
				
			||||||
 | 
					import static org.mockito.Mockito.verifyZeroInteractions;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Date: 12/27/15 - 11:44 AM
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @author Jeroen Meulemeester
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					public abstract class WeatherObserverTest<O extends WeatherObserver> extends StdOutTest {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /**
 | 
				
			||||||
 | 
					   * The observer instance factory
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					  private final Supplier<O> factory;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /**
 | 
				
			||||||
 | 
					   * The weather type currently tested
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					  private final WeatherType weather;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /**
 | 
				
			||||||
 | 
					   * The expected response from the observer
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					  private final String response;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /**
 | 
				
			||||||
 | 
					   * Create a new test instance using the given parameters
 | 
				
			||||||
 | 
					   *
 | 
				
			||||||
 | 
					   * @param weather  The weather currently being tested
 | 
				
			||||||
 | 
					   * @param response The expected response from the observer
 | 
				
			||||||
 | 
					   * @param factory  The factory, used to create an instance of the tested observer
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					  WeatherObserverTest(final WeatherType weather, final String response, final Supplier<O> factory) {
 | 
				
			||||||
 | 
					    this.weather = weather;
 | 
				
			||||||
 | 
					    this.response = response;
 | 
				
			||||||
 | 
					    this.factory = factory;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /**
 | 
				
			||||||
 | 
					   * Verify if the weather has the expected influence on the observer
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					  @Test
 | 
				
			||||||
 | 
					  public void testObserver() {
 | 
				
			||||||
 | 
					    final O observer = this.factory.get();
 | 
				
			||||||
 | 
					    verifyZeroInteractions(getStdOutMock());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    observer.update(this.weather);
 | 
				
			||||||
 | 
					    verify(getStdOutMock()).println(this.response);
 | 
				
			||||||
 | 
					    verifyNoMoreInteractions(getStdOutMock());
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -0,0 +1,61 @@
 | 
				
			|||||||
 | 
					package com.iluwatar.observer;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import org.junit.Test;
 | 
				
			||||||
 | 
					import org.mockito.InOrder;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					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/27/15 - 11:08 AM
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @author Jeroen Meulemeester
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					public class WeatherTest extends StdOutTest {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /**
 | 
				
			||||||
 | 
					   * Add a {@link WeatherObserver}, verify if it gets notified of a weather change, remove the
 | 
				
			||||||
 | 
					   * observer again and verify that there are no more notifications.
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					  @Test
 | 
				
			||||||
 | 
					  public void testAddRemoveObserver() {
 | 
				
			||||||
 | 
					    final WeatherObserver observer = mock(WeatherObserver.class);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    final Weather weather = new Weather();
 | 
				
			||||||
 | 
					    weather.addObserver(observer);
 | 
				
			||||||
 | 
					    verifyZeroInteractions(observer);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    weather.timePasses();
 | 
				
			||||||
 | 
					    verify(getStdOutMock()).println("The weather changed to rainy.");
 | 
				
			||||||
 | 
					    verify(observer).update(WeatherType.RAINY);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    weather.removeObserver(observer);
 | 
				
			||||||
 | 
					    weather.timePasses();
 | 
				
			||||||
 | 
					    verify(getStdOutMock()).println("The weather changed to windy.");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    verifyNoMoreInteractions(observer, getStdOutMock());
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /**
 | 
				
			||||||
 | 
					   * Verify if the weather passes in the order of the {@link WeatherType}s
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					  @Test
 | 
				
			||||||
 | 
					  public void testTimePasses() {
 | 
				
			||||||
 | 
					    final WeatherObserver observer = mock(WeatherObserver.class);
 | 
				
			||||||
 | 
					    final Weather weather = new Weather();
 | 
				
			||||||
 | 
					    weather.addObserver(observer);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    final InOrder inOrder = inOrder(observer, getStdOutMock());
 | 
				
			||||||
 | 
					    final WeatherType[] weatherTypes = WeatherType.values();
 | 
				
			||||||
 | 
					    for (int i = 1; i < 20; i++) {
 | 
				
			||||||
 | 
					      weather.timePasses();
 | 
				
			||||||
 | 
					      inOrder.verify(observer).update(weatherTypes[i % weatherTypes.length]);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    verifyNoMoreInteractions(observer);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Reference in New Issue
	
	Block a user