INT-778 Add BroadCasting tests when no handlers

JIRA: https://jira.spring.io/browse/INT-778
This commit is contained in:
meherzad
2017-09-11 21:14:57 +05:30
committed by Artem Bilan
parent 6bbcfd37fa
commit defb4ff18a
2 changed files with 94 additions and 33 deletions

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2002-2016 the original author or authors.
* Copyright 2002-2017 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -43,6 +43,9 @@ import org.springframework.util.Assert;
* If the 'ignoreFailures' flag is set to <code>true</code> on the other hand, it will make a best effort to send the
* message to each of its handlers. In other words, when 'ignoreFailures' is <code>true</code>, if it fails to send to
* any one handler, it will simply log a warn-level message but continue to send the Message to any other handlers.
* <p>
* If the 'requireSubscribers' flag is set to <code>true</code>, the sent message is considered as non-dispatched
* and rejected to the caller with the {@code "Dispatcher has no subscribers"} {@link MessageDispatchingException}.
*
* @author Mark Fisher
* @author Iwein Fuld

View File

@@ -17,7 +17,12 @@
package org.springframework.integration.dispatcher;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.doThrow;
import static org.mockito.Mockito.verify;
import java.util.ArrayList;
import java.util.Collections;
@@ -30,6 +35,7 @@ import org.mockito.Mockito;
import org.springframework.core.task.TaskExecutor;
import org.springframework.integration.IntegrationMessageHeaderAccessor;
import org.springframework.integration.MessageDispatchingException;
import org.springframework.integration.support.MessageBuilder;
import org.springframework.messaging.Message;
import org.springframework.messaging.MessageHandler;
@@ -41,6 +47,7 @@ import org.springframework.messaging.support.GenericMessage;
* @author Iwein Fuld
* @author Gary Russell
* @author Artem Bilan
* @author Meherzad Lahewala
*/
public class BroadcastingDispatcherTests {
@@ -69,7 +76,7 @@ public class BroadcastingDispatcherTests {
dispatcher = new BroadcastingDispatcher();
dispatcher.addHandler(targetMock1);
dispatcher.dispatch(messageMock);
Mockito.verify(targetMock1).handleMessage(Mockito.eq(messageMock));
verify(targetMock1).handleMessage(eq(messageMock));
}
@Test
@@ -77,7 +84,7 @@ public class BroadcastingDispatcherTests {
dispatcher = new BroadcastingDispatcher(taskExecutorMock);
dispatcher.addHandler(targetMock1);
dispatcher.dispatch(messageMock);
Mockito.verify(targetMock1).handleMessage(Mockito.eq(messageMock));
verify(targetMock1).handleMessage(eq(messageMock));
}
@Test
@@ -87,9 +94,9 @@ public class BroadcastingDispatcherTests {
dispatcher.addHandler(targetMock2);
dispatcher.addHandler(targetMock3);
dispatcher.dispatch(messageMock);
Mockito.verify(targetMock1).handleMessage(Mockito.eq(messageMock));
Mockito.verify(targetMock2).handleMessage(Mockito.eq(messageMock));
Mockito.verify(targetMock3).handleMessage(Mockito.eq(messageMock));
verify(targetMock1).handleMessage(eq(messageMock));
verify(targetMock2).handleMessage(eq(messageMock));
verify(targetMock3).handleMessage(eq(messageMock));
}
@Test
@@ -99,9 +106,9 @@ public class BroadcastingDispatcherTests {
dispatcher.addHandler(targetMock2);
dispatcher.addHandler(targetMock3);
dispatcher.dispatch(messageMock);
Mockito.verify(targetMock1).handleMessage(Mockito.eq(messageMock));
Mockito.verify(targetMock2).handleMessage(Mockito.eq(messageMock));
Mockito.verify(targetMock3).handleMessage(Mockito.eq(messageMock));
verify(targetMock1).handleMessage(eq(messageMock));
verify(targetMock2).handleMessage(eq(messageMock));
verify(targetMock3).handleMessage(eq(messageMock));
}
@Test
@@ -112,9 +119,9 @@ public class BroadcastingDispatcherTests {
dispatcher.addHandler(targetMock3);
partialFailingExecutorMock(false, true, true);
dispatcher.dispatch(messageMock);
Mockito.verify(targetMock1, Mockito.never()).handleMessage(Mockito.eq(messageMock));
Mockito.verify(targetMock2).handleMessage(Mockito.eq(messageMock));
Mockito.verify(targetMock3).handleMessage(Mockito.eq(messageMock));
verify(targetMock1, Mockito.never()).handleMessage(eq(messageMock));
verify(targetMock2).handleMessage(eq(messageMock));
verify(targetMock3).handleMessage(eq(messageMock));
}
@Test
@@ -125,9 +132,9 @@ public class BroadcastingDispatcherTests {
dispatcher.addHandler(targetMock3);
partialFailingExecutorMock(true, false, true);
dispatcher.dispatch(messageMock);
Mockito.verify(targetMock1).handleMessage(Mockito.eq(messageMock));
Mockito.verify(targetMock2, Mockito.never()).handleMessage(Mockito.eq(messageMock));
Mockito.verify(targetMock3).handleMessage(Mockito.eq(messageMock));
verify(targetMock1).handleMessage(eq(messageMock));
verify(targetMock2, Mockito.never()).handleMessage(eq(messageMock));
verify(targetMock3).handleMessage(eq(messageMock));
}
@Test
@@ -138,9 +145,9 @@ public class BroadcastingDispatcherTests {
dispatcher.addHandler(targetMock3);
partialFailingExecutorMock(true, true, false);
dispatcher.dispatch(messageMock);
Mockito.verify(targetMock1).handleMessage(Mockito.eq(messageMock));
Mockito.verify(targetMock2).handleMessage(Mockito.eq(messageMock));
Mockito.verify(targetMock3, Mockito.never()).handleMessage(Mockito.eq(messageMock));
verify(targetMock1).handleMessage(eq(messageMock));
verify(targetMock2).handleMessage(eq(messageMock));
verify(targetMock3, Mockito.never()).handleMessage(eq(messageMock));
}
@Test
@@ -151,9 +158,9 @@ public class BroadcastingDispatcherTests {
dispatcher.addHandler(targetMock3);
partialFailingExecutorMock(false, false, false);
dispatcher.dispatch(messageMock);
Mockito.verify(targetMock1, Mockito.never()).handleMessage(Mockito.eq(messageMock));
Mockito.verify(targetMock2, Mockito.never()).handleMessage(Mockito.eq(messageMock));
Mockito.verify(targetMock3, Mockito.never()).handleMessage(Mockito.eq(messageMock));
verify(targetMock1, Mockito.never()).handleMessage(eq(messageMock));
verify(targetMock2, Mockito.never()).handleMessage(eq(messageMock));
verify(targetMock3, Mockito.never()).handleMessage(eq(messageMock));
}
@Test
@@ -163,7 +170,7 @@ public class BroadcastingDispatcherTests {
dispatcher.addHandler(targetMock1);
dispatcher.addHandler(targetMock1);
dispatcher.dispatch(messageMock);
Mockito.verify(targetMock1).handleMessage(Mockito.eq(messageMock));
verify(targetMock1).handleMessage(eq(messageMock));
}
@Test
@@ -174,9 +181,9 @@ public class BroadcastingDispatcherTests {
dispatcher.addHandler(targetMock3);
dispatcher.removeHandler(targetMock2);
dispatcher.dispatch(messageMock);
Mockito.verify(targetMock1).handleMessage(Mockito.eq(messageMock));
Mockito.verify(targetMock2, Mockito.never()).handleMessage(Mockito.eq(messageMock));
Mockito.verify(targetMock3).handleMessage(Mockito.eq(messageMock));
verify(targetMock1).handleMessage(eq(messageMock));
verify(targetMock2, Mockito.never()).handleMessage(eq(messageMock));
verify(targetMock3).handleMessage(eq(messageMock));
}
@Test
@@ -188,9 +195,9 @@ public class BroadcastingDispatcherTests {
dispatcher.dispatch(messageMock);
dispatcher.removeHandler(targetMock2);
dispatcher.dispatch(messageMock);
Mockito.verify(targetMock1, Mockito.times(2)).handleMessage(Mockito.eq(messageMock));
Mockito.verify(targetMock2).handleMessage(Mockito.eq(messageMock));
Mockito.verify(targetMock3, Mockito.times(2)).handleMessage(Mockito.eq(messageMock));
verify(targetMock1, Mockito.times(2)).handleMessage(eq(messageMock));
verify(targetMock2).handleMessage(eq(messageMock));
verify(targetMock3, Mockito.times(2)).handleMessage(eq(messageMock));
}
@Test
@@ -243,7 +250,8 @@ public class BroadcastingDispatcherTests {
public void testExceptionEnhancement() {
dispatcher = new BroadcastingDispatcher();
dispatcher.addHandler(targetMock1);
Mockito.doThrow(new MessagingException("Mock Exception")).when(targetMock1).handleMessage(Mockito.eq(messageMock));
doThrow(new MessagingException("Mock Exception"))
.when(targetMock1).handleMessage(eq(messageMock));
try {
dispatcher.dispatch(messageMock);
fail("Expected Exception");
@@ -263,8 +271,8 @@ public class BroadcastingDispatcherTests {
dispatcher.addHandler(targetMock1);
targetMock1.handleMessage(messageMock);
Message<String> dontReplaceThisMessage = MessageBuilder.withPayload("x").build();
Mockito.doThrow(new MessagingException(dontReplaceThisMessage, "Mock Exception"))
.when(targetMock1).handleMessage(Mockito.eq(messageMock));
doThrow(new MessagingException(dontReplaceThisMessage, "Mock Exception"))
.when(targetMock1).handleMessage(eq(messageMock));
try {
dispatcher.dispatch(messageMock);
fail("Expected Exception");
@@ -274,8 +282,58 @@ public class BroadcastingDispatcherTests {
}
}
/**
* Verifies behavior when no handler is subscribed to the dispatcher.
*/
@Test
public void testNoHandler() {
dispatcher = new BroadcastingDispatcher();
assertTrue(dispatcher.dispatch(messageMock));
}
/**
* Verifies behavior when no handler is subscribed to the dispatcher with executor.
*/
@Test
public void testNoHandlerWithExecutor() {
dispatcher = new BroadcastingDispatcher(taskExecutorMock);
assertTrue(dispatcher.dispatch(messageMock));
}
/**
* Verifies behavior when dispatcher throws exception if no handler is subscribed
* and requireSubscribers set to true.
*/
@Test
public void testNoHandlerWithRequiredSubscriber() {
dispatcher = new BroadcastingDispatcher(true);
try {
dispatcher.dispatch(messageMock);
fail("Expected Exception");
}
catch (MessageDispatchingException exception) {
assertEquals(messageMock, exception.getFailedMessage());
}
}
/**
* Verifies behavior when dispatcher with executors throws exception if no handler is subscribed
* and requireSubscribers set to true.
*/
@Test
public void testNoHandlerWithExecutorWithRequiredSubscriber() {
dispatcher = new BroadcastingDispatcher(taskExecutorMock, true);
try {
dispatcher.dispatch(messageMock);
fail("Expected Exception");
}
catch (MessageDispatchingException exception) {
assertEquals(messageMock, exception.getFailedMessage());
}
}
private void defaultTaskExecutorMock() {
Mockito.doAnswer(invocation -> {
doAnswer(invocation -> {
((Runnable) invocation.getArgument(0)).run();
return null;
}).when(taskExecutorMock).execute(Mockito.any(Runnable.class));
@@ -286,7 +344,7 @@ public class BroadcastingDispatcherTests {
*/
private void partialFailingExecutorMock(final boolean... passes) {
final AtomicInteger count = new AtomicInteger();
Mockito.doAnswer(invocation -> {
doAnswer(invocation -> {
if (passes[count.getAndIncrement()]) {
((Runnable) invocation.getArgument(0)).run();
}