Как издеваться над JmsTemplate с Mockito? - PullRequest
0 голосов
/ 27 апреля 2018

Я пытаюсь протестировать класс, в который отправляю сообщение 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: объект не является экземпляром объявления класса

У вас есть идеи по этому вопросу?

Ответы [ 2 ]

0 голосов
/ 30 апреля 2018

Я бы также заметил, что он не может Mock JmsTemplate и ObjectMapper тоже с jdk 1.8.05, и когда я изменяю JDK на 1.8.74, он работает хорошо.

Я ссылался на обсуждение

0 голосов
/ 28 апреля 2018

Если вы используете SpringRunner, вы должны добавить к init метод MockitoAnnotations.initMocks(this);, потому что @InjectMocks будет работать правильно с MockitoJUnitRunner.

PS. ReflectionTestUtils.setField(jmsProducer, "destinationQueue", DESTINATION); - но ваши поля имеют другое имя - destination, а не destinationQueue

...