きな粉もち.net

.NET関連仕事に携わっています。OSSのソースを読んで気がついたことを中心に呟いたりブログに投稿したりしています。最近はUiPathを使ったRPAも研究中。気軽にフォローやツッコミよろしくおねがいします! Gitはここを使っています https://github.com/kinakomotitti

VSCode × Junit × リソースファイルを使ってテストしてみた

この記事の目的

この記事では、

Visual Studio Codeを使って、
単体テストを実行するところまでの手順をまとめること

リソースファイルを本番用・開発用で
分けて利用するための設定をまとめること

を目的としています。

本題

★Resourceファイルを作ろう

以下の図のように、[resources]フォルダを作成します。
f:id:kinakomotitti:20180506162417p:plain

作成した[resources]フォルダに[sample.properties]ファイルを作成します。
f:id:kinakomotitti:20180506162421p:plain

動作確認のため、以下のような内容を記述しました。

key001=value001
key002=value002
key003=value003
key004=value004
★Resource情報取得処理を実装しよう

作成したResourcesファイル(sample.properties)を呼び出し、
その中のkey3というキーに紐づく値を呼び出し元に返却するメソッドを実装します。
実装する対象のファイルはこれで、、、
f:id:kinakomotitti:20180506162428p:plain

実装する処理は以下の通りです。

//#region ResourceTest

public String mainCore() {

ResourceBundle bundle = ResourceBundle.getBundle("sample");
return bundle.getString("key003");

}

//#endregion

このまま実装すると、以下のエラーが発生します。

java.util.MissingResourceException: Can't find bundle for base name sample

ということで、リソースファイルをクラスパスに設定します。
クラスパスに設定するときには、[build.gradle]ファイルに以下のコードを追加するのが便利です。

sourceSets {
main {
// クラスファイルと同じディレクトリへリソースファイルを出力する設定
output.resourcesDir = output.classesDir
}
}

上記コードを追加することで、クラスパスに以下の設定が追加されます。
f:id:kinakomotitti:20180506162439p:plain

上記設定が追加されたことを確認し、もう一度実行します。
デバッグコンソールにvalue003という内容が表示されれば成功です。
f:id:kinakomotitti:20180506162447p:plain

★番外編:JAVAでREGIONを使ってみよう

驚くことに、C#VBでよく使われている【REGION】がJava@on visual studio Codeで利用できます。
Visual studio Codeでは*1、REGIONを使わなくてもメソッドやクラス単位で
内容の表示/非表示ができます。

以下の図では、
【←左】が内容の表示時の状態を表し、
【右→】が内容を非表示時にし、メソッド定義だけが表示されている状態を表しています。
f:id:kinakomotitti:20180506162454p:plain

このように、既に表示時/非表示機能があるので、メソッドが大量に定義されたクラスなどでも、目的のメソッドを素早く見つけることができるようになっています。

この機能だけでも十分便利ですが、【region】を利用することで、さらに便利にすることができます。
【region】を利用することで、開発者独自の「領域」を定義することができます。
つまり、メソッド、クラス、といった言語的に意味のある単位以外に、
開発者にとって意味のある単位で表示/非表示が可能な領域が作成できます。

以下の例は少し過剰に書きすぎたかもしれません( ゚Д゚)
【←左】は、regionを定義して、どれも非表示していない状態を示しています。
【真ん中】は、mainCore処理で、とても長い処理だけを非表示にした状態を表しています。
※長い処理=100ステップくらいを想定してください
【右→】は、メソッドのアクセス修飾子単位で分けた領域のすべてを非表示にした状態を表しています。
f:id:kinakomotitti:20180506162501p:plain

すべて展開したところだけを見ると、コメントが多くなって逆に見にくくなったという印象があります。
しかし、メソッドや処理が多くなってきたとき、これはとても役立ちます。
今後は積極的に利用していこうと思います。

※入力するときは、「#re」まで打つと、以下のようにインテリセンスが反応します。
 このタイミングで「Tab」キーを押下することでregionを入力することができます*2
f:id:kinakomotitti:20180506162508p:plain

★テスト用Resourceファイルを作ろう

以下の図のように、[resources]フォルダを作成します。
f:id:kinakomotitti:20180506162521p:plain

作成した[resources]フォルダに[sample.properties]ファイルを作成します。
f:id:kinakomotitti:20180506162709p:plain

動作確認のため、以下のような内容を記述しました。

key001=TESTvalue001
key002=TESTvalue002
key003=TESTvalue003
key004=TESTvalue004
★テスト用Resourceでテストしてみよう

クラスパスの設定は、既に完了しているので、テストメソッドだけ追加します。
テストメソッドを追加するファイルは以下の通りです。
f:id:kinakomotitti:20180506171034p:plain

追加する内容は以下の通りです。

@Test public void testAppHasAGreeting_Dummy() {
App classUnderTest = new App();
assertEquals("TESTvalue003", classUnderTest.mainCore());
}

検証では、mainCoreメソッドの戻り値がTEST用リソースファイルの情報(”TEST”Value003)であることを確認します。

上記テストメソッドを実装し、テストを実行してみます。
f:id:kinakomotitti:20180506162555p:plain

想定した通り、TEST用のリソースファイルから情報を取得することができました。

まとめ

「明日からjavaの開発をやってください。」
「設定情報はリソースファイルに外に出してください。」
ユニットテストを書いてください。」
「設定はテスト用の値にしてください。」

・・・先月いきなり言われて右も左もわからないまま
やってきたことをまとめることができました( ..)φ
やっているうちに楽しくなってきたので、
今後もEclipseなしのJava開発を進めていこうと思います!

そして、paizaでj上位ランクを目指しますw
paiza.jp

*1:Eclipseでもできるかもしれないですが確認していません

*2:インテリセンス・コードスニペットを利用しなくても、そのまま実装することもできます