osgi:install_OSGi服务测试助手:ServiceRegistrationRule
osgi:install
OSGi服務測試可以是避免與懸掛的服務引用有關的問題的有效方法。 就像我在寫簡單服務貢獻驗證中所承諾的那樣,這次我引入了一個JUnit規則 ,該規則有助于測試組件之間的交互。
OSGi服務測試組件交互
假設我們有一個服務,該服務通知根據whiteboard-pattern綁定的相關觀察者。 就像上一篇文章中一樣,我們ServiceImpl有一個Service聲明和ServiceImpl 。 另外,我們支持ServiceListener ,應在特定操作時通知此服務。
為了表示這樣的動作,我們使用名為Service#execute()的方法聲明來擴展示例的服務接口:
public interface Service {void execute(); }除了實現此execute方法之外,貢獻類還必須提供綁定和取消綁定ServiceListener引用的功能:
public class ServiceImplimplements Service {public void execute() {[...]}public void bind( ServiceListener listener ) {[...]}public void unbind( ServiceListener listener ) {[...]} }作為通知目的地,回調類型ServiceListener提供了一個稱為ServiceListener#executed()的方法聲明:
public interface ServiceListener {void executed(); }要完成設置,我們必須注冊服務組件,我們將通過聲明式服務再次進行此操作。 請注意附加的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>現在的問題是:我們如何測試偵聽器的取消綁定是否正確工作以及按預期方式分發通知? 基本思想是注冊一個ServiceListener 間諜并在實際的服務實現上觸發Service#execute 。
間諜記錄了要execute調用,并允許驗證綁定和通知是否按預期工作。 一旦確定了這一點,我們就可以繼續進行注冊并注銷主要注冊的間諜,并驗證是否沒有收到有關后續操作事件的通知。 這樣可以確保解除綁定也按計劃進行。
但是,這種情況下的測試夾具通常需要一點OSGi樣板。 為了減少混亂,我編寫了一個小的JUnit規則,該規則可以簡化服務注冊并在每次測試運行后自動執行服務注冊表清理。
服務注冊規則
與其他所有JUnit TestRule ,必須在我們的PDE測試 TestRule ServiceRegistrationRule作為公共字段提供。 注意給定測試用例的類實例,規則如何使用參數化的構造函數。 此引用用于獲取適當的BundleContext用于服務注銷/注冊。
@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 ); }隱式測試設置使用我在上 ServiceCollector介紹的ServiceCollector檢索正在測試的注冊服務 。 使用mockito將偵聽器DOC創建為間諜。 上述第一個測試方案如下所示:
@Test public void executeNotification() {serviceRegistration.register( ServiceListener.class, listener );service.execute();verify( listener ).executed(); }很簡單,不是嗎?
請注意, ServiceRegistrationRule負責清理并從服務注冊表中刪除間諜服務。 為了便于測試解除綁定的情況,規則的register方法返回服務注冊的句柄:
@Test public void executeAfterListenerRemoval() {Registration registration= serviceRegistration.register( ServiceListener.class, listener );registration.unregister();service.execute();verify( listener, never() ).executed(); }第五行( registration.unregister() )從服務注冊表中刪除偵聽器間諜。 這將觸發解除綁定,并且永遠不會調用偵聽器。 當然,現實世界中的場景可以為多個偵聽器注冊,異常處理等添加其他測試,但是我認為這個概念已經明確了。
結論
到目前為止, ServiceRegistrationRule在我們當前的項目中證明了自己的作用。 它大大減少了樣板,使測試更清潔并提高了可讀性。 該類是Xiliary P2存儲庫的com.codeaffine.osgi.test.util功能的一部分: http ://fappel.github.io/xiliary
如果您想查看代碼或提出問題,也可以查看Xiliary GitHub項目: https : //github.com/fappel/xiliary
對于其他所有內容,請隨時使用下面的評論部分。 在后續文章中,我將說明如何使用集成的PDE-Tes??ts來設置Maven-tycho構建。 這有點棘手,因為tycho不允許訪問當前React堆構建的束,因此請繼續關注。
翻譯自: https://www.javacodegeeks.com/2015/02/osgi-service-test-helper-serviceregistrationrule.html
osgi:install
總結
以上是生活随笔為你收集整理的osgi:install_OSGi服务测试助手:ServiceRegistrationRule的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: qq便签怎么设置(qq有没有便签功能)
- 下一篇: 葫芦侠我的世界修改器电脑版(葫芦侠我的世