6

いくつかの処理を行った後、JMS メッセージを送信するクラスがあります。「もの」を単体テストしたいのですが、必ずしもメッセージの送信ではありません。

テストを実行すると、「スタッフ」の緑色のバーが表示されますが、メッセージの送信時に失敗します (アプリ サーバーが実行されていないはずです)。これを行う最善の方法は、メッセージ キューをモックすることです。

私はSpringを使用しており、「キュー」とともに「jmsTemplate」が注入されています。

4

5 に答える 5

8

私が使用する最も簡単な答えは、メッセージ送信機能をスタブ化することです。たとえば、これがある場合:

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 ) );
}

スタブアウトまたは隠蔽されているコードの量が多い場合は、匿名の内部クラスではなく、「通常の」内部クラスを使用します。

于 2008-12-02T22:10:08.683 に答える
6

モックされた jmsTemplate を注入できます。

easymock を仮定すると、

JmsTemplate mockTemplate = createMock(JmsTemplate.class)

それはトリックを行うでしょう。

于 2008-12-02T22:09:20.557 に答える
1

もう1つのオプションは、JDBC、JMS、JSP、JCA、およびEJBのモック環境を提供するMockRunnerです。これにより、「実際の」場合と同じようにキュー/トピックを定義し、メッセージを送信することができます。

于 2008-12-03T08:56:11.687 に答える
1

大規模なアプリケーションでこれらすべてのテスト スタブ/モックを整理する方法について...

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 からのデータ ソースを使用します)。 )。

于 2010-11-30T15:34:14.887 に答える
0

サーバーが実行されていないため、これはjMockユニットテストを使用するのに最適な候補ですが、jMockを使用してサーバーとの対話をシミュレートします。

于 2012-01-17T07:22:41.563 に答える