osgi:install_OSGi服务测试助手:ServiceRegistrationRule
osgi:install
OSGi服務(wù)測(cè)試可以是避免與懸掛的服務(wù)引用有關(guān)的問題的有效方法。 就像我在寫簡單服務(wù)貢獻(xiàn)驗(yàn)證中所承諾的那樣,這次我引入了一個(gè)JUnit規(guī)則 ,該規(guī)則有助于測(cè)試組件之間的交互。
OSGi服務(wù)測(cè)試組件交互
假設(shè)我們有一個(gè)服務(wù),該服務(wù)通知根據(jù)whiteboard-pattern綁定的相關(guān)觀察者。 就像上一篇文章中一樣,我們ServiceImpl有一個(gè)Service聲明和ServiceImpl 。 另外,我們支持ServiceListener ,應(yīng)在特定操作時(shí)通知此服務(wù)。
為了表示這樣的動(dòng)作,我們使用名為Service#execute()的方法聲明來擴(kuò)展示例的服務(wù)接口:
public interface Service {void execute(); }除了實(shí)現(xiàn)此execute方法之外,貢獻(xiàn)類還必須提供綁定和取消綁定ServiceListener引用的功能:
public class ServiceImplimplements Service {public void execute() {[...]}public void bind( ServiceListener listener ) {[...]}public void unbind( ServiceListener listener ) {[...]} }作為通知目的地,回調(diào)類型ServiceListener提供了一個(gè)稱為ServiceListener#executed()的方法聲明:
public interface ServiceListener {void executed(); }要完成設(shè)置,我們必須注冊(cè)服務(wù)組件,我們將通過聲明式服務(wù)再次進(jìn)行此操作。 請(qǐng)注意附加的0..n參考聲明:
<?xml version="1.0" encoding="UTF-8"?> <scr:componentxmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0"immediate="true" name="Implementation of Service API"><implementation class="com.codeaffine.example.core.ServiceImpl"/><service<<provide interface="com.codeaffine.example.api.Service"/></service><reference bind="bind" unbind="unbind"cardinality="0..n"interface="com.codeaffine.example.api.ServiceListener"name="ServiceListener"policy="dynamic" /> </scr:component>現(xiàn)在的問題是:我們?nèi)绾螠y(cè)試偵聽器的取消綁定是否正確工作以及按預(yù)期方式分發(fā)通知? 基本思想是注冊(cè)一個(gè)ServiceListener 間諜并在實(shí)際的服務(wù)實(shí)現(xiàn)上觸發(fā)Service#execute 。
間諜記錄了要execute調(diào)用,并允許驗(yàn)證綁定和通知是否按預(yù)期工作。 一旦確定了這一點(diǎn),我們就可以繼續(xù)進(jìn)行注冊(cè)并注銷主要注冊(cè)的間諜,并驗(yàn)證是否沒有收到有關(guān)后續(xù)操作事件的通知。 這樣可以確保解除綁定也按計(jì)劃進(jìn)行。
但是,這種情況下的測(cè)試夾具通常需要一點(diǎn)OSGi樣板。 為了減少混亂,我編寫了一個(gè)小的JUnit規(guī)則,該規(guī)則可以簡化服務(wù)注冊(cè)并在每次測(cè)試運(yùn)行后自動(dòng)執(zhí)行服務(wù)注冊(cè)表清理。
服務(wù)注冊(cè)規(guī)則
與其他所有JUnit TestRule ,必須在我們的PDE測(cè)試 TestRule ServiceRegistrationRule作為公共字段提供。 注意給定測(cè)試用例的類實(shí)例,規(guī)則如何使用參數(shù)化的構(gòu)造函數(shù)。 此引用用于獲取適當(dāng)?shù)腂undleContext用于服務(wù)注銷/注冊(cè)。
@Rule public final ServiceRegistrationRule serviceRegistration= new ServiceRegistrationRule( getClass() );private ServiceListener listener; private Service service;@Before public void setUp() {service = collectServices( Service.class, ServiceImpl.class ).get( 0 );listener = mock( ServiceListener.class ); }隱式測(cè)試設(shè)置使用我在上 ServiceCollector介紹的ServiceCollector檢索正在測(cè)試的注冊(cè)服務(wù) 。 使用mockito將偵聽器DOC創(chuàng)建為間諜。 上述第一個(gè)測(cè)試方案如下所示:
@Test public void executeNotification() {serviceRegistration.register( ServiceListener.class, listener );service.execute();verify( listener ).executed(); }很簡單,不是嗎?
請(qǐng)注意, ServiceRegistrationRule負(fù)責(zé)清理并從服務(wù)注冊(cè)表中刪除間諜服務(wù)。 為了便于測(cè)試解除綁定的情況,規(guī)則的register方法返回服務(wù)注冊(cè)的句柄:
@Test public void executeAfterListenerRemoval() {Registration registration= serviceRegistration.register( ServiceListener.class, listener );registration.unregister();service.execute();verify( listener, never() ).executed(); }第五行( registration.unregister() )從服務(wù)注冊(cè)表中刪除偵聽器間諜。 這將觸發(fā)解除綁定,并且永遠(yuǎn)不會(huì)調(diào)用偵聽器。 當(dāng)然,現(xiàn)實(shí)世界中的場(chǎng)景可以為多個(gè)偵聽器注冊(cè),異常處理等添加其他測(cè)試,但是我認(rèn)為這個(gè)概念已經(jīng)明確了。
結(jié)論
到目前為止, ServiceRegistrationRule在我們當(dāng)前的項(xiàng)目中證明了自己的作用。 它大大減少了樣板,使測(cè)試更清潔并提高了可讀性。 該類是Xiliary P2存儲(chǔ)庫的com.codeaffine.osgi.test.util功能的一部分: http ://fappel.github.io/xiliary
如果您想查看代碼或提出問題,也可以查看Xiliary GitHub項(xiàng)目: https : //github.com/fappel/xiliary
對(duì)于其他所有內(nèi)容,請(qǐng)隨時(shí)使用下面的評(píng)論部分。 在后續(xù)文章中,我將說明如何使用集成的PDE-Tes??ts來設(shè)置Maven-tycho構(gòu)建。 這有點(diǎn)棘手,因?yàn)閠ycho不允許訪問當(dāng)前React堆構(gòu)建的束,因此請(qǐng)繼續(xù)關(guān)注。
翻譯自: https://www.javacodegeeks.com/2015/02/osgi-service-test-helper-serviceregistrationrule.html
osgi:install
總結(jié)
以上是生活随笔為你收集整理的osgi:install_OSGi服务测试助手:ServiceRegistrationRule的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: qq便签怎么设置(qq有没有便签功能)
- 下一篇: jax-rs jax-ws_快速浏览JA