package kr.debop4j.core.guava.eventbus; import com.google.common.eventbus.DeadEvent; import com.google.common.eventbus.EventBus; import com.google.common.eventbus.Subscribe; import lombok.Getter; import lombok.extern.slf4j.Slf4j; import org.junit.Test; import static org.hamcrest.core.Is.is; import static org.junit.Assert.*; /** * Guava 의 EventBus 를 이용하여 Publisher - Subscriber 패턴을 구현합니다. * 인터페이스가 필요 없고, Annotation만을 사용하므로 상당히 자유롭고 편합니다. * * @author 배성혁 ( sunghyouk.bae@gmail.com ) * @since 12. 12. 11 */ @Slf4j public class EventBusListenerTest { @Test public void shouldReceiveEvent() throws Exception { EventBus eventBus = new EventBus("test"); EventListener listener = new EventListener(); // register listener / subscriber eventBus.register(listener); // publish event eventBus.post(new OurTestEvent(200)); assertThat(listener.getLastMessage(), is(200)); } @Test public void shouldReceiveMultipleEvents() throws Exception { EventBus eventBus = new EventBus("multiple"); MultipleListener listener = new MultipleListener(); eventBus.register(listener); eventBus.post(100); eventBus.post(800L); assertEquals(100, listener.getLastInteger().intValue()); assertEquals(800L, listener.getLastLong().longValue()); } @Test public void shouldDetectEventWithoutListeners() throws Exception { EventBus eventBus = new EventBus("dead"); DeadEventListner deadEventListner = new DeadEventListner(); eventBus.register(deadEventListner); eventBus.post(new OurTestEvent(200)); assertTrue(deadEventListner.isNotDelivered()); } class EventListener { @Getter private int lastMessage = 0; @Subscribe public void listen(OurTestEvent event) { lastMessage = event.getMessage(); } } class OurTestEvent { @Getter private final int message; public OurTestEvent(int message) { this.message = message; } } class MultipleListener { @Getter private Integer lastInteger; @Getter private Long lastLong; @Subscribe public void listenInteger(Integer event) { lastInteger = event; } @Subscribe public void listenLong(Long event) { lastLong = event; } } class DeadEventListner { @Getter boolean notDelivered = false; // DeadEvent 는 모든 Event 발행 시 Subscriber가 받을 수 있다. Publish 한 내용보다, Publish 했다는 사실이 중요할 때 사용한다. @Subscribe public void listen(DeadEvent event) { notDelivered = true; } } }