你在正确的轨道上。处理这个问题的方法很少。下面是一些使用 OpenEJB 和 Maven 进行单元测试的技巧。
测试豆
您可以编写各种 EJB 和其他测试实用程序并部署它们。您所需要的只是ejb-jar.xml
测试代码,如下所示:
像往常一样,ejb-jar.xml
文件只需要包含<ejb-jar/>
,仅此而已。它的存在只是告诉 OpenEJB 检查类路径的那部分并扫描它以查找 bean。扫描整个类路径非常慢,所以这只是加快速度的惯例。
测试用例注入
使用上述内容,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
文件中定义它并在需要它的特定测试用例中启用它。
有关如何启用该描述符以及备用描述符的各种选项的更多信息,请参阅此文档。