モバイルJUnitが存在します

私たちのオフィスは、J2MEで長い間、多くのことを書いていますが、単体テストを使用したことはありません。 そして、私は、Habréに関するいくつかの焼cen的な記事を読んだことがありますが、ユニットテストの素晴らしいアイデアを吹き込まれ、少なくとも試してみたいと思いました。 私の同僚は肩をすくめて、JUnitはまだJ2MEで動作しないと言いました。一般に、テストを実行するにはどうすればよいですか? 携帯電話で? その結果、私はいじくり回さなければなりませんでしたが、すべてがうまくいきました。



フレームワークの選択



選択肢は少なかった。 Googleはそのようなオプションがあることを私に知らせました:



私は、悔い改めて、SEオプションを見ることなく選択しました。 「まあ、SEのJUnitは、SEエミュレータと確実にシームレスに連携する必要があります。」 おそらくこれが最も不幸なオプションだった... 8)



設置



ダウンロードしたアーカイブには、ライブラリ、サンプルコード、サンプルantタスクが含まれていました。



タスクの1つを引用します。

< target name ="run-with-coverage" >

< java

classname ="com.sonyericsson.sdkme.junit.OnDeviceTest"

fork ="true" failonerror ="true" >

< classpath refid ="test-classpath" />

< arg value ="--javac:${javac}" />

< arg value ="--project-dir:${project-dir}" />

< arg value ="--device:SonyEricsson_K750_Emu" />

< arg value ="--compile:true" />

< arg value ="--compile-midlet:true" />

< arg value ="--coverage:L" />

< arg value ="--coverage-report:${project-dir}/coverage.html" />

< arg value ="--name:Mobile JUnit Sample Project" />

</ java >



< echo message ="A coverage HTML report has been written to ${project-dir}/coverage.html" />

</ target >



* This source code was highlighted with Source Code Highlighter .






異なるパラメーターを持つ特定のクラスが呼び出されていることがわかります。 ところで、どこにも文書化されていません。 コピー&ペーストでは結果が得られませんでした。 問題はbootclasspathにありました。 逆コンパイルされたコードを熟読すると、ライブラリは次の形式のパラメーターを使用していることがわかりました-<name>:<value>; <name>:<value> ... ちなみに、セミコロンと一緒にスペースを区切りとして認識します。 したがって、「プログラムファイル」はありません。 これはすべて、必要なライブラリを1つのディレクトリに解凍し、bootclasspathでそのパスを示すことで決定されました。

すべての修正の後、Java呼び出しは次のようになります。

< java classname ="com.sonyericsson.sdkme.junit.OnDeviceTest" fork ="true" failonerror ="true" >

< classpath >

< pathelement path ="${env.MJUNIT_HOME}/junit.jar" />

< pathelement path ="${env.MJUNIT_HOME}/mobile-ju-1.0.jar" />

< pathelement path ="${java.home}/lib" />

</ classpath >

< arg value ="--project-dir:${basedir}" />

< arg value ="--device:SonyEricsson_K750_Emu" />

< arg value ="--compile:false" />

< arg value ="--compile-midlet:false" />

< arg value ="--coverage:L" />

< arg value ="--runmode:${tests.runmode}" />

< arg value ="--coverage-report:${basedir}/coverage.html" />

< arg value ="--name:Stiter Client" />

< arg value =""--wtk:${env.WTK_HOME}"" />

< arg value ="--print-config:on" />

< arg value ="--midlet-under-test:${jarpath}" />

< arg value ="--bootclasspath:"${toString:tests.bcp}"" />

</ java >




* This source code was highlighted with Source Code Highlighter .








使用する



説明されたアクションの後、テストミッドレットが組み立てられ、開始されました。 しかし、テストはエラーで落ちました。 処理は、テストでミッドレットのコピーを作成する必要がないという事実に要約されました。 つまり、これは間違っています。

public void setUp() throws Throwable {

super.setUp();



midlet = new OurMIDlet();

}




* This source code was highlighted with Source Code Highlighter .






そして、このように:

public void setUp(MIDlet miDlet) throws Throwable {

super.setUp(miDlet);



testMidlet = miDlet;

OurApplication.setMidletInstance(testMidlet);

}




* This source code was highlighted with Source Code Highlighter .






同時に、testMidletはテストミッドレットのインスタンスであり、動作中のものではありません。



実際、それがすべてです。 誰かがこれが役立つことを願っています。

SEライブラリに代わるものを使用しますか? 何をお勧めしますか?




All Articles