gpt4 book ai didi

testing - Spring jmsTemplate 发送单元测试不起作用

转载 作者:行者123 更新时间:2023-11-28 20:40:17 25 4
gpt4 key购买 nike

我的服务方法如下所示,我试图模拟 JmsTemplate 以便它可以在单元测试期间发送消息,但它不执行 jmsTemplate.send(...),它直接转到下一行,怎么可能我使用单元测试执行我的服务类的部分代码 jmsTemplate.send(..)?

public int invokeCallbackListener(final MyObject payload, final MyTask task) throws Exception{
//create map of payload and taskId
int taskStatusCd = task.getTaskSatus().getCode();
final Map<String, Object> map = new HashMap<String, Object>();
map.put(PAYLOAD_KEY, payload);
map.put(TASK_ID_KEY, task.getTaskId());

//generate JMSCorrelationID
final String correlationId = UUID.randomUUID().toString();

String requestQueue = System.getProperty("REQUEST_QUEUE");
requestQueue = requestQueue!=null?requestQueue:ExportConstants.DEFAULT_REQUEST_QUEUE;
jmsTemplate.send(requestQueue, new MessageCreator() {
@Override
public Message createMessage(Session session) throws JMSException {
***ObjectMessage message = session.createObjectMessage((Serializable)map)***; //fail here. Message returns null
message.setJMSCorrelationID(correlationId);
message.setStringProperty(MESSAGE_TYPE_PROPERTY,payload.getMessageType().getMessageType());
return message;
}
});
l.info("Request Message sent with correlationID: " + correlationId);

taskStatusCd = waitForResponseStatus(task.TaskId(), taskStatusCd, correlationId);
return taskStatusCd;
}

这是我的测试类代码。

RemoteInvocationService remoteInvocationService;
JmsTemplate mockTemplate;
Session mockSession;
Queue mockQueue;
ObjectMessage mockMessage;
MessageCreator mockmessageCreator;
@Before
public void setUp() throws Exception {
remoteInvocationService = new RemoteInvocationService();
mockTemplate = mock(JmsTemplate.class);
mockSession = mock(Session.class);
mockQueue = mock(Queue.class);
mockMessage = mock(ObjectMessage.class);
mockmessageCreator = mock(MessageCreator.class);
when(mockSession.createObjectMessage()).thenReturn(mockMessage);
when(mockQueue.toString()).thenReturn("testQueue");

Mockito.doAnswer(new Answer<Message>() {
@Override
public Message answer(final InvocationOnMock invocation) throws JMSException {
final Object[] args = invocation.getArguments();
final String arg2 = (String)args[0];
final MessageCreator arg = (MessageCreator)args[1];
return arg.createMessage(mockSession);
}
}).when(mockTemplate).send(Mockito.any(MessageCreator.class));



mockTemplate.setDefaultDestination(mockQueue);
remoteInvocationService.setJmsTemplate(mockTemplate);
}


@Test
public void testMessage() throws Exception{
MyTask task = new MyTask();
task.setTaskSatus(Status.Pending);

remoteInvocationService.invokeCallbackListener(new MyObject(), task);


}

我有以下接收消息的代码,但是我得到的状态对象为空。

Message receivedMsg = jmsTemplate.receiveSelected(responseQueue, messageSelector);if(receivedMsg instanceof TextMessage){
TextMessage status = (TextMessage) receivedMsg;
l.info(status.getText());}

下面的测试代码:

  TextMessage mockTextMessage;
when(mockSession.createTextMessage()).thenReturn(mockTextMessage);
mockTextMessage.setText("5");

when(mockTemplate.receiveSelected(Mockito.any(String.class), Mockito.any(String.class))).thenReturn(mockTextMessage)

最佳答案

您正在模拟仅接受一个参数的send 方法(MessageCreator),但实际上您调用的是接受两个参数的方法(String, MessageCreator)。

String 添加到您的 mock 中:

     Mockito.doAnswer(new Answer<Message>() { 
@Override
public Message answer(final InvocationOnMock invocation) throws JMSException {
final Object[] args = invocation.getArguments();
final MessageCreator arg = (MessageCreator)args[0];
return arg.createMessage(mockSession);
}
}).when(mockTemplate).send(Mockito.any(String.class), Mockito.any(MessageCreator.class));

模拟 session 时还有一个错误。您正在模拟没有参数的方法:

when(mockSession.createObjectMessage()).thenReturn(mockMessage);

但你实际上需要用 Serializable 参数模拟那个:

when(mockSession.createObjectMessage(Mockito.any(Serializable.class)).thenReturn(mockMessage);

关于testing - Spring jmsTemplate 发送单元测试不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36223438/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com