だんだんタイトルが投げやりになっているjMockitのお話です。
privateなfieldに無理やり値をセットする
前回も紹介した Deencapsulationですが、名前の通りカプセル化を完全無視できます。使いがちなのが [setField](http://jmockit.googlecode.com/svn/trunk/www/javadoc/mockit/Deencapsulation.html#setField(java.lang.Object, java.lang.Object))でprivate fieldに好きな値を代入してしまうとか。
Deencapsulation.setField(hoge, "firstName" ,"ホゲ男");
こんな感じで hogeインスタンスの firstNameというprivateインスタンス変数に値をセットしてしまえます。
これはExpectationとかVerificationとか関係なしに使えます。
もはややりたい放題ですね。
@Cascading アノテーション
今まで @Mocked アノテーションを使う例ばかりでしたが、
public class Hoge {
public Fuga getFuga() { ... }
}
public class Fuga {
public Moga getMoga() {...}
}
public class Moga {
public String exec() {...}
}
こんな場合には、
@Mocked Hoge hoge;
@Mocked Fuga fuga;
@Mocked Moga moga;
@Test
public void test() {
new NonStrictExpectations() {{
hoge.getFuga(); result=fuga;
fuga.getMoga(); result=moga;
moga.exec(); result="もがもがー";
}};
}
と定義が必要でしたが、@Cascadingを使うと一発で書けます。
@Cascading Hoge hoge;
@Test
public void test() {
new NonStrictExpectations() {{
hoge.getFuga().getMoga().exec(); result="もがもがー";
}};
}