Posted at

jMockit そんな無理矢理privateなトコロに…

More than 5 years have passed since last update.

だんだんタイトルが投げやりになっているjMockitのお話です。


privateなfieldに無理やり値をセットする

前回も紹介した Deencapsulationですが、名前の通りカプセル化を完全無視できます。使いがちなのが setFieldで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="もがもがー";
}};
}