いくつかの処理を行った後、JMS メッセージを送信するクラスがあります。「もの」を単体テストしたいのですが、必ずしもメッセージの送信ではありません。
テストを実行すると、「スタッフ」の緑色のバーが表示されますが、メッセージの送信時に失敗します (アプリ サーバーが実行されていないはずです)。これを行う最善の方法は、メッセージ キューをモックすることです。
私はSpringを使用しており、「キュー」とともに「jmsTemplate」が注入されています。
5 に答える
私が使用する最も簡単な答えは、メッセージ送信機能をスタブ化することです。たとえば、これがある場合:
public class SomeClass {
public void doit() {
//do some stuff
sendMessage( /*some parameters*/);
}
public void sendMessage( /*some parameters*/ ) {
//jms stuff
}
}
次に、sendMessageの動作を不明瞭にするテストを作成します。例えば:
@Test
public void testRealWorkWithoutSendingMessage() {
SomeClass thing = new SomeClass() {
@Override
public void sendMessage( /*some parameters*/ ) { /*do nothing*/ }
}
thing.doit();
assertThat( "Good stuff happened", x, is( y ) );
}
スタブアウトまたは隠蔽されているコードの量が多い場合は、匿名の内部クラスではなく、「通常の」内部クラスを使用します。
モックされた jmsTemplate を注入できます。
easymock を仮定すると、
JmsTemplate mockTemplate = createMock(JmsTemplate.class)
それはトリックを行うでしょう。
もう1つのオプションは、JDBC、JMS、JSP、JCA、およびEJBのモック環境を提供するMockRunnerです。これにより、「実際の」場合と同じようにキュー/トピックを定義し、メッセージを送信することができます。
大規模なアプリケーションでこれらすべてのテスト スタブ/モックを整理する方法について...
Spring で構成された大規模なエンタープライズ アプリを構築および維持します。実際のアプリは、JBoss Appserver で EAR として実行されます。beanRefFactory.xml で Spring コンテキストを定義しました
<bean id="TheMegaContext"
class="org.springframework.context.support.ClassPathXmlApplicationContext">
<constructor-arg>
<list>
<value>BasicServices.xml</value>
<value>DataAccessBeans.xml</value>
<value>LoginBeans.xml</value>
<value>BussinessServices.xml</value>
....
</list>
</constructor-arg>
</bean>
単体テストを実行するために、別の beanRefFactory.xml を使用するだけで、BasicServices を交換してテスト バージョンを使用します。そのテスト バージョン内で、本番バージョンと同じ名前の Bean を定義できますが、モック/スタブまたはその他の実装を使用します (たとえば、データベースはローカルの Apache DPCP プール データソースを使用し、本番バージョンは Appserver からのデータ ソースを使用します)。 )。
サーバーが実行されていないため、これはjMockユニットテストを使用するのに最適な候補ですが、jMockを使用してサーバーとの対話をシミュレートします。