OSGi Bundleをテストする 2

2013年10月 6日 Java OSGi

テンプレートから作成したホストBundleには3つのサービスが登録されています。

ServiceComponent
Dictionary
DictionaryService
1と2についてはOSGI-INF以下のxmlでサービスを登録していて、3についてはActivatorで登録しています。

今回はDictionaryServiceをテストします。

まずはOSGiのサービスインターフェイスを使わない普通の単体テストを行い、次にサービスインターフェイスを使ったOSGi Bundleとしてのテストを行います。



単体テスト

DictionaryServiceははDictionaryServiceImplに実装されていますので、テストBundleにDictionaryServiceImplTestクラスを作成します。

java
package com.misfrog.osgi.junit;
 
import static org.junit.Assert.*;
import org.junit.Test;
 
public class DictionaryServiceImplTest {
 
    @Test
    public void testCheck() {
        Dictionary dictionary = new DictionaryImpl();
        DictionaryService service = new DictionaryServiceImpl();
        service.registerDictionary(dictionary);
        assertTrue(service.check("osgi"));
    }
}

実装ファイルの右クリックメニューからJUnit Testを実行します。

成功しました!
単体テストはこんなかんじで行います。

OSGi Bundleテスト

Bundleテストは若干めんどくさいです。
まずはテスト用のクラスDictionaryServiceTestを作ります。
実装は次の様になります。

java
package com.misfrog.osgi.junit;
 
import static org.junit.Assert.*;
 
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.osgi.framework.BundleContext;
import org.osgi.framework.FrameworkUtil;
import org.osgi.util.tracker.ServiceTracker;
 
public class DictionaryServiceTest {
 
    private final BundleContext context = FrameworkUtil.getBundle(this.getClass()).getBundleContext();
 
    private ServiceTracker tracker;
    private DictionaryService service;
 
    @Before
    public void setUp() throws Exception {
        tracker = new ServiceTracker(context, DictionaryService.class.getName(), null);
        tracker.open();
 
        service = (DictionaryService) tracker.getService();
    }
 
    @After
        public void tearDown() throws Exception {
        tracker.close();
        service = null;
    }
 
    @Test
    public void test() {
        Dictionary dictionary = new DictionaryImpl();
        service.registerDictionary(dictionary);
        assertTrue(service.check("osgi"));
    }
}

テストを行う前にサービストラッカーからサービスを取得する必要があります。
あとの実装は単体テストと同じです。

実行はプロジェクトの右クリックメニューからJUnit Plug-in Testで実行するのですが、
このまま実行するとEclipseアプリとして起動され、WorkspaceとTargetにあるプラグインがすべて起動されてしまうようで、実行が非常に遅くなります。
そのためコンフィグで次のように設定を行います。

Program to RunをRun an application/[No Application] – Headless Modeに設定する。

プラグインの選択をすべて解除し、ホストとテスト用のBundleにチェック。
あと、Eclipse上での実行に必要なので、org.eclipse.core.runtimeにチェックを入れます。
その後Add Require Plug-insを行う。

でApplyしてRunします!

成功しました!

※プロジェクトをGitHubに置きました。



前へ 次へ