Added tests for observer pattern
This commit is contained in:
parent
4c938ab8a5
commit
3e20a2afa8
@ -14,5 +14,10 @@
|
||||
<artifactId>junit</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.mockito</groupId>
|
||||
<artifactId>mockito-core</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
</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);
|
||||
}
|
||||
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user