あなたは正しい軌道に乗っています。これを処理する方法はいくつかあります。OpenEJB と Maven を使用した単体テストのヒントをいくつか紹介します。
テスト豆
あらゆる種類の EJB やその他のテスト ユーティリティを作成し、デプロイすることができます。必要なのは、ejb-jar.xml
次のようなテスト コードの だけです。
いつものように、ejb-jar.xml
ファイルには含まれているだけで、それ以上のものは必要<ejb-jar/>
ありません。その存在は、クラスパスのその部分を検査し、Bean をスキャンするように OpenEJB に指示するだけです。クラスパス全体をスキャンするのは非常に遅いため、これは速度を上げるための慣習です。
テストケース インジェクション
上記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 メッセージに応答できるようになるまであと 1 スレッドになりました。単一のメッセージを読み取り、必要な応答を送信して終了する小さなランナブルを起動できます。
たぶん次のようなものです:
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 ソリューションを使用する必要があり、すべてのテストではなく 1 つのテストのみで有効にしたい場合は、特別なsrc/test/resources/mockmdb.ejb-jar.xml
ファイルで定義し、必要な特定のテスト ケースで有効にすることができます。
その記述子と代替記述子のさまざまなオプションを有効にする方法の詳細については、このドキュメントを参照してください。