mirror of
https://github.com/tiennm99/java-design-patterns.git
synced 2026-08-21 00:24:57 +00:00
deps: Refactor dependencies (#3224)
* remove spring dep move junit, logging, mockito under dep mgmt * upgrade anti-corruption-layer deps * async method invocation * balking, bloc * bridge to bytecode * caching * callback - cqrs * component - health check * hexagonal - metadata mapping * rest of the patterns * remove checkstyle, take spotless into use
This commit is contained in:
@@ -67,12 +67,7 @@ public class App {
|
||||
|
||||
var baelish = new LordBaelish(kingsHand, Event.STARK_SIGHTED);
|
||||
|
||||
var emitters = List.of(
|
||||
kingsHand,
|
||||
baelish,
|
||||
varys,
|
||||
scout
|
||||
);
|
||||
var emitters = List.of(kingsHand, baelish, varys, scout);
|
||||
|
||||
Arrays.stream(Weekday.values())
|
||||
.<Consumer<? super EventEmitter>>map(day -> emitter -> emitter.timePasses(day))
|
||||
|
||||
@@ -26,12 +26,9 @@ package com.iluwatar.event.aggregator;
|
||||
|
||||
import lombok.RequiredArgsConstructor;
|
||||
|
||||
/**
|
||||
* Event enumeration.
|
||||
*/
|
||||
/** Event enumeration. */
|
||||
@RequiredArgsConstructor
|
||||
public enum Event {
|
||||
|
||||
WHITE_WALKERS_SIGHTED("White walkers sighted"),
|
||||
STARK_SIGHTED("Stark sighted"),
|
||||
WARSHIPS_APPROACHING("Warships approaching"),
|
||||
|
||||
@@ -29,9 +29,7 @@ import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* EventEmitter is the base class for event producers that can be observed.
|
||||
*/
|
||||
/** EventEmitter is the base class for event producers that can be observed. */
|
||||
public abstract class EventEmitter {
|
||||
|
||||
private final Map<Event, List<EventObserver>> observerLists;
|
||||
@@ -46,11 +44,11 @@ public abstract class EventEmitter {
|
||||
}
|
||||
|
||||
/**
|
||||
* Registers observer for specific event in the related list.
|
||||
*
|
||||
* @param obs the observer that observers this emitter
|
||||
* @param e the specific event for that observation occurs
|
||||
* */
|
||||
* Registers observer for specific event in the related list.
|
||||
*
|
||||
* @param obs the observer that observers this emitter
|
||||
* @param e the specific event for that observation occurs
|
||||
*/
|
||||
public final void registerObserver(EventObserver obs, Event e) {
|
||||
if (!observerLists.containsKey(e)) {
|
||||
observerLists.put(e, new LinkedList<>());
|
||||
@@ -62,9 +60,7 @@ public abstract class EventEmitter {
|
||||
|
||||
protected void notifyObservers(Event e) {
|
||||
if (observerLists.containsKey(e)) {
|
||||
observerLists
|
||||
.get(e)
|
||||
.forEach(observer -> observer.onEvent(e));
|
||||
observerLists.get(e).forEach(observer -> observer.onEvent(e));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -24,11 +24,8 @@
|
||||
*/
|
||||
package com.iluwatar.event.aggregator;
|
||||
|
||||
/**
|
||||
* Observers of events implement this interface.
|
||||
*/
|
||||
/** Observers of events implement this interface. */
|
||||
public interface EventObserver {
|
||||
|
||||
void onEvent(Event e);
|
||||
|
||||
}
|
||||
|
||||
@@ -26,9 +26,7 @@ package com.iluwatar.event.aggregator;
|
||||
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
/**
|
||||
* KingJoffrey observes events from {@link KingsHand}.
|
||||
*/
|
||||
/** KingJoffrey observes events from {@link KingsHand}. */
|
||||
@Slf4j
|
||||
public class KingJoffrey implements EventObserver {
|
||||
|
||||
|
||||
@@ -24,13 +24,10 @@
|
||||
*/
|
||||
package com.iluwatar.event.aggregator;
|
||||
|
||||
/**
|
||||
* KingsHand observes events from multiple sources and delivers them to listeners.
|
||||
*/
|
||||
/** KingsHand observes events from multiple sources and delivers them to listeners. */
|
||||
public class KingsHand extends EventEmitter implements EventObserver {
|
||||
|
||||
public KingsHand() {
|
||||
}
|
||||
public KingsHand() {}
|
||||
|
||||
public KingsHand(EventObserver obs, Event e) {
|
||||
super(obs, e);
|
||||
@@ -43,7 +40,8 @@ public class KingsHand extends EventEmitter implements EventObserver {
|
||||
|
||||
@Override
|
||||
public void timePasses(Weekday day) {
|
||||
// This method is intentionally left empty because KingsHand does not handle time-based events directly.
|
||||
// This method is intentionally left empty because KingsHand does not handle time-based events
|
||||
// directly.
|
||||
// It serves as a placeholder to fulfill the EventObserver interface contract.
|
||||
}
|
||||
}
|
||||
|
||||
@@ -24,13 +24,10 @@
|
||||
*/
|
||||
package com.iluwatar.event.aggregator;
|
||||
|
||||
/**
|
||||
* LordBaelish produces events.
|
||||
*/
|
||||
/** LordBaelish produces events. */
|
||||
public class LordBaelish extends EventEmitter {
|
||||
|
||||
public LordBaelish() {
|
||||
}
|
||||
public LordBaelish() {}
|
||||
|
||||
public LordBaelish(EventObserver obs, Event e) {
|
||||
super(obs, e);
|
||||
|
||||
@@ -26,14 +26,11 @@ package com.iluwatar.event.aggregator;
|
||||
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
/**
|
||||
* LordVarys produces events.
|
||||
*/
|
||||
/** LordVarys produces events. */
|
||||
@Slf4j
|
||||
public class LordVarys extends EventEmitter implements EventObserver {
|
||||
|
||||
public LordVarys() {
|
||||
}
|
||||
public LordVarys() {}
|
||||
|
||||
public LordVarys(EventObserver obs, Event e) {
|
||||
super(obs, e);
|
||||
@@ -46,7 +43,6 @@ public class LordVarys extends EventEmitter implements EventObserver {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void onEvent(Event e) {
|
||||
notifyObservers(e);
|
||||
|
||||
@@ -24,13 +24,10 @@
|
||||
*/
|
||||
package com.iluwatar.event.aggregator;
|
||||
|
||||
/**
|
||||
* Scout produces events.
|
||||
*/
|
||||
/** Scout produces events. */
|
||||
public class Scout extends EventEmitter {
|
||||
|
||||
public Scout() {
|
||||
}
|
||||
public Scout() {}
|
||||
|
||||
public Scout(EventObserver obs, Event e) {
|
||||
super(obs, e);
|
||||
|
||||
@@ -26,12 +26,9 @@ package com.iluwatar.event.aggregator;
|
||||
|
||||
import lombok.RequiredArgsConstructor;
|
||||
|
||||
/**
|
||||
* Weekday enumeration.
|
||||
*/
|
||||
/** Weekday enumeration. */
|
||||
@RequiredArgsConstructor
|
||||
public enum Weekday {
|
||||
|
||||
MONDAY("Monday"),
|
||||
TUESDAY("Tuesday"),
|
||||
WEDNESDAY("Wednesday"),
|
||||
|
||||
@@ -24,23 +24,19 @@
|
||||
*/
|
||||
package com.iluwatar.event.aggregator;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
|
||||
|
||||
/**
|
||||
* Application test
|
||||
*/
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
/** Application test */
|
||||
class AppTest {
|
||||
|
||||
/**
|
||||
* Issue: Add at least one assertion to this test case.
|
||||
* Solution: Inserted assertion to check whether the execution of the main method in {@link App#main(String[])}
|
||||
* throws an exception.
|
||||
* Issue: Add at least one assertion to this test case. Solution: Inserted assertion to check
|
||||
* whether the execution of the main method in {@link App#main(String[])} throws an exception.
|
||||
*/
|
||||
|
||||
@Test
|
||||
void shouldExecuteApplicationWithoutException() {
|
||||
assertDoesNotThrow(() -> App.main(new String[]{}));
|
||||
assertDoesNotThrow(() -> App.main(new String[] {}));
|
||||
}
|
||||
}
|
||||
|
||||
+19
-23
@@ -42,32 +42,26 @@ import org.junit.jupiter.api.Test;
|
||||
*/
|
||||
abstract class EventEmitterTest<E extends EventEmitter> {
|
||||
|
||||
/**
|
||||
* Factory used to create a new instance of the test object with a default observer
|
||||
*/
|
||||
/** Factory used to create a new instance of the test object with a default observer */
|
||||
private final BiFunction<EventObserver, Event, E> factoryWithDefaultObserver;
|
||||
|
||||
/**
|
||||
* Factory used to create a new instance of the test object without passing a default observer
|
||||
*/
|
||||
/** Factory used to create a new instance of the test object without passing a default observer */
|
||||
private final Supplier<E> factoryWithoutDefaultObserver;
|
||||
|
||||
/**
|
||||
* The day of the week an event is expected
|
||||
*/
|
||||
/** The day of the week an event is expected */
|
||||
private final Weekday specialDay;
|
||||
|
||||
/**
|
||||
* The expected event, emitted on the special day
|
||||
*/
|
||||
/** The expected event, emitted on the special day */
|
||||
private final Event event;
|
||||
|
||||
/**
|
||||
* Create a new event emitter test, using the given test object factories, special day and event
|
||||
*/
|
||||
EventEmitterTest(final Weekday specialDay, final Event event,
|
||||
final BiFunction<EventObserver, Event, E> factoryWithDefaultObserver,
|
||||
final Supplier<E> factoryWithoutDefaultObserver) {
|
||||
EventEmitterTest(
|
||||
final Weekday specialDay,
|
||||
final Event event,
|
||||
final BiFunction<EventObserver, Event, E> factoryWithDefaultObserver,
|
||||
final Supplier<E> factoryWithoutDefaultObserver) {
|
||||
|
||||
this.specialDay = specialDay;
|
||||
this.event = event;
|
||||
@@ -90,12 +84,15 @@ abstract class EventEmitterTest<E extends EventEmitter> {
|
||||
* received the correct event on the special day.
|
||||
*
|
||||
* @param specialDay The special day on which an event is emitted
|
||||
* @param event The expected event emitted by the test object
|
||||
* @param emitter The event emitter
|
||||
* @param observers The registered observer mocks
|
||||
* @param event The expected event emitted by the test object
|
||||
* @param emitter The event emitter
|
||||
* @param observers The registered observer mocks
|
||||
*/
|
||||
private void testAllDays(final Weekday specialDay, final Event event, final E emitter,
|
||||
final EventObserver... observers) {
|
||||
private void testAllDays(
|
||||
final Weekday specialDay,
|
||||
final Event event,
|
||||
final E emitter,
|
||||
final EventObserver... observers) {
|
||||
|
||||
for (final var weekday : Weekday.values()) {
|
||||
// Pass each week of the day, day by day to the event emitter
|
||||
@@ -121,7 +118,7 @@ abstract class EventEmitterTest<E extends EventEmitter> {
|
||||
* event emitter without a default observer
|
||||
*
|
||||
* @param specialDay The special day on which an event is emitted
|
||||
* @param event The expected event emitted by the test object
|
||||
* @param event The expected event emitted by the test object
|
||||
*/
|
||||
private void testAllDaysWithoutDefaultObserver(final Weekday specialDay, final Event event) {
|
||||
final var observer1 = mock(EventObserver.class);
|
||||
@@ -138,7 +135,7 @@ abstract class EventEmitterTest<E extends EventEmitter> {
|
||||
* Go over every day of the month, and check if the event is emitted on the given day.
|
||||
*
|
||||
* @param specialDay The special day on which an event is emitted
|
||||
* @param event The expected event emitted by the test object
|
||||
* @param event The expected event emitted by the test object
|
||||
*/
|
||||
private void testAllDaysWithDefaultObserver(final Weekday specialDay, final Event event) {
|
||||
final var defaultObserver = mock(EventObserver.class);
|
||||
@@ -151,5 +148,4 @@ abstract class EventEmitterTest<E extends EventEmitter> {
|
||||
|
||||
testAllDays(specialDay, event, emitter, defaultObserver, observer1, observer2);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -30,21 +30,18 @@ import static org.junit.jupiter.api.Assertions.assertNotNull;
|
||||
import java.util.Arrays;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
/**
|
||||
* EventTest
|
||||
*
|
||||
*/
|
||||
/** EventTest */
|
||||
class EventTest {
|
||||
|
||||
/**
|
||||
* Verify if every event has a non-null, non-empty description
|
||||
*/
|
||||
/** Verify if every event has a non-null, non-empty description */
|
||||
@Test
|
||||
void testToString() {
|
||||
Arrays.stream(Event.values()).map(Event::toString).forEach(toString -> {
|
||||
assertNotNull(toString);
|
||||
assertFalse(toString.trim().isEmpty());
|
||||
});
|
||||
Arrays.stream(Event.values())
|
||||
.map(Event::toString)
|
||||
.forEach(
|
||||
toString -> {
|
||||
assertNotNull(toString);
|
||||
assertFalse(toString.trim().isEmpty());
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -37,10 +37,7 @@ import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
/**
|
||||
* KingJoffreyTest
|
||||
*
|
||||
*/
|
||||
/** KingJoffreyTest */
|
||||
class KingJoffreyTest {
|
||||
|
||||
private InMemoryAppender appender;
|
||||
@@ -55,22 +52,21 @@ class KingJoffreyTest {
|
||||
appender.stop();
|
||||
}
|
||||
|
||||
/**
|
||||
* Test if {@link KingJoffrey} tells us what event he received
|
||||
*/
|
||||
/** Test if {@link KingJoffrey} tells us what event he received */
|
||||
@Test
|
||||
void testOnEvent() {
|
||||
final var kingJoffrey = new KingJoffrey();
|
||||
|
||||
IntStream.range(0, Event.values().length).forEach(i -> {
|
||||
assertEquals(i, appender.getLogSize());
|
||||
var event = Event.values()[i];
|
||||
kingJoffrey.onEvent(event);
|
||||
final var expectedMessage = "Received event from the King's Hand: " + event;
|
||||
assertEquals(expectedMessage, appender.getLastMessage());
|
||||
assertEquals(i + 1, appender.getLogSize());
|
||||
});
|
||||
|
||||
IntStream.range(0, Event.values().length)
|
||||
.forEach(
|
||||
i -> {
|
||||
assertEquals(i, appender.getLogSize());
|
||||
var event = Event.values()[i];
|
||||
kingJoffrey.onEvent(event);
|
||||
final var expectedMessage = "Received event from the King's Hand: " + event;
|
||||
assertEquals(expectedMessage, appender.getLastMessage());
|
||||
assertEquals(i + 1, appender.getLogSize());
|
||||
});
|
||||
}
|
||||
|
||||
private static class InMemoryAppender extends AppenderBase<ILoggingEvent> {
|
||||
@@ -94,5 +90,4 @@ class KingJoffreyTest {
|
||||
return log.size();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -33,15 +33,10 @@ import static org.mockito.Mockito.verifyNoMoreInteractions;
|
||||
import java.util.Arrays;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
/**
|
||||
* KingsHandTest
|
||||
*
|
||||
*/
|
||||
/** KingsHandTest */
|
||||
class KingsHandTest extends EventEmitterTest<KingsHand> {
|
||||
|
||||
/**
|
||||
* Create a new test instance, using the correct object factory
|
||||
*/
|
||||
/** Create a new test instance, using the correct object factory */
|
||||
public KingsHandTest() {
|
||||
super(null, null, KingsHand::new, KingsHand::new);
|
||||
}
|
||||
@@ -64,12 +59,12 @@ class KingsHandTest extends EventEmitterTest<KingsHand> {
|
||||
verifyNoMoreInteractions(observer);
|
||||
|
||||
// Verify if each event is passed on to the observer, nothing less, nothing more.
|
||||
Arrays.stream(Event.values()).forEach(event -> {
|
||||
kingsHand.onEvent(event);
|
||||
verify(observer, times(1)).onEvent(eq(event));
|
||||
verifyNoMoreInteractions(observer);
|
||||
});
|
||||
|
||||
Arrays.stream(Event.values())
|
||||
.forEach(
|
||||
event -> {
|
||||
kingsHand.onEvent(event);
|
||||
verify(observer, times(1)).onEvent(eq(event));
|
||||
verifyNoMoreInteractions(observer);
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -24,17 +24,11 @@
|
||||
*/
|
||||
package com.iluwatar.event.aggregator;
|
||||
|
||||
/**
|
||||
* LordBaelishTest
|
||||
*
|
||||
*/
|
||||
/** LordBaelishTest */
|
||||
class LordBaelishTest extends EventEmitterTest<LordBaelish> {
|
||||
|
||||
/**
|
||||
* Create a new test instance, using the correct object factory
|
||||
*/
|
||||
/** Create a new test instance, using the correct object factory */
|
||||
public LordBaelishTest() {
|
||||
super(Weekday.FRIDAY, Event.STARK_SIGHTED, LordBaelish::new, LordBaelish::new);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -24,17 +24,11 @@
|
||||
*/
|
||||
package com.iluwatar.event.aggregator;
|
||||
|
||||
/**
|
||||
* LordVarysTest
|
||||
*
|
||||
*/
|
||||
/** LordVarysTest */
|
||||
class LordVarysTest extends EventEmitterTest<LordVarys> {
|
||||
|
||||
/**
|
||||
* Create a new test instance, using the correct object factory
|
||||
*/
|
||||
/** Create a new test instance, using the correct object factory */
|
||||
public LordVarysTest() {
|
||||
super(Weekday.SATURDAY, Event.TRAITOR_DETECTED, LordVarys::new, LordVarys::new);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -24,19 +24,12 @@
|
||||
*/
|
||||
package com.iluwatar.event.aggregator;
|
||||
|
||||
/**
|
||||
* ScoutTest
|
||||
*
|
||||
*/
|
||||
/** ScoutTest */
|
||||
class ScoutTest extends EventEmitterTest<Scout> {
|
||||
|
||||
/**
|
||||
* Create a new test instance, using the correct object factory
|
||||
*/
|
||||
/** Create a new test instance, using the correct object factory */
|
||||
public ScoutTest() {
|
||||
|
||||
super(Weekday.TUESDAY, Event.WARSHIPS_APPROACHING, Scout::new, Scout::new);
|
||||
|
||||
super(Weekday.TUESDAY, Event.WARSHIPS_APPROACHING, Scout::new, Scout::new);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -30,19 +30,17 @@ import static org.junit.jupiter.api.Assertions.assertNotNull;
|
||||
import java.util.Arrays;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
/**
|
||||
* WeekdayTest
|
||||
*
|
||||
*/
|
||||
/** WeekdayTest */
|
||||
class WeekdayTest {
|
||||
|
||||
@Test
|
||||
void testToString() {
|
||||
Arrays.stream(Weekday.values()).forEach(weekday -> {
|
||||
final String toString = weekday.toString();
|
||||
assertNotNull(toString);
|
||||
assertEquals(weekday.name(), toString.toUpperCase());
|
||||
});
|
||||
Arrays.stream(Weekday.values())
|
||||
.forEach(
|
||||
weekday -> {
|
||||
final String toString = weekday.toString();
|
||||
assertNotNull(toString);
|
||||
assertEquals(weekday.name(), toString.toUpperCase());
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user