mockito JMS模板测试:测试中JmsTemplate.convertAndSend()的执行失败/未捕获

toiithl6  于 2022-11-08  发布在  其他
关注(0)|答案(1)|浏览(115)

你好,我尝试为我的Publisher类编写测试,它使用JMSTemplate将消息发布到IBM队列,我的测试如下。测试无法执行mock jmsTemplate方法convertAndSend()。不知道我做错了什么,但我找不到任何对测试发布者的支持,因为它在Spring Framework中为其他消息代理(如带有消息收集器的rabbitMQ)提供。
下面是我的测试代码:
'''

@SpringBootTest
@DirtiesContext
public class EventPublisherTest {

    EventPublisher eventPublisher;

    JmsTemplate jmsTemplate;

    MessageCreator messageCreator;

    Session mockSession;

    @Before
    public void setup() {
        eventPublisher = Mockito.mock(EventPublisher.class);
        jmsTemplate = Mockito.mock(JmsTemplate.class);
        messageCreator = Mockito.mock(MessageCreator.class);
        mockSession = Mockito.mock(Session.class);
    }

    @Test
    public void testPublishEvent_PublishingMessage_Success() throws JMSException {
        Mockito.when(mockSession.createTextMessage(Mockito.anyString())).thenReturn(Mockito.any());

        Mockito.doAnswer(new Answer<Message>() {
            @Override
            public Message answer(InvocationOnMock invocation) throws Throwable {
                final Object[] args = invocation.getArguments();
                final MessageCreator arg = (MessageCreator)args[0];
                return arg.createMessage(mockSession);
            }
        }).when(jmsTemplate).convertAndSend(Mockito.anyString());

        eventPublisher.publishEvent(MessageBuilder.withPayload("mockMessage").build());

        Mockito.verify(jmsTemplate, Mockito.times(1))
                .convertAndSend(Mockito.anyString());
    }

'''

qxgroojn

qxgroojn1#

你只有这个eventPublisher = Mockito.mock(EventPublisher.class);,然后没有任何stub用于publishEvent()方法调用,以与jmsTemplate建立可能的连接。
JmsTemplate没有太多的模拟测试,因为在大多数情况下,我们针对嵌入式JMS代理(如ActiveMQ)进行测试。
我也看到你的Answer是不相关的,你存根:

.when(jmsTemplate).convertAndSend(Mockito.anyString());

因此,InvocationOnMock可能只有您发送的一个字符串,而convertAndSend()中不包含任何MessageCreator
我不确定您对这个单元测试的期望是什么,但目前它是错误的,肯定不能工作。
顺便说一句,这与Spring Integration无关。请注意,下次当你为问题选择标签时要小心。

相关问题