如何用Mockito模拟JmsTemplate?

时间:2018-04-27 13:14:52

标签: unit-testing spring-boot junit mockito spring-test

我尝试测试一个我发送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不是声明类的实例

你对这个问题有任何想法吗?

2 个答案:

答案 0 :(得分:1)

如果您使用SpringRunner,则应添加init方法MockitoAnnotations.initMocks(this);,因为@InjectMocksMockitoJUnitRunner的工作正确无误。

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

答案 1 :(得分:0)

我还会注意到它不能使用jdk 1.8.05模拟JmsTemplate和ObjectMapper,当我将JDK更改为1.8.74时效果很好。

我参考了discussion