J2MEUnitでの作業
J2MEUnitのセットアップ
JMUnitの代替フレームワークがJ2MEUnitです。こちらもSourceForgeを通じてダウンロードできます。JMUnitと違って、J2MEUnitのバージョンは1つしかないので、.jarファイルも1つだけです。現在のリリースは1.1.1です。
J2MEUnitのテストケース
J2MEUnitのテストケースはj2meunit.framework.TestMethodから継承しなければなりません。JMUnitと同様、それぞれのテストをテストメソッドで実装し、「test」+「テスト対象メソッドの名前」という形式の名前を付けます。JMUnitと異なり、テストメソッドで例外をスローする必要はありません。
J2MEUnitはJMUnitほど多くのアサートメソッドをサポートしていません。J2MEUnitがサポートしているアサーションは次のものだけです。
assertTrue(expression) assertSame(expected, actual) assertEquals(expected, actual) assertNotEquals(expected, actual) assertNull(object)
また、これらのメソッドはJMUnitのようにオーバーロードされません。例として、JMUnitのassertEqualsメソッド(CLDC 1.0とCLDC 1.1の両バージョン)とJ2MEUnitのassertEqualsメソッドにおける、期待される型と実際の型を表1に示します。このようなメソッドはかなりの数になります。CLDC 1.1の新しい浮動小数点型を使用するアプリケーションでは特にそうです。
| JMUnit assertEquals(CLDC 1.0) | JMUnit assertEquals(CLDC 1.1) | J2MEUnit assertEquals | |
| 期待される値/結果の値 | Object | Object | Object |
| 型サポート | String | String | long |
| boolean | boolean | ||
| byte | byte | ||
| char | char | ||
| int | double | ||
| long | float | ||
| short | int | ||
| long | |||
| short |
アサーションメソッドが少ないことを別にすれば、J2MEUnitのテストケースメソッドはJMUnitのテストケースメソッドとそれほど違いません。DistanceConverstionTestのテストメソッドの例をリスト1に示します。スローされる例外がないこと以外、メソッドの内容は同じです。
public void testfeetToMeters() { System.out.println("feetToMeters"); int result = DistanceConversion.feetToMeters(25); assertEquals(7, result); } public void testmetersToFeet() { System.out.println("metersToFeet"); int result = DistanceConversion.metersToFeet(5); assertEquals(16, result); } public void testmilesToKM() { System.out.println("milesToKM"); com.white.DistanceConversion instance = null; int result = DistanceConversion.milesToKM(26); assertEquals(42, result); } public void testkmToMiles() { System.out.println("kmToMiles"); int result = DistanceConversion.kmToMiles(2); assertEquals(1, result); } public void testLongerThan() { System.out.println("longerThan"); assertTrue(500F < (DistanceConversion.kmToMiles(1) * 5280)); }
JUnitおよびJMUnitと同様、J2MEUnitにもテストケースでオーバーライドできるsetup、teardown、failメソッドがあります。
J2MEUnit TestSuite
J2MEUnitでテストスイートを作成および実行する方法は、JMUnitとかなり違っています。J2MEUnitのテストスイートの方が、通常のJUnitのテストスイートを連想させるものです(ただし、リフレクションはありません)。
J2MEUnitのテストスイートを作成するには、通常、テストケースクラス内にsuite()メソッドを作成します。これはJUnitと緊密に関連していますが、J2MEUnitでは、このsuiteメソッドをインスタンスメソッドにすることができます(通常のJUnitでは静的メソッドです)。suiteメソッドはj2meunit.framework.TestSuiteのインスタンスを返します。このオブジェクトには、期待されるすべてのテストケースのすべてのテストメソッドが含まれています。
テストケースのためのテストメソッドをスイートに追加するのは、やや複雑そうに見えるかもしれません。スイートにテストメソッドを追加する最善の方法は、j2meunit.framework.TestMethodのインスタンスを作成して使用することです。TestMethodは実際にはインタフェースであり、実装クラスによって単一のrun(TestCase)メソッドを提供することが要求されます。TestMethodは一般に匿名インナークラスで実装されます。testfeetToMetersのスイートにTestMethodを追加する方法を以下に示します。
public Test suite() { TestSuite suite=new TestSuite(); suite.addTest(new DistanceConverstionTest( "testfeetToMeters", new TestMethod() { public void run(TestCase tc) { ((DistanceConverstionTest) tc).testfeetToMeters(); } } )); return suite; }
もちろん、DistanceConversionTestの他のメソッドも同様にスイートに追加する必要があります。suiteメソッドは、テストケースコンストラクタの作成も必要とします。
public DistanceConverstionTest(String testName, TestMethod testMethod) { super(testName, testMethod); }
J2MEUnitテストの実行
J2MEUnitのテストケースは、JMUnitと違ってMIDletのサブクラスではありません。ただし、J2MEUnitにはTestRunnerの2つの実装があり、これによってテストを実行することができます。j2meunit.textui.TestRunnerは、通常のJUnitのTestRunnerの考え方に対応するものです。j2meunit.textui.TestRunnerは、コマンドライン環境からのみ実行できます。したがって、もう一方のTestRunner実装を使用するほうが、J2MEUnitのテストを実行する方法として好ましいでしょう。j2meunit.midletui.TestRunnerは、あなたが拡張するMIDletです。MIDletとして、j2meunit.midletui.TestRunnerはエミュレータ(または実際のデバイス)で実行されます。
各自のTestRunner MIDletクラスで行うべきコーディングは、startApp()メソッドをオーバーライドすることだけです。startAppメソッドの中で、テストクラスの名前が含まれている文字列の配列を指定して、TestRunnerのstartメソッドを呼び出してください。
public class ConversionTestRunnerMIDlet extends TestRunner { protected void startApp() { start(new String[] {"com.white.tests.j2meunit.DistanceConversionTest", "com.white.tests.j2meunit.TemperatureConversionTest"}); } }
また、J2MEUnitでは、テストケースをMIDletに渡し、JADファイルまたはJARのマニフェストファイルでJ2MEUnitTestClassesプロパティを設定して、TestRunnerを直接実行することもできます。このとき、J2MEUnitTestClassesプロパティには、テストケースクラスのリストが含まれていなければなりません。
TestRunner MIDletは、JMUnitのような派手なグラフィックの結果を提供しませんが(図4を参照)、失敗に関しては(図5を参照)JMUnitと違ってエミュレータで情報を提供します。
JMUnitと同様、結果のコンソールウィンドウで、テストに関するさらに詳しい情報(失敗については特に)を見ることができます(図6を参照)。
NetBeansの統合
JMUnitとJ2MEUnitは、ほとんどすべてのJava ME開発環境やSunのWireless Took KitなどのIDEで使用できますが、あるIDEで、これらのMicro Edition単体テストツールを合体したものが近いうちにリリースされます。NetBeans 5.5/NetBeans Mobility Pack 5.5に、これらのツールの両方が付属する予定です。実のところ、NetBeansはどんなJ2MEプロジェクトクラスのJMUnit CLDC 1.0テストでも自動的に生成してくれます。Mobileプロジェクトの任意のクラスを右クリックし、[Tools]メニューオプションからJUnitテストクラスの生成を選択するだけよいのです(図7を参照)。
NetBeansは、デフォルトではJMUnit CLDC 1.0テストケースを生成します。プロジェクトのプロパティダイアログウィンドウを使用してJMUnit CLDC 1.1またはJ2MEUnitのライブラリをプロジェクトに追加し、それから手動で任意の型のテストクラスとMIDletテストケースランナーを手動で作成できます(図8を参照)。
JMUnit CLDC 1.1またはJ2MEUnitのライブラリをNetBeans 5.5のモバイルプロジェクトに追加するには、プロジェクトを右クリックし、[Properties]を選択します。次に表示されるウィンドウで、図のように[Build]の下層にある[Libraries & Resources]を選択し、それから[Add Library]ボタンをクリックして、目的のプロジェクトで使用する他のJUnitライブラリを選択します。
NetBeansプロジェクトチームのメンバによると、NetBeans 5.5とNetBeans Mobility Pack 5.5は10月の終わり頃にリリースされる予定だそうです(執筆当時)。両方のQ-ビルドリリース(およびJava ME単体テストフレームワーク)がここから入手できます。
本稿のダウンロードサンプルには、本稿で紹介したすべてのクラスに加え、新しいNetBeans IDEにすばやく簡単に導入できるNetBeans 5.5プロジェクトも含まれています。「Conversion 1.0」は、CLDC 1.0バージョンのコード例と、JMUnit CLDC 1.0およびJ2MEUnitのテストケースが含まれているプロジェクトです。「Conversion 1.1」は、CLDC 1.1バージョンのコード例と、JMUnit CLDC 1.1のテストケースが含まれているプロジェクトです。
Java ME単体テストの将来は明るい
自分のJava Micro Editionアプリケーションの品質が悪いのは適切な単体テストツールがないせいだ、という言い訳はもう通用しません。JMUnitとJ2MEUnit(そして予定されている両者の合体版)は、Micro Edition開発者に有益な品質保証支援を提供します。
この2つのフレームワークはいくつかの点で異なっています。両者の相違点の多くは、大部分の開発者が使用するAPIの実装の詳細部分にあります。JMUnitの方がアサーション群が豊富で、実装がやや簡単かもしれません。それに対し、J2MEUnitはスイートレベルでの見た目と動作が通常のJUnitに似ていると言えるでしょう。どちらも素晴らしい機能を備えているので、そうした機能は合体した製品でも存続してほしいものです。





