LoginSignup
12
16

More than 5 years have passed since last update.

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

Posted at

だんだんタイトルが投げやりになっている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="もがもがー";
    }};
}
12
16
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
16