0

Spring JMSTemplate を介して jms メッセージを送信するコード部分があります。メソッドのテストには、Mockito を使用します。

私のコードは次のようになります.... publishDialogueServiceMessage()->

 brokerUrl = jmsQueueProperties.getProperty(MessageRouterConstants.JMS_QUEUE_URL);  
        LOG.info("The broker url is : {}", brokerUrl);  
        jmsTemplate.send(jmsQueueProperties.getProperty(MessageRouterConstants.QUEUE), new MessageCreator() {

            @Override
            public Message createMessage(Session session) throws JMSException {             
                ObjectMessage obj = session.createObjectMessage(serviceResponse);
                messageSent = true;
                return obj;
            }
        });

上記のコードでは、ブール変数をtrueに設定して、メッセージが送信されたかどうかを確認します

私のテストは次のようになります。

@Before
    public void setUp() throws Exception {

        connectionFactory = Mockito.spy(new ActiveMQConnectionFactory(
                "vm://localhost?broker.persistent=false"));
        conn = connectionFactory.createConnection();
        conn.start();       
    } 

@After
public void cleanUp() throws Exception{
    conn.stop();
}


@Test
    public void testPublishDialogueServiceMessage()
    {
        ServiceResponse response = Mockito.mock(
                ServiceResponse.class, Mockito.withSettings()
                        .serializable());
        JmsTemplate mockTemplate = Mockito.mock(JmsTemplate.class);
        java.util.Properties p = Mockito.mock(java.util.Properties.class);      
        Mockito.when(p.getProperty(MessageRouterConstants.QUEUE))
                .thenReturn("outbound.request.queue");
        mockTemplate.setConnectionFactory(connectionFactory);
        mockTemplate.setDeliveryPersistent(true);
        mockTemplate.setSessionAcknowledgeMode(2);
        mockTemplate.setSessionTransacted(true);

        ReflectionTestUtils.setField(publisher, "jmsQueueProperties", p);
        ReflectionTestUtils.setField(publisher, "jmsTemplate", mockTemplate);

        // test
        publisher.publishDialogueServiceMessage(response);
        ArgumentCaptor<MessageCreator> msgCreator = ArgumentCaptor.forClass(MessageCreator.class);
        Mockito.verify(p, Mockito.times(2))
                .getProperty(Mockito.anyString());
        Mockito.verify(mockTemplate, Mockito.times(1)).send(
                Mockito.anyString(), Mockito.any(MessageCreator.class));

        //MessageCreator msgCrt = Mockito.spy(msgCreator.getValue());
        //Assert.notNull(msgCrt);

        Assert.isTrue(publisher.isMessageSent());
    }

テストでは、 publisher.isMessageSent()が常に送信メッセージが実行されていないように見えることを示す FALSE を返すため、興味深い問題に直面しています (?)。しかし、Mockito.verify(mockTemplate, Mockito.times(1)).send(Mockito.anyString(), Mockito.any(MessageCreator.class)); うまくいきます。

私の messageSent 変数が設定されていない原因は何だろうと思っています。誰かが私が間違っているかもしれないことに光を当てることができますか?

4

1 に答える 1

7

jmsTemplateシンプルです。 (あなたの)のモックがありますmockTemplate。メソッドがモックで呼び出されると、モックへの呼び出しを記録する以外には何もしません。そのため、モックは を呼び出す必要があることを知りませんmsgCreator

あなたのテストを見ると、Mockito の知識が不足していることを示唆する明らかな問題がいくつか見られます。なぜこれらのフィールドをすべてオンに設定しているのmockTemplateですか? これはモックであり、これらのフィールドは使用しません。@Beforeこれは、とにコードが必要ないことも示唆しています@After

テストで JMS 経由でメッセージを送信する (それによってメッセージ クリエータを呼び出す) ことが本当に必要な場合は、モックの代わりにspyonを使用する必要があります。JmsTemplateただし、テストは外部システムに依存し、実質的にテストすることになるため、これは強くお勧めしませんJsmTemplate。モックが適切に呼び出されるという事実で十分です。あなたがする必要があると私が思う唯一の追加のことは、モックに渡されるメッセージクリエーターを呼び出して、メッセージが正しく作成されることを確認することです。

于 2013-05-10T10:42:36.073 に答える