技術空間

JMockit

モックのメソッド引数にanyやanyStringを使う


TOP > JMockit > モックのメソッド引数にanyやanyStringを使う



■anyやanyStringの使用方法

JMockitでメソッドをモックするときは、Expectations内でモック対象のメソッドと同じ引数で呼び出す必要がある。

例えば以下のようなメソッドの場合

public String getToday(boolean flg, String str, Map map) {

テストクラスのExpectationsでは以下のように何かしらの引数を指定しなければならない。型だけを合わせたいだけなのに、具体的な値を指定しなければならないのはやや面倒である。

new Expectations() {{
    myCal.getToday(true, "12345", new HashMap<String, Object>());
    result = "2015/12/01";
}};

Expectationsにはテストコード作成支援として以下の変数を用意している。これらの変数を使えば、設定値をわざわざ考える必要はない。

変数説明
anyBooleanboolean変数
anyBytebyte変数
anyCharchar変数
anyDoubledouble変数
anyFloatfloat変数
anyLonglong変数
anyShortshort変数
anyStringString変数
anyObject変数。キャストすれば、Object型以外にも使用できる。

前述のコードを書き換えると以下となる。

new Expectations() {{
    myCal.getToday(anyBoolean, anyString, (HashMap)any);
    result = "2015/12/01";
}};
■サンプルコード

以下サンプルコード。

MockitTest.java
package mocktest3;

import static org.junit.Assert.*;

import java.util.HashMap;

import org.junit.Test;

import mockit.Expectations;
import mockit.Mocked;

public class MockitTest {

    @Mocked
    private MyCalendar myCal;
    
    @Test
    public void testIsDecember() {

        new Expectations() {{
            // 引数を指定してgetToday呼び出し
            myCal.getToday(anyBoolean, anyString, (HashMap)any);
            result = "2015/12/01";
        }};

        Sample sample = new Sample();
        assertTrue(sample.isDecember());
    }
}
Sample.java
package mocktest3;

import java.util.HashMap;

public class Sample {

    /** 現在日が12月か判定 */
    public boolean isDecember() {

        MyCalendar myCal = new MyCalendar();
        String month = myCal.getToday(true, "", new HashMap<String, Object>()).split("/")[1];

        if("12".equals(month)){
            return true;
        }
        return false;
    }
}
MyCalendar.java
package mocktest3;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Map;

public class MyCalendar {

    public String getToday(boolean flg, String str, Map<String, Object> map) {
        Calendar cal = Calendar.getInstance();
        return new SimpleDateFormat("yyyy/MM/dd").format((cal.getTime()));
    }
}

※サンプルなのでMyCalendar#getTodayの引数は使用していない



TOP > JMockit

Tweet ̃Gg[͂ĂȃubN}[Nɒlj
技術空間