package com.tddinaction.ejb3.messagedriven;
import static org.easymock.EasyMock.aryEq;
import static org.easymock.EasyMock.createMock;
import static org.easymock.EasyMock.expect;
import static org.easymock.EasyMock.replay;
import static org.easymock.EasyMock.verify;
import javax.jms.ObjectMessage;
import javax.jms.Queue;
import javax.jms.QueueConnection;
import javax.jms.QueueConnectionFactory;
import javax.jms.QueueSender;
import javax.jms.QueueSession;
import javax.jms.Session;
import org.junit.Before;
import org.junit.Test;
public class SearchListenerBeanTest {
private SearchService mockSearchService;
private QueueConnectionFactory factory;
private QueueConnection connection;
private QueueSession session;
private QueueSender sender;
private Queue mockQueue;
private ObjectMessage resultMessage;
private ObjectMessage searchMessage;
@Before
public void setUp() {
mockSearchService = createMock(SearchService.class);
factory = createMock(QueueConnectionFactory.class);
connection = createMock(QueueConnection.class);
session = createMock(QueueSession.class);
sender = createMock(QueueSender.class);
mockQueue = createMock(Queue.class);
resultMessage = createMock(ObjectMessage.class);
searchMessage = createMock(ObjectMessage.class);
}
@Test
public void searchRequestIsDelegatedAndResultsPassedForward() throws Exception {
// non-mock input objects passed to the production code
String[] keywords = new String[] { "keyword1", "keyword2" };
String[] results = new String[] { "match1", "match2" };
// expect the MDB to retrieve search request contents
expect(searchMessage.getObject()).andReturn(keywords);
// expect a call to the SearchService EJB
expect(mockSearchService.search(aryEq(keywords))).andReturn(
results);
// expect the MDB to submit search results to the results queue
expect(factory.createQueueConnection()).andReturn(connection);
expect(
connection.createQueueSession(false,
Session.AUTO_ACKNOWLEDGE)).andReturn(session);
expect(session.createSender(mockQueue)).andReturn(sender);
expect(session.createObjectMessage(aryEq(results)))
.andReturn(resultMessage);
sender.send(resultMessage);
connection.close();
// done recording expectations...
replay(mockSearchService, factory, connection, session,
mockQueue, sender, resultMessage, searchMessage);
// ...ready to invoke business logic
SearchListenerBean bean = new SearchListenerBean();
bean.searchService = mockSearchService;
bean.connectionFactory = factory;
bean.resultsQueue = mockQueue;
bean.onMessage(searchMessage);
// verify expectations
verify(mockSearchService, factory, connection, session,
mockQueue, sender, resultMessage, searchMessage);
}
}