gpt4 book ai didi

java - 如何在 JUnit 中构建自动回复 JMS 监听器(在 OpenEJB 中)

转载 作者:搜寻专家 更新时间:2023-11-01 01:23:24 25 4
gpt4 key购买 nike

我有一个 EJB 可以将消息发送到 JMS 队列并等待它的回复。我想测试EJB,用OpenEJB做EJB的JUnit测试很简单。但问题是此 EJB 将等待 JMS 响应以继续处理。

虽然我可以在我的 junit 代码中发送消息,但是因为 EJB 仍在进行中,所以在 EJB 完成之前我无法运行它。

第二个解决方案是我可以初始化一个 MDB 来监听和回复来自 EJB 的 JMS 消息,但问题是 MDB 必须在 src\main\java 而不能在 src\test\java 中。问题是这只是一个测试代码,我不应该将它打包到生产环境中。 (我用的是 Maven)

还是应该使用模拟对象?

最佳答案

您走在正确的轨道上。几乎没有办法处理这个问题。以下是使用 OpenEJB 和 Maven 进行单元测试的一些技巧。

测试 bean

您可以编写各种 EJB 和其他测试实用程序并部署它们。您只需要一个 ejb-jar.xml对于这样的测试代码:

  • src/main/resources/ejb-jar.xml (正常的)

  • src/test/resources/ejb-jar.xml (测试 bean)

像往常一样ejb-jar.xml文件只需要包含 <ejb-jar/>仅此而已。它的存在只是告诉 OpenEJB 检查类路径的那部分并扫描它以查找 bean。扫描整个类路径非常慢,所以这只是加快速度的惯例。

测试用例注入(inject)

有了上面的src/test/resources/ejb-jar.xml您可以非常轻松地添加仅用于测试的 MDB,并将其设置为以 TestCase 需要的方式处理请求。但是 src/test/resources/ejb-jar.xml还打开了一些其他有趣的功能。

你可以得到 TestCase本身通过声明对您需要的任何 JMS 资源的引用并注入(inject)它们来实现。

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 中定义它。文件并在需要的特定测试用例中启用它。

参见 this doc有关如何启用该描述符和备用描述符的各种选项的更多信息。

关于java - 如何在 JUnit 中构建自动回复 JMS 监听器(在 OpenEJB 中),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7446107/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com