Help us understand the problem. What is going on with this article?

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="もがもがー";
    }};
}
NewGyu
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away