У меня очень простой класс MessageHandler, который благодаря Spring Boot работает во время выполнения со следующими строками кода и конфигурации:
обработчик сообщений
@Component
public class MessageHandler {
@JmsListener(destination = "${solace.jms.queueName}")
public void processMsg(Message msg) {
MessageHeaders hdrs = msg.getHeaders();
etc...
основной класс
@SpringBootApplication
public class Application implements CommandLineRunner {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
config
solace.jms.client-name=eeeee
solace.jms.client-password=dddd
solace.jms.client-username=ccccc
solace.jms.msg-vpn=bbbb
solace.jms.host=smf://aaaaa.xx.yy.com:8000
solace.jms.queueName=ffffff
полный помпон
<?xml version = "1.0" encoding = "UTF-8"?>
<project xmlns = "http://maven.apache.org/POM/4.0.0"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>blah</groupId>
<artifactId>blahblah</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<start-class>blah.Application</start-class>
<java.version>1.8</java.version>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<cucumber.version>2.3.1</cucumber.version>
</properties>
<dependencies>
<dependency>
<groupId>com.solace.spring.boot</groupId>
<artifactId>solace-jms-spring-boot-parent</artifactId>
<version>2.0.0</version>
<type>pom</type>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.0.5.RELEASE</version>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.solace.spring.boot</groupId>
<artifactId>solace-jms-spring-boot-starter</artifactId>
<version>2.0.0</version>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
<version>2.0.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
<version>2.0.5.RELEASE</version>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>1.4.197</version>
</dependency>
<dependency>
<groupId>com.sybase</groupId>
<artifactId>jconn4</artifactId>
<version>16</version>
</dependency>
<dependency>
<groupId>org.liquibase</groupId>
<artifactId>liquibase-core</artifactId>
<version>3.5.3</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<version>2.0.5.RELEASE</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<version>2.0.5.RELEASE</version>
<scope>test</scope>
<exclusions>
<exclusion>
<artifactId>android-json</artifactId>
<groupId>com.vaadin.external.google</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>io.cucumber</groupId>
<artifactId>cucumber-java</artifactId>
<version>${cucumber.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.cucumber</groupId>
<artifactId>cucumber-junit</artifactId>
<version>${cucumber.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.cucumber</groupId>
<artifactId>cucumber-spring</artifactId>
<version>${cucumber.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.0.5.RELEASE</version>
<configuration>
<fork>true</fork>
<skip>false</skip>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
Сейчас я ищу, как это проверить во время компиляции. У меня есть конкретные вопросы: как выполнить автоматическую привязку JmsTemplate как имитируемого экземпляра и какие значения конфигурации я должен использовать в свойствах тестового приложения.
Спасибо




Вы можете использовать встроенный брокер экземпляров ActiveMQ для тестирования.
When ActiveMQ is available on the classpath, Spring Boot can also configure a ConnectionFactory. If the broker is present, an embedded broker is automatically started and configured (provided no broker URL is specified through configuration).
это сложно обсуждать, когда вы не показываете свой maven pom-файл.
извиняюсь, он довольно большой, но добавлен сейчас
Взгляните на Мок-тесты JMS, которые являются частью расширенных примеров тестирования для Spring Integration. Обратите внимание, что это отличается от интеграционного тестирования (несмотря на название), которое предполагает подключение к реальному брокеру. Мок-тесты не включают в себя какого-либо брокера (внешнего или встроенного) и включают проверку как действительных, так и недействительных сообщений.
В качестве альтернативы вы можете использовать Spring Cloud Stream для обработки сообщений. Это более простой / новый способ создания микросервисов Spring Boot, управляемых событиями, который позволяет избежать написания стандартного кода обмена сообщениями, например, при использовании JmsTemplate. Для брокера Solace доступен связующее. Более того, вы также можете смоделировать MessageHandler и протестировать аналогично примерам Spring Integration, упомянутым ранее. Подробнее см. эта статья.
Спасибо за быстрый ответ! Но теперь у меня есть зависимости solace-jms-spring-boot-starter и spring-boot-starter-activemq. Я могу пометить activemq с помощью проверки области видимости, но я не могу отметить jms с помощью среды выполнения. Как сообщить Spring Boot использовать зависимость MQ, если она доступна?