Вы на правильном пути.Есть несколько способов справиться с этим.Вот пара советов по модульному тестированию с OpenEJB и Maven.
Тестирование компонентов
Вы можете написать все виды EJB и других утилит тестирования и развернуть их.Все, что вам нужно, это ejb-jar.xml
для тестового кода, например:
Как обычно, файл ejb-jar.xml
должен содержать только <ejb-jar/>
и ничего более.Его существование просто говорит OpenEJB проверять эту часть пути к классам и сканировать ее на наличие бинов.Сканирование всего пути к классам очень медленное, поэтому это просто соглашение, чтобы ускорить это.
Инъекция TestCase
С помощью вышеупомянутого src/test/resources/ejb-jar.xml
вы можете очень легко добавить MDB только для тестирования и получитьон настроен для обработки запроса так, как нужно TestCase.Но src/test/resources/ejb-jar.xml
также открывает некоторые другие интересные функции.
Вы можете сами TestCase
сделать это, объявив ссылки на любые необходимые вам JMS-ресурсы и вставив их.
import org.apache.openejb.api.LocalClient;
@LocalClient
public class ChatBeanTest extends TestCase {
@Resource
private ConnectionFactory connectionFactory;
@Resource(name = "QuestionBean")
private Queue questionQueue;
@Resource(name = "AnswerQueue")
private Queue answerQueue;
@EJB
private MyBean myBean;
@Override
protected void setUp() throws Exception {
Properties p = new Properties();
p.put(Context.INITIAL_CONTEXT_FACTORY, "org.apache.openejb.client.LocalInitialContextFactory");
InitialContext initialContext = new InitialContext(p);
initialContext.bind("inject", this); // here's the magic!
}
}
Теперь вы в одном шаге от возможности ответить на сообщение JMS самим тестовым сценарием.Вы можете запустить небольшой исполняемый модуль, который будет читать одно сообщение, отправлять нужный вам ответ, а затем завершать работу.
Может быть что-то вроде:
public void test() throws Exception {
final Thread thread = new Thread() {
@Override
public void run() {
try {
final Connection connection = connectionFactory.createConnection();
connection.start();
final Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
final MessageConsumer incoming = session.createConsumer(requestQueue);
final String text = ((TextMessage) incoming.receive(1000)).getText();
final MessageProducer outgoing = session.createProducer(responseQueue);
outgoing.send(session.createTextMessage("Hello World!"));
} catch (JMSException e) {
e.printStackTrace();
}
}
};
thread.setDaemon(true);
thread.start();
myBean.doThatThing();
// asserts here...
}
См.
АльтернативаДескрипторы
Если вы хотите использовать решение MDB и хотите включить его только для одного теста, а не для всех тестов, вы можете определить его в специальном файле src/test/resources/mockmdb.ejb-jar.xml
и включить его в конкретном тесте.случаи, когда это необходимо.
См. этот документ для получения дополнительной информации о том, как включить этот дескриптор и различные варианты альтернативных дескрипторов.