微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

无法在 springboot 中为 JMSListner @MockBean

如何解决无法在 springboot 中为 JMSListner @MockBean

我需要使用 mockito 测试 JMS 侦听器方法

在测试类中,当我添加 @MockBean 以验证模拟 bean 上的某些方法调用时,测试失败。

package com.practice.ActiveMqPractice.listner;

import com.practice.ActiveMqPractice.utility.StringUtility;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jms.annotation.EnableJms;
import org.springframework.jms.annotation.JmsListener;
import org.springframework.jms.core.jmstemplate;
import org.springframework.stereotype.Component;

@Component
@EnableJms
public class MyListner {
@Autowired
private jmstemplate jmstemplate;

@Autowired private StringUtility stringUtility;

@JmsListener(destination = "foo")
public void handle(String in) {
    this.jmstemplate.convertAndSend("bar",stringUtility.capitalize(in));
}
}

相应的测试类:这个测试类是“PASS”但是当我取消注释这些行时: @MockBean 私人 StringUtility stringUtility; 和 验证(字符串实用程序,时间(1))。大写(消息); 下面,我得到了错误错误如下:

package com.practice.ActiveMqPractice.listner;

import com.practice.ActiveMqPractice.utility.StringUtility;
import com.practice.ActiveMqPractice.utility.Utility2;
import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBoottest;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.jms.core.jmstemplate;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.junit.jupiter.api.Assertions.*;
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBoottest
class MyListnerTest {

@Autowired
private jmstemplate jmstemplate;

/*@MockBean
private StringUtility stringUtility;*/

@Test
public void test() {
    String message = "Hello World";
    this.jmstemplate.convertAndSend("foo",message);
    this.jmstemplate.setReceiveTimeout(10_000);
    String s = jmstemplate.receiveAndConvert("bar").toString();
    assertEquals(s,"HELLO WORLD");
    //verify(stringUtility,times(1)).capitalize(message);
}
}

异常如下:

org.springframework.jms.listener.adapter.ListenerExecutionFailedException: Listener method 'public void com.practice.ActiveMqPractice.listner.MyListner.handle(java.lang.String)' threw exception; nested exception is org.springframework.jms.support.converter.MessageConversionException: Cannot convert object of type [null] to JMS message. Supported message payloads are: String,byte array,Map<String,?>,Serializable object.
at org.springframework.jms.listener.adapter.MessagingMessageListenerAdapter.invokeHandler(MessagingMessageListenerAdapter.java:122) ~[spring-jms-5.3.6.jar:5.3.6]
at org.springframework.jms.listener.adapter.MessagingMessageListenerAdapter.onMessage(MessagingMessageListenerAdapter.java:77) ~[spring-jms-5.3.6.jar:5.3.6]
at org.springframework.jms.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:736) ~[spring-jms-5.3.6.jar:5.3.6]
at org.springframework.jms.listener.AbstractMessageListenerContainer.invokeListener(AbstractMessageListenerContainer.java:696) ~[spring-jms-5.3.6.jar:5.3.6]
at org.springframework.jms.listener.AbstractMessageListenerContainer.doExecuteListener(AbstractMessageListenerContainer.java:674) ~[spring-jms-5.3.6.jar:5.3.6]
at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.doReceiveAndExecute(AbstractPollingMessageListenerContainer.java:318) [spring-jms-5.3.6.jar:5.3.6]
at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.receiveAndExecute(AbstractPollingMessageListenerContainer.java:257) [spring-jms-5.3.6.jar:5.3.6]
at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncmessageListenerInvoker.invokeListener(DefaultMessageListenerContainer.java:1237) [spring-jms-5.3.6.jar:5.3.6]
at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncmessageListenerInvoker.executeOngoingLoop(DefaultMessageListenerContainer.java:1227) [spring-jms-5.3.6.jar:5.3.6]
at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncmessageListenerInvoker.run(DefaultMessageListenerContainer.java:1120) [spring-jms-5.3.6.jar:5.3.6]
at java.lang.Thread.run(Thread.java:748) [na:1.8.0_281]
Caused by: org.springframework.jms.support.converter.MessageConversionException: Cannot convert object of type [null] to JMS message. Supported message payloads are: String,Serializable object.
at org.springframework.jms.support.converter.SimpleMessageConverter.toMessage(SimpleMessageConverter.java:79) ~[spring-jms-5.3.6.jar:5.3.6]
at org.springframework.jms.core.jmstemplate.lambda$convertAndSend$5(jmstemplate.java:661) ~[spring-jms-5.3.6.jar:5.3.6]
at org.springframework.jms.core.jmstemplate.doSend(jmstemplate.java:604) ~[spring-jms-5.3.6.jar:5.3.6]
at org.springframework.jms.core.jmstemplate.lambda$send$3(jmstemplate.java:586) ~[spring-jms-5.3.6.jar:5.3.6]
at org.springframework.jms.core.jmstemplate.execute(jmstemplate.java:504) ~[spring-jms-5.3.6.jar:5.3.6]
at org.springframework.jms.core.jmstemplate.send(jmstemplate.java:584) ~[spring-jms-5.3.6.jar:5.3.6]
at org.springframework.jms.core.jmstemplate.convertAndSend(jmstemplate.java:661) ~[spring-jms-5.3.6.jar:5.3.6]
at com.practice.ActiveMqPractice.listner.MyListner.handle(MyListner.java:20) ~[classes/:na]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_281]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_281]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_281]
at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_281]
at org.springframework.messaging.handler.invocation.invocableHandlerMethod.doInvoke(invocableHandlerMethod.java:171) ~[spring-messaging-5.3.6.jar:5.3.6]
at org.springframework.messaging.handler.invocation.invocableHandlerMethod.invoke(invocableHandlerMethod.java:120) ~[spring-messaging-5.3.6.jar:5.3.6]
at org.springframework.jms.listener.adapter.MessagingMessageListenerAdapter.invokeHandler(MessagingMessageListenerAdapter.java:114) ~[spring-jms-5.3.6.jar:5.3.6]
... 10 common frames omitted

解决方法

您需要告诉 Mockito 在调用 capitalize 时要做什么,默认情况下,mock 将返回 null,这就是您看到该错误的原因。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。