1616
1717package  org .springframework .messaging .simp .config ;
1818
19- import  java .util .List ;
20- import  java .util .Map ;
21- 
2219import  org .junit .Before ;
2320import  org .junit .Test ;
24- import  org .mockito .ArgumentCaptor ;
25- import  org .mockito .Mockito ;
2621import  org .springframework .context .annotation .AnnotationConfigApplicationContext ;
2722import  org .springframework .context .annotation .Bean ;
2823import  org .springframework .context .annotation .Configuration ;
2924import  org .springframework .messaging .Message ;
3025import  org .springframework .messaging .MessageHandler ;
31- import  org .springframework .messaging .SubscribableChannel ;
3226import  org .springframework .messaging .handler .annotation .MessageMapping ;
3327import  org .springframework .messaging .handler .annotation .SendTo ;
3428import  org .springframework .messaging .handler .websocket .SubProtocolWebSocketHandler ;
4337import  org .springframework .messaging .simp .stomp .StompHeaderAccessor ;
4438import  org .springframework .messaging .simp .stomp .StompTextMessageBuilder ;
4539import  org .springframework .messaging .support .MessageBuilder ;
40+ import  org .springframework .messaging .support .channel .AbstractSubscribableChannel ;
41+ import  org .springframework .messaging .support .channel .ExecutorSubscribableChannel ;
4642import  org .springframework .messaging .support .converter .CompositeMessageConverter ;
4743import  org .springframework .messaging .support .converter .DefaultContentTypeResolver ;
4844import  org .springframework .stereotype .Controller ;
5248import  org .springframework .web .socket .TextMessage ;
5349import  org .springframework .web .socket .support .TestWebSocketSession ;
5450
51+ import  java .util .ArrayList ;
52+ import  java .util .List ;
53+ import  java .util .Map ;
54+ 
5555import  static  org .junit .Assert .*;
56- import  static  org .mockito .Matchers .*;
57- import  static  org .mockito .Mockito .*;
5856
5957
6058/** 
@@ -95,27 +93,20 @@ public void handlerMapping() {
9593	@ Test 
9694	public  void  webSocketRequestChannel () {
9795
98- 		SubscribableChannel  channel  = this .cxtSimpleBroker .getBean ("webSocketRequestChannel" , SubscribableChannel .class );
99- 
100- 		ArgumentCaptor <MessageHandler > captor  = ArgumentCaptor .forClass (MessageHandler .class );
101- 		verify (channel , times (3 )).subscribe (captor .capture ());
96+ 		TestChannel  channel  = this .cxtSimpleBroker .getBean ("webSocketRequestChannel" , TestChannel .class );
97+ 		List <MessageHandler > handlers  = channel .handlers ;
10298
103- 		List <MessageHandler > values  = captor .getAllValues ();
104- 		assertEquals (3 , values .size ());
105- 
106- 		assertTrue (values .contains (cxtSimpleBroker .getBean (SimpAnnotationMethodMessageHandler .class )));
107- 		assertTrue (values .contains (cxtSimpleBroker .getBean (UserDestinationMessageHandler .class )));
108- 		assertTrue (values .contains (cxtSimpleBroker .getBean (SimpleBrokerMessageHandler .class )));
99+ 		assertEquals (3 , handlers .size ());
100+ 		assertTrue (handlers .contains (cxtSimpleBroker .getBean (SimpAnnotationMethodMessageHandler .class )));
101+ 		assertTrue (handlers .contains (cxtSimpleBroker .getBean (UserDestinationMessageHandler .class )));
102+ 		assertTrue (handlers .contains (cxtSimpleBroker .getBean (SimpleBrokerMessageHandler .class )));
109103	}
110104
111105	@ Test 
112106	public  void  webSocketRequestChannelWithStompBroker () {
113- 		SubscribableChannel  channel  = this .cxtStompBroker .getBean ("webSocketRequestChannel" , SubscribableChannel .class );
107+ 		TestChannel  channel  = this .cxtStompBroker .getBean ("webSocketRequestChannel" , TestChannel .class );
108+ 		List <MessageHandler > values  = channel .handlers ;
114109
115- 		ArgumentCaptor <MessageHandler > captor  = ArgumentCaptor .forClass (MessageHandler .class );
116- 		verify (channel , times (3 )).subscribe (captor .capture ());
117- 
118- 		List <MessageHandler > values  = captor .getAllValues ();
119110		assertEquals (3 , values .size ());
120111		assertTrue (values .contains (cxtStompBroker .getBean (SimpAnnotationMethodMessageHandler .class )));
121112		assertTrue (values .contains (cxtStompBroker .getBean (UserDestinationMessageHandler .class )));
@@ -125,16 +116,13 @@ public void webSocketRequestChannelWithStompBroker() {
125116	@ Test 
126117	public  void  webSocketRequestChannelSendMessage () throws  Exception  {
127118
128- 		SubscribableChannel  channel  = this .cxtSimpleBroker .getBean ("webSocketRequestChannel" , SubscribableChannel .class );
119+ 		TestChannel  channel  = this .cxtSimpleBroker .getBean ("webSocketRequestChannel" , TestChannel .class );
129120		SubProtocolWebSocketHandler  webSocketHandler  = this .cxtSimpleBroker .getBean (SubProtocolWebSocketHandler .class );
130121
131122		TextMessage  textMessage  = StompTextMessageBuilder .create (StompCommand .SEND ).headers ("destination:/foo" ).build ();
132123		webSocketHandler .handleMessage (new  TestWebSocketSession (), textMessage );
133124
134- 		ArgumentCaptor <Message > captor  = ArgumentCaptor .forClass (Message .class );
135- 		verify (channel ).send (captor .capture ());
136- 
137- 		Message  message  = captor .getValue ();
125+ 		Message <?> message  = channel .messages .get (0 );
138126		StompHeaderAccessor  headers  = StompHeaderAccessor .wrap (message );
139127
140128		assertEquals (SimpMessageType .MESSAGE , headers .getMessageType ());
@@ -143,15 +131,17 @@ public void webSocketRequestChannelSendMessage() throws Exception {
143131
144132	@ Test 
145133	public  void  webSocketResponseChannel () {
146- 		SubscribableChannel  channel  = this .cxtSimpleBroker .getBean ("webSocketResponseChannel" , SubscribableChannel .class );
147- 		verify (channel ).subscribe (any (SubProtocolWebSocketHandler .class ));
148- 		verifyNoMoreInteractions (channel );
134+ 		TestChannel  channel  = this .cxtSimpleBroker .getBean ("webSocketResponseChannel" , TestChannel .class );
135+ 		List <MessageHandler > values  = channel .handlers ;
136+ 
137+ 		assertEquals (1 , values .size ());
138+ 		assertTrue (values .get (0 ) instanceof  SubProtocolWebSocketHandler );
149139	}
150140
151141	@ Test 
152142	public  void  webSocketResponseChannelUsedByAnnotatedMethod () {
153143
154- 		SubscribableChannel  channel  = this .cxtSimpleBroker .getBean ("webSocketResponseChannel" , SubscribableChannel .class );
144+ 		TestChannel  channel  = this .cxtSimpleBroker .getBean ("webSocketResponseChannel" , TestChannel .class );
155145		SimpAnnotationMethodMessageHandler  messageHandler  = this .cxtSimpleBroker .getBean (SimpAnnotationMethodMessageHandler .class );
156146
157147		StompHeaderAccessor  headers  = StompHeaderAccessor .create (StompCommand .SUBSCRIBE );
@@ -160,12 +150,9 @@ public void webSocketResponseChannelUsedByAnnotatedMethod() {
160150		headers .setDestination ("/foo" );
161151		Message <?> message  = MessageBuilder .withPayload (new  byte [0 ]).setHeaders (headers ).build ();
162152
163- 		when (channel .send (any (Message .class ))).thenReturn (true );
164153		messageHandler .handleMessage (message );
165154
166- 		ArgumentCaptor <Message > captor  = ArgumentCaptor .forClass (Message .class );
167- 		verify (channel ).send (captor .capture ());
168- 		message  = captor .getValue ();
155+ 		message  = channel .messages .get (0 );
169156		headers  = StompHeaderAccessor .wrap (message );
170157
171158		assertEquals (SimpMessageType .MESSAGE , headers .getMessageType ());
@@ -175,7 +162,7 @@ public void webSocketResponseChannelUsedByAnnotatedMethod() {
175162
176163	@ Test 
177164	public  void  webSocketResponseChannelUsedBySimpleBroker () {
178- 		SubscribableChannel  channel  = this .cxtSimpleBroker .getBean ("webSocketResponseChannel" , SubscribableChannel .class );
165+ 		TestChannel  channel  = this .cxtSimpleBroker .getBean ("webSocketResponseChannel" , TestChannel .class );
179166		SimpleBrokerMessageHandler  broker  = this .cxtSimpleBroker .getBean (SimpleBrokerMessageHandler .class );
180167
181168		StompHeaderAccessor  headers  = StompHeaderAccessor .create (StompCommand .SUBSCRIBE );
@@ -193,12 +180,9 @@ public void webSocketResponseChannelUsedBySimpleBroker() {
193180		message  = MessageBuilder .withPayload ("bar" .getBytes ()).setHeaders (headers ).build ();
194181
195182		// message 
196- 		when (channel .send (any (Message .class ))).thenReturn (true );
197183		broker .handleMessage (message );
198184
199- 		ArgumentCaptor <Message > captor  = ArgumentCaptor .forClass (Message .class );
200- 		verify (channel ).send (captor .capture ());
201- 		message  = captor .getValue ();
185+ 		message  = channel .messages .get (0 );
202186		headers  = StompHeaderAccessor .wrap (message );
203187
204188		assertEquals (SimpMessageType .MESSAGE , headers .getMessageType ());
@@ -208,45 +192,36 @@ public void webSocketResponseChannelUsedBySimpleBroker() {
208192
209193	@ Test 
210194	public  void  brokerChannel () {
211- 		SubscribableChannel  channel  = this .cxtSimpleBroker .getBean ("brokerChannel" , SubscribableChannel .class );
212- 
213- 		ArgumentCaptor <MessageHandler > captor  = ArgumentCaptor .forClass (MessageHandler .class );
214- 		verify (channel , times (2 )).subscribe (captor .capture ());
195+ 		TestChannel  channel  = this .cxtSimpleBroker .getBean ("brokerChannel" , TestChannel .class );
196+ 		List <MessageHandler > handlers  = channel .handlers ;
215197
216- 		List <MessageHandler > values  = captor .getAllValues ();
217- 		assertEquals (2 , values .size ());
218- 		assertTrue (values .contains (cxtSimpleBroker .getBean (UserDestinationMessageHandler .class )));
219- 		assertTrue (values .contains (cxtSimpleBroker .getBean (SimpleBrokerMessageHandler .class )));
198+ 		assertEquals (2 , handlers .size ());
199+ 		assertTrue (handlers .contains (cxtSimpleBroker .getBean (UserDestinationMessageHandler .class )));
200+ 		assertTrue (handlers .contains (cxtSimpleBroker .getBean (SimpleBrokerMessageHandler .class )));
220201	}
221202
222203	@ Test 
223204	public  void  brokerChannelWithStompBroker () {
224- 		SubscribableChannel  channel  = this .cxtStompBroker .getBean ("brokerChannel" , SubscribableChannel .class );
225- 
226- 		ArgumentCaptor <MessageHandler > captor  = ArgumentCaptor .forClass (MessageHandler .class );
227- 		verify (channel , times (2 )).subscribe (captor .capture ());
205+ 		TestChannel  channel  = this .cxtStompBroker .getBean ("brokerChannel" , TestChannel .class );
206+ 		List <MessageHandler > handlers  = channel .handlers ;
228207
229- 		List <MessageHandler > values  = captor .getAllValues ();
230- 		assertEquals (2 , values .size ());
231- 		assertTrue (values .contains (cxtStompBroker .getBean (UserDestinationMessageHandler .class )));
232- 		assertTrue (values .contains (cxtStompBroker .getBean (StompBrokerRelayMessageHandler .class )));
208+ 		assertEquals (2 , handlers .size ());
209+ 		assertTrue (handlers .contains (cxtStompBroker .getBean (UserDestinationMessageHandler .class )));
210+ 		assertTrue (handlers .contains (cxtStompBroker .getBean (StompBrokerRelayMessageHandler .class )));
233211	}
234212
235213	@ Test 
236214	public  void  brokerChannelUsedByAnnotatedMethod () {
237- 		SubscribableChannel  channel  = this .cxtSimpleBroker .getBean ("brokerChannel" , SubscribableChannel .class );
215+ 		TestChannel  channel  = this .cxtSimpleBroker .getBean ("brokerChannel" , TestChannel .class );
238216		SimpAnnotationMethodMessageHandler  messageHandler  = this .cxtSimpleBroker .getBean (SimpAnnotationMethodMessageHandler .class );
239217
240218		StompHeaderAccessor  headers  = StompHeaderAccessor .create (StompCommand .SEND );
241219		headers .setDestination ("/foo" );
242220		Message <?> message  = MessageBuilder .withPayload (new  byte [0 ]).setHeaders (headers ).build ();
243221
244- 		when (channel .send (any (Message .class ))).thenReturn (true );
245222		messageHandler .handleMessage (message );
246223
247- 		ArgumentCaptor <Message > captor  = ArgumentCaptor .forClass (Message .class );
248- 		verify (channel ).send (captor .capture ());
249- 		message  = captor .getValue ();
224+ 		message  = channel .messages .get (0 );
250225		headers  = StompHeaderAccessor .wrap (message );
251226
252227		assertEquals (SimpMessageType .MESSAGE , headers .getMessageType ());
@@ -256,7 +231,7 @@ public void brokerChannelUsedByAnnotatedMethod() {
256231
257232	@ Test 
258233	public  void  brokerChannelUsedByUserDestinationMessageHandler () {
259- 		SubscribableChannel  channel  = this .cxtSimpleBroker .getBean ("brokerChannel" , SubscribableChannel .class );
234+ 		TestChannel  channel  = this .cxtSimpleBroker .getBean ("brokerChannel" , TestChannel .class );
260235		UserDestinationMessageHandler  messageHandler  = this .cxtSimpleBroker .getBean (UserDestinationMessageHandler .class );
261236
262237		this .cxtSimpleBroker .getBean (UserSessionRegistry .class ).registerSessionId ("joe" , "s1" );
@@ -265,12 +240,9 @@ public void brokerChannelUsedByUserDestinationMessageHandler() {
265240		headers .setDestination ("/user/joe/foo" );
266241		Message <?> message  = MessageBuilder .withPayload (new  byte [0 ]).setHeaders (headers ).build ();
267242
268- 		when (channel .send (any (Message .class ))).thenReturn (true );
269243		messageHandler .handleMessage (message );
270244
271- 		ArgumentCaptor <Message > captor  = ArgumentCaptor .forClass (Message .class );
272- 		verify (channel ).send (captor .capture ());
273- 		message  = captor .getValue ();
245+ 		message  = channel .messages .get (0 );
274246		headers  = StompHeaderAccessor .wrap (message );
275247
276248		assertEquals (SimpMessageType .MESSAGE , headers .getMessageType ());
@@ -340,19 +312,39 @@ static class TestWebSocketMessageBrokerConfiguration extends DelegatingWebSocket
340312
341313		@ Override 
342314		@ Bean 
343- 		public  SubscribableChannel  webSocketRequestChannel () {
344- 			return  Mockito . mock ( SubscribableChannel . class );
315+ 		public  AbstractSubscribableChannel  webSocketRequestChannel () {
316+ 			return  new   TestChannel ( );
345317		}
346318
347319		@ Override 
348320		@ Bean 
349- 		public  SubscribableChannel  webSocketResponseChannel () {
350- 			return  Mockito .mock (SubscribableChannel .class );
321+ 		public  AbstractSubscribableChannel  webSocketResponseChannel () {
322+ 			return  new  TestChannel ();
323+ 		}
324+ 
325+ 		@ Override 
326+ 		public  AbstractSubscribableChannel  brokerChannel () {
327+ 			return  new  TestChannel ();
328+ 		}
329+ 	}
330+ 
331+ 	private  static  class  TestChannel  extends  ExecutorSubscribableChannel  {
332+ 
333+ 		private  final  List <MessageHandler > handlers  = new  ArrayList <>();
334+ 
335+ 		private  final  List <Message <?>> messages  = new  ArrayList <>();
336+ 
337+ 
338+ 		@ Override 
339+ 		public  boolean  subscribeInternal (MessageHandler  handler ) {
340+ 			this .handlers .add (handler );
341+ 			return  super .subscribeInternal (handler );
351342		}
352343
353344		@ Override 
354- 		public  SubscribableChannel  brokerChannel () {
355- 			return  Mockito .mock (SubscribableChannel .class );
345+ 		public  boolean  sendInternal (Message <?> message , long  timeout ) {
346+ 			this .messages .add (message );
347+ 			return  true ;
356348		}
357349	}
358350
0 commit comments