如何用 Mockito 模拟 JmsTemplate?

Posted

技术标签:

【中文标题】如何用 Mockito 模拟 JmsTemplate?【英文标题】:How to mock JmsTemplate with Mockito? 【发布时间】:2018-10-08 08:22:42 【问题描述】:

我尝试测试一个发送 jms 消息但我无法模拟 JmsTemplate 的类

JmsProducer.class :

@Component
public class JmsProducer 

@Autowired
private JmsTemplate jmsTemplate;

@Value("$destination")
private String destination;

public void send(String message)
    jmsTemplate.convertAndSend(destination, message);


JmsProducerTest.Class :

@RunWith(SpringRunner.class)
public class JmsProducerTest 

private static final String DESTINATION= "example";
private static final String MESSAGE= "message";

@InjectMocks
private JmsProducer jmsProducer;

@MockBean
JmsTemplate jmsTemplate;

@Before
public void init()
    ReflectionTestUtils.setField(jmsProducer, "destinationQueue", DESTINATION);


@Test
public void testsend()
    jmsProducer.send(MESSAGE);
    verify(jmsTemplate,times(1)).convertAndSend(DESTINATION, MESSAGE);


当我运行这个测试用例时,它给了我:java.lang.IllegalArgumentException: object is not an instance of declaring class

你对这个问题有什么想法吗?

【问题讨论】:

【参考方案1】:

如果您使用的是SpringRunner,则应将MockitoAnnotations.initMocks(this); 添加到init 方法中,因为@InjectMocks 将与MockitoJUnitRunner 一起正常工作。

附言。 ReflectionTestUtils.setField(jmsProducer, "destinationQueue", DESTINATION); - 但您的字段有另一个名称 - destination,而不是 destinationQueue

【讨论】:

【参考方案2】:

我还会注意到它也无法使用 jdk 1.8.05 模拟 JmsTemplate 和 ObjectMapper,当我将 JDK 更改为 1.8.74 时它工作得很好。

我参考了discussion

【讨论】:

以上是关于如何用 Mockito 模拟 JmsTemplate?的主要内容,如果未能解决你的问题,请参考以下文章

如何用mockito+spring进行单元测试

如何用mockito+spring进行单元测试

Mockito和PowerMock用法

前段如何用mock返回对象

Mockito 简明教程

Mockito 简明教程