9
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

jMockit Verifications 部分モッキングとか

Posted at

前回に引き続きjMockitのお話で、今回はテスト対象クラス自身のメソッドを一部モック化するお話です。

部分的なモッキング (Partial Mocking)

Hoge.java
public class Hoge {
    public String getFullName() {
        return getFirstName() + " " + getLastName();
    }

    public String getFirstName() {
         return this.fName;
    }

    public String getLastName() {
         return this.lName;
    }
 }
HogeTest.java
    Hoge hoge = new Hoge();
    new Verifications(hoge) {{
        hoge.getFirstName(); result="ホゲ山";
        hoge.getLastName(); result="ほげ二郎";
    }}

    assertThat(hoge.getFullName(), is("ホゲ山 ほげ二郎"));

テスト対象のクラスのメソッド同士に依存関係があるときに、対象メソッド単体でテストすることが可能です。
例だとgetFirstName() ,getLastName() はごく単純ですが、これがとても複雑な場合にはモック化する価値があります。

部分的なモッキング (Partial Mocking) private な場合

先の例ではgetFirstName() ,getLastName()がTestクラスからアクセス可能なスコープでしたが、privateな場合もありますよね。
テストの為だけにメソッドのスコープをデフォルトスコープにする手もありますが、本来的にprivateなのにそれを歪めるというのも嫌なものです。

jMockitの場合、privateメソッドの挙動もモック化できます。
http://jmockit.googlecode.com/svn/trunk/www/tutorial/BehaviorBasedTesting.html#deencapsulation

Hoge.java
public class Hoge {
    public String getFullName() {
        return getFirstName() + " " + getLastName();
    }

    private String getFirstName() {
         return this.fName;
    }

    private String getLastName() {
         return this.lName;
    }
 }
HogeTest.java
 import static mockit.Deencapsulation.*;

    Hoge hoge = new Hoge();
    new Verifications(hoge) {{
        invoke(hoge ,"getFirstName"); result="ホゲ山";
        invoke(hoge ,"getLastName"; result="ほげ二郎";
    }}

    assertThat(hoge.getFullName(), is("ホゲ山 ほげ二郎"));

このDeencapsulationというクラスのstaticメソッドが鍵です。

privateメソッドに対するテストもかける

上記のDeencapsulationを使うとprivateメソッドに対するassertも書くことができます。

HogeTest.java
 import static mockit.Deencapsulation.*;

    Hoge hoge = new Hoge();

    assertThat(invoke(hoge ,"getFirstName"), is("ホゲ山"));
    assertThat(invoke(hoge ,"getLastName"), is("ほげ二郎"));

ちなみにFirstName ,LastNameの設定間違えてますが疲れたのでまあいいや。

9
10
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
9
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?