如何單元測試 JMS 程式碼
常見問題 > JMS > 如何單元測試 JMS 程式碼
當使用 JMS 進行程式碼單元測試時,您通常會希望避免執行獨立進程的額外開銷;此外,您會希望盡可能加快啟動時間,因為您往往會頻繁執行單元測試,並希望獲得立即的回饋。此外,持久性通常會導致問題 - 因為先前的測試案例結果可能會對未來的測試案例執行產生不利影響 - 因此您通常需要在啟動時清除佇列。
因此,在進行 JMS 程式碼單元測試時,我們建議以下事項
- 使用嵌入式訊息代理程式以避免需要單獨的訊息代理程式進程。
- 停用訊息代理程式持久性,這樣在測試之前/之後就不需要清除佇列。
- 使用 Java 程式碼透過 Spring 等 XML 設定檔來建立訊息代理程式通常更簡單且更快。
您可以使用以下 Java 程式碼來建立您的 JMS ConnectionFactory
,它也會自動建立嵌入式訊息代理程式
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("vm://127.0.0.1?broker.persistent=false");
如需更多設定選項,請參閱VM 傳輸參考和訊息代理程式設定 URI
或者,如果您真的想要更明確地操作,您可以先使用以下 Java 程式碼建立訊息代理程式
BrokerService broker = new BrokerService();
broker.setPersistent(false);
broker.start();
或者您可以使用Spring 支援。
使用 JNDI
如果您的應用程式程式碼正在使用 JNDI 來查詢 JMS ConnectionFactory
和要使用的 Destination
,那麼您可以使用 ActiveMQ Classic 中的JNDI 支援。
將以下 jndi.properties
加入您的類別路徑,例如,如果您使用 maven,則加入 src/test/resources
中
java.naming.factory.initial = org.apache.activemq.jndi.ActiveMQInitialContextFactory
java.naming.provider.url = vm://127.0.0.1?broker.persistent=false
然後您應該考慮使用JNDI 中的動態目的地,以便您的程式碼透過以下方式查詢目的地
context.lookup("dynamicQueues/FOO.BAR");
使用 EmbeddedActiveMQBroker
JUnit 規則 (ActiveMQ 5.13)
如果您的測試程式碼正在使用 JUnit,那麼您可以使用 activemq-junit
函式庫中提供的 EmbeddedActiveMQBroker
JUnit 規則。將 activemq-junit
函式庫以及您想要測試的 ActiveMQ Classic 版本的 activemq-broker
函式庫一起加入。該規則將使用在類別路徑中找到的任何版本的 ActiveMQ Classic,因此如果 ActiveMQ Classic 函式庫尚未存在,則需要指定它們。
如果您正在使用 Maven,請將以下內容加入您的 pom.xml
<dependency>
<groupId>org.apache.activemq.tooling</groupId>
<artifactId>activemq-junit</artifactId>
<version>${activemq-junit-version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-broker</artifactId>
<version>${activemq-version}</version>
<scope>test</scope>
</dependency>
然後將 EmbeddedActiveMQBroker
JUnit 規則加入您的測試中,JUnit 將在每個測試開始時啟動嵌入式訊息代理程式,並在測試結束時停止訊息代理程式。
使用 ActiveMQ Classic JUnit 規則
@Rule
public EmbeddedActiveMQBroker broker = new EmbeddedActiveMQBroker();
預設情況下,EmbeddedActiveMQBroker
將訊息代理程式設定為非持久性,並且唯一可用的傳輸將是 VM 傳輸。若要自訂此設定,請擴展 EmbeddedActiveMQBroker
類別並覆寫 configure()
方法,或使用訊息代理程式的 XML 設定。
注意:若要使用 XML 設定來設定 EmbeddedActiveMQBroker
,您可能需要將其他函式庫加入類別路徑中,以支援 ActiveMQ 的 XBean 設定。
使用 Java 自訂 EmbeddedActiveMQBroker
@Rule
EmbeddedActiveMQBroker customizedBroker = new EmbeddedActiveMQBroker() {
@Override
protected void configure() {
// Perform additional configuration here...
}
}
使用 XML 設定自訂 EmbeddedActiveMQBroker
@Rule
EmbeddedActiveMQBroker customizedBroker = new EmbeddedActiveMQBroker("bean:customize-activemq.xml");
請注意,若要使用 XML 設定,您可能需要在類別路徑中加入其他函式庫,以支援 ActiveMQ Classic 的 XBean 設定。 spring-context
函式庫的版本應與您選取的 ActiveMQ Classic 版本使用的版本對應。
XBean 設定的 Maven 設定
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>Appropriate version for activemq-version</version>
</dependency>
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-spring</artifactId>
<version>${activemq-version></version>
</dependency>
然後您可以使用 VM URI 連接訊息代理程式
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("vm://embedded-broker?create=false");
您也可以從 EmbeddedActiveMQBroker
取得連線工廠
ConnectionFactory connectionFactory = embeddedBroker.createConnectionFactory();