代码之家  ›  专栏  ›  技术社区  ›  Orby

使用mockito返回空连接测试solace producer

  •  0
  • Orby  · 技术社区  · 6 年前

    我想测试一下 @Service 使用 Mockito 向安慰队列发送消息。我可以注射 @Mock 对于 SolConnectionFactory 并打电话 createQueueConnection() 但返回的模拟连接设置为空?我试着把 QueueConnection connection = null; 从服务开始就声明,但没有什么区别。这是慰问服务:

    import javax.jms.JMSException;
    import javax.jms.Queue;
    import javax.jms.QueueConnection;
    import javax.jms.QueueSender;
    import javax.jms.QueueSession;
    import javax.jms.Session;
    import javax.jms.TextMessage;
    
    @Service
    public class SolaceProducerImpl implements SolaceProducer {
    
        @Autowired
        private SolConnectionFactory solaceCachedConnectionFactory; 
    
        @Override
        public SolaceResponse sendMessage(Queue queue, String message) throws JMSException {
    
            log.info("Starting - solaceProducerImpl.sendMessageToSolace()");
    
            QueueConnection connection = null;
            QueueSession session = null;
            QueueSender sender = null;
            SolaceResponse solaceResponse = new SolaceResponse();
    
            try {
                connection = solaceCachedConnectionFactory.createQueueConnection();         
                session = connection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);                   
                sender = session.createSender(queue);           
                TextMessage textMessage = session.createTextMessage();
                textMessage.setText(message);               
                sender.send(textMessage);
            } catch (Exception ex) {
                //logged exception
            } finally {
                if (sender != null) {
                    sender.close();
                }
                if (session != null) {
                    session.close();
                }
                if (connection != null) {
                    connection.close();
                }
            }
            log.info("Finished - solaceProducerImpl.sendMessageToSolace()");
            return solaceResponse;
        }
    }
    

    还有测试:

      import org.junit.Before;
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.mockito.InjectMocks;
    import org.mockito.Mock;
    import org.mockito.Mockito;
    import org.mockito.runners.MockitoJUnitRunner;
    import org.springframework.util.Assert;
    
    import javax.jms.JMSException;
    import javax.jms.Queue;
    import javax.jms.QueueConnection;
    import javax.jms.QueueSender;
    import javax.jms.QueueSession;
    import javax.jms.Session;
    import javax.jms.TextMessage;
    import com.solacesystems.jms.SolConnectionFactory;
    
    
        @RunWith(MockitoJUnitRunner.class)
        public class SolaceProducerTest {   
    
            @Mock
            private SolConnectionFactory solaceCachedConnectionFactory; 
    
            @Mock
            private Queue queue;
    
            @Mock
            private QueueConnection connection; 
    
            @Mock
            private QueueSession queueSession;
    
            @Mock
            private QueueSender queueSender;
    
            @Mock
            private TextMessage textMessage;
    
            private static final String SAMPLE_TEXT = "Some Test Message";
    
            @InjectMocks
            private SolaceProducerImpl solaceProducer;
    
            @Test
            public void testSendMessage() throws JMSException { 
                Mockito.when(solaceCachedConnectionFactory.createConnection()).thenReturn(connection);
                Mockito.when(connection.createSession(false, Session.AUTO_ACKNOWLEDGE)).thenReturn(queueSession);
                Mockito.when(queueSession.createSender(queue)).thenReturn(queueSender);         
                textMessage.setText(SAMPLE_TEXT);
                Mockito.when(queueSession.createTextMessage()).thenReturn(textMessage);
                SolaceResponse result = solaceProducer.sendMessage(queue, SAMPLE_TEXT);
                Assert.notNull(result);
                Mockito.verify(solaceCachedConnectionFactory, Mockito.times(1)).createConnection();
                Mockito.verify(connection, Mockito.times(1)).createSession(false, Session.AUTO_ACKNOWLEDGE);
                Mockito.verify(connection, Mockito.times(1)).close();
                Mockito.verify(queueSession, Mockito.times(1)).createSender(queue);
                Mockito.verify(queueSession, Mockito.times(1)).close();
                Mockito.verify(queueSender, Mockito.times(1)).send(textMessage);
                Mockito.verify(queueSender, Mockito.times(1)).close();
            }
    
        }
    
    1 回复  |  直到 6 年前
        1
  •  2
  •   Russell Sim    6 年前

    这个问题似乎是在嘲笑而不是嘲笑 solaceCachedConnectionFactory.createConnection() ,导致它返回 null 尽管有指示。

    Mockito.when(solaceCachedConnectionFactory.createConnection()).thenReturn(connection);
    

    我做了一个快速的测试,并通过实例化被测试的类来解决这个问题。

    @InjectMocks
    private SolaceProducerImpl solaceProducer = new SolaceProducerImpl();
    

    请注意,所提供的示例还有其他几个问题。 例如,示例错误地模拟了 connection.createSession 而不是 connection.createQueueSession .

    session = connection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);                   
    
    Mockito.when(connection.createSession(false, Session.AUTO_ACKNOWLEDGE)).thenReturn(queueSession);