JUnitで使用可能なアノテーションの種類についてまとめておきます。
環境
JUnit 4.10で使用できるアノテーション
アノテーション | 用途 |
@Before | メソッド単位で事前実行する |
@BeforeClass | テストクラスで一回だけ事前実行 |
@After | メソッド単位で事後実行する |
@AfterClass | テストクラスで一回だけ事後実行 |
@Rule | テスト時における一時的なルールの作成 |
@ClassRule | 複数のテストを通じてのルール設定 |
@Test | テストメソッドの指定 |
@Ignore | 一時的にテスト対象外メソッドを指定 |
業務でSQLを使用する場合、必ず使用する事になると言って良いのがテーブルの結合処理です。WEB系システムの場合、そのほとんどはRDBMSを使用してますのでテーブルが一つだけなどという事はまずありえません。複数のテーブルからその時々に応じて必要なデータを取得し使用するのが常です。その際に重要になるポイントの一つが内部結合と外部結合です。
サンプルテーブル
以下の商品テーブル「goods」と属性コードテーブル「type_code」を元に説明します。
商品テーブル「goods」 | 属性コードテーブル「type_code」 |
| |
内部結合とは
- 2つのテーブルで一致したデータ行のみ取得します。
- SQLは「SELECT * FROM [テーブル名1] INNER JOIN [テーブル名2] ON [結合条件]」形式で記載します。
- サンプルSQL
|
SELECT goods.type_code, goods.name, type_code.code_name FROM goods INNER JOIN type_code ON goods.type_code = type_code.code; |
サンプルSQLの実行結果
外部結合とは
- 2つのテーブルで一致しないデータも含めてどちらか一方のテーブルのデータを全て取得します。
- SQLは左外部結合の場合、「SELECT * FROM [テーブル名1] LEFT OUTER JOIN [テーブル名2] ON [結合条件]」形式で記載します。
- SQLは右外部結合の場合、「SELECT * FROM [テーブル名1] RIGHT OUTER JOIN [テーブル名2] ON [結合条件]」形式で記載します。
- サンプルSQL(左外部結合の場合)
|
SELECT goods.type_code, goods.name, type_code.code_name FROM goods LEFT OUTER JOIN type_code ON goods.type_code = type_code.code; |
サンプルSQLの実行結果
Web系の開発していると画面表示確認する際に、「cssやjsは変更したのに画面を表示してみると反映されていない」という事を経験した方は少なくないと思います。
こういう場合はまず、F5もしくはctrl+F5を押下して画面を再表示(リロード)確認すると思いますが、そもそも「F5単独」押下と「ctrl+F5同時」押下では何が違うんだろう?という事についてメモしておきます。
F5単独押下時のリロード
- ブラウザでキャッシュされている場合、キャッシュを利用して画面を再表示します。
Ctrl+F5同時押下時のリロード
- ブラウザのキャッシュを利用せずにサーバーにある最新の情報を読み込んで画面を再表示します。
- スーパーリロードとも呼びます
- ブラウザによって、Ctrl + F5以外でもスーパーリロードは可能です。
ブラウザ別のスーパーリロード方法
<Google Chrome、Microsoft Edge>
- Ctrl + F5
- Shift + F5
- Ctrl + Shift + R
- Ctrl + 更新ボタン
- Shift + 更新ボタン
<FireFox>
- Ctrl + F5
- Ctrl + Shift + R
- Shift + 更新ボタン
<Opera>
<Safari>
ブラウザの更新ボタンとは
上記で説明している「更新ボタン」ですが、以下の様にブラウザのアドレスバー付近に表示されている以下のような赤枠内のボタンのことを「更新ボタン」と記載しております。
junitでexceptionが発生した事の確認テストはどのようにすれば良いかメモしておきます。
exceptionの発生確認は@Test内に「(expected = [確認したいExceptionクラス])」を指定する事で簡単に確認する事が出来ます。
JUnitサンプル
ちょっとdjUnitで「addReturnValue」を使用しても全く効いてない?という事象に少しハマっていたので原因についてメモしておきます。
addReturnValueが効かない原因
addReturnValueが効かない原因として上げられるのが概ね以下の3つになるかと思います。1と2については少し見なおせばすぐ発見出来そうですが、今回ハマった原因が3でした。。。
- クラス名の指定が間違っている
- メソッド名の指定が間違っている
- 指定したメソッドが複数回実行されている
「指定したメソッドが複数回実行されている」とは
では「指定したメソッドが複数回実行されている」というのはどういう事かというとについて説明します。
根本的な話として以下の2つのコードは全く同じ意味という事を理解しておく必要があります。
|
addReturnValue(UtilClass1.class, "getStr", expected1); setReturnValueAt(UtilClass1.class, "getStr", 0, expected1); |
これだけで気づく方はハッと思うかもしれませんが、ここで重要なのはaddReturnValueでは「1回目に実行」されたメソッドのみしかaddReturnValueで指定した値が返ってこないという事です。つまり「setReturnValueAt」で1回目を指定した場合と同様の動きしかしてくれないのです。
今回私がハマったのは指定したメソッドが想定した箇所よりも手前で事前に実行されていた為、想定したいたメソッドは2回目の実行になっていたために2回目の方にはaddReturnValueが効いていなかったという事象でした。
addReturnValueが効かない時の調査方法
addReturnValueをしてクラス名やメソッド名は正しいのにどうも効いていないように見える時は一度「getCallCount」でメソッドの実行回数を調査して見ると良いかもしれません。
djUnitではメソッドが呼び出されている事の確認は「assertCalled」を使用する事で確認出来ましたが、逆にメソッドを呼び出されていない事の確認では「assertNotCalled」を使用する事で確認出来ます。
Javaソース
djUnitサンプル
djUnitではassertCalledを使用する事でメソッドが呼び出された事が確認出来ます。
Javaソース
djUnitサンプル
複数回呼び出された時の確認方法
以下の様に「getCallCount」を使用する事でメソッドが何回呼び出されたかを確認する事も出来ます。
|
int countHtmlEscape = getCallCount(UtilSample1.class, "htmlEscape"); assertEquals(10, countHtmlEscape); |
djUnitでメソッドの返却値を好みのものに変更する場合は「addReturnValue」メソッドを使用しますが、
同一メソッドを複数回使用していてそれぞれ別々の戻り値に変更したい場合には「setReturnValueAt」メソッドを使用します。
Javaソース
|
public class UtilClass1{ /** * <p>[概 要] サンプルメソッド</p> * <p>[詳 細] </p> * <p>[備 考] </p> * @return 文字列 */ public static String getStr(){ return "hoge"; } } |
|
public class DriverClass1{ /** * <p>[概 要] ドライバーメソッド</p> * <p>[詳 細] </p> * <p>[備 考] </p> */ public static void driverMethod1(){ System.out.println(UtilClass1.getStr()); System.out.println(UtilClass1.getStr()); } } |
djUnitサンプル
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
import jp.co.dgic.testing.framework.DJUnitTestCase; import org.junit.Test; public class UtilClassDjUnitTest extends DJUnitTestCase { @Test public void testGetStr2() { // 準備:getStrメソッドの返却値を1回目と2回目で別々の戻り値に変更します。 String expected1 = "test1"; String expected2 = "test2"; setReturnValueAt(UtilClass1.class, "getStr", 0, expected1); setReturnValueAt(UtilClass1.class, "getStr", 1, expected2); // 実行 DriverClass1.driverMethod1(); } } |
実行結果(コンソール)
djUnitを使用する上での最大の利点と言っても良いのがVirtual Mock Objects(仮想モックオブジェクト)が使用出来る事です。
このVirtual Mock Objectsを使用すると作成したクラスでUtilクラスなどのメソッドを使用している場合、使用しているメソッドの戻り値を自由に変更する事が可能となります。
djUnitでメソッドの返却値を好みのものに変更する場合は「addReturnValue」メソッドを使用します。
「addReturnValue」メソッドの使用タイミングとしては、作成したクラスで使用している共通クラスのメソッドなどが未完成の場合でスタブが必要になるケースなどが考えられます。
Javaソース
djUnitサンプル
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
|
import jp.co.dgic.testing.framework.DJUnitTestCase; import org.junit.Test; public class UtilClassDjUnitTest extends DJUnitTestCase { @Test public void testGetStr() { // 準備:getStrメソッドの返却値を好みのものに変更します。 String expected = "test"; addReturnValue(UtilClass1.class, "getStr", expected); // 実行 String result = UtilClass1.getStr(); // 検証 assertEquals("文字列が一致していません。", expected, result); } } |
「駑馬十駕」 IT系情報を中心に調べた事をコツコツ綴っています。