KikainekoMocker
モッカーの仕様
機械猫モッカー仕様
機械猫モッカーはJava1.4の文法にそった解析を行いますが、完全ではありません。ここでは細かな差異を示します。
プリミティブ型
モッカーでは全てのプリミティブ型を扱えるわけではありません。具体的には以下の型を扱えます。
- int型
- float型(1.0fのような形式以外は対応していません)
- long型
- double型(1.0、1.0dのような形式以外は対応していません)
- char型
- boolean型
オブジェクト型
モッカーで基本的に任意のオブジェクト型を取り扱うことができます。
ただし、以下の条件を持つオブジェクトは取り扱いに脆弱性が存在します。 多くの場合、問題になりませんが、気をつけてください。
ただし、以下の条件を持つオブジェクトは取り扱いに脆弱性が存在します。 多くの場合、問題になりませんが、気をつけてください。
- 内部に循環参照を持つオブジェクト
- コンストラクタの引数の型がインターフェース・アブストラクト型で指定されている
テストケースに関する注意点
機械猫モッカーは、オブジェクト型を返すメソッドを実装しますが
返すクラスがequalsメソッドをオーバーライドしていないとテストはパスしません。
例えば、
Integer i=new Integer(10);
assertEquals(i,target.getInt(10));
を読み込むと、Integer型を返すgetIntメソッドを実装します。
そして、Integerはequalsメソッドをオーバーライドしているため、テストはパスします。
ですが
StringBuffer sb=new StringBuffer("test");
assertEquals(sb,target.getSb("test"));
の場合、機械猫モッカーはsbと同等なオブジェクトを返しますが、
StringBufferがequalsメソッドをオーバーライドしていないため、テスト自体は失敗してしまいます。
機械猫モッカーは期待値に入れられたオブジェクトのtransientとstatic、final以外の全ての
フィールド変数を参照し、その値と同じフィールドを持つオブジェクトを返します。
(ハッシュコードまでは同一ではありませんので、equalsメソッドがオーバーライドされていないと失敗します)
返すクラスがequalsメソッドをオーバーライドしていないとテストはパスしません。
例えば、
Integer i=new Integer(10);
assertEquals(i,target.getInt(10));
を読み込むと、Integer型を返すgetIntメソッドを実装します。
そして、Integerはequalsメソッドをオーバーライドしているため、テストはパスします。
ですが
StringBuffer sb=new StringBuffer("test");
assertEquals(sb,target.getSb("test"));
の場合、機械猫モッカーはsbと同等なオブジェクトを返しますが、
StringBufferがequalsメソッドをオーバーライドしていないため、テスト自体は失敗してしまいます。
機械猫モッカーは期待値に入れられたオブジェクトのtransientとstatic、final以外の全ての
フィールド変数を参照し、その値と同じフィールドを持つオブジェクトを返します。
(ハッシュコードまでは同一ではありませんので、equalsメソッドがオーバーライドされていないと失敗します)
テストケースに対する制限
テストケースには以下の制限が課せられています。
これらのうちのいくつかは将来取り除かれますが、気をつけてください。
これらのうちのいくつかは将来取り除かれますが、気をつけてください。
- クラス変数に、モック対象のクラスを必ず宣言してください。この宣言でモック対象を判断しています。
また、必ずsetUpメソッドかtestメソッド内でインスタンス化してください。 - setUpメソッドは必ずオーバーライドしてください。逆にtearDownメソッドはオーバーライドしないで下さい。
- モック対象以外のクラス変数は書かないでください。
- モック対象のstaticメソッドには対応できません。
- 多次元配列も使用できません。
- キャストもしないで下さい。
- コンストラクター・メソッド以外呼び出さないでください。
- assertEquals( expected , actual )という形式以外使用できません。
つまり、assertTrueなどのassertメソッドは解析しません。
また、必ず期待値、実測値の順に書いてください。 - 返り値があるメソッドは、assertEqualsで明示してください。(assertEqualsにないとvoidと判断されてしまいます。)
- for文・if文・while文・switch文などの制御構造文、省略記法は使用できません。
- デフォルト・パッケージは避けてください。