かずきのBlog@hatena

日本マイクロソフトに勤めています。XAML + C#の組み合わせをメインに、たまにASP.NETやJavaなどの.NET系以外のことも書いています。掲載内容は個人の見解であり、所属する企業を代表するものではありません。

EasyMock2.0をお試し with JUnit4

テスト対象のロジッククラス

package easymock;

public class PersonLogic {
    private PersonDao personDao;

    /**
     * 指定されたIDの人のBMI値を返します。
     * 指定された人がいない場合は、nullを返します。
     */
    public Double calcBMI(Integer id) {
        Person person = personDao.get(id);
        if (person == null) {
            return null;
        }

        return person.getWeight()
                / (person.getHeight() / 100 * person.getHeight() / 100);
    }

    public PersonDao getPersonDao() {
        return personDao;
    }

    public void setPersonDao(PersonDao personDao) {
        this.personDao = personDao;
    }

}

Mockに差し替えられるPersonDaoインターフェイス

package easymock;

public interface PersonDao {
    /**
     * 引数で指定されたIDのPersonを返す。
     * 引数で指定されたIDの人が存在しない場合はnullを返します。
     */
    Person get(Integer id);
}

テストケース

package easymock;

import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertNull;
import static org.easymock.EasyMock.createMock;
import static org.easymock.EasyMock.expect;
import static org.easymock.EasyMock.replay;
import static org.easymock.EasyMock.verify;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;

/**
 * PersonLogicのテストクラス
 * 見逃しがちなのは、staticインポート。
 * EasyMockクラスのstaticメソッド呼びまくり。
 * Assertクラスのstaticメソッドも呼んでます。
 */
public class PersonLogicTest {
    
    // テスト対象
    PersonLogic logic;
    
    // モック
    PersonDao mockDao;

    @Before
    public void setUp() throws Exception {
        // mockを作って
        mockDao = createMock(PersonDao.class);
        
        // logicにセット
        logic = new PersonLogic();
        logic.setPersonDao(mockDao);
    }

    @After
    public void tearDown() throws Exception {
        // 一応nullで初期化しておく
        logic = null;
        mockDao = null;
    }

    @Test
    public void normal() throws Exception {
        // mockは、getメソッドに1が渡される。
        // そして、戻り値はID1の太郎さん
        expect(mockDao.get(new Integer(1))).andReturn(new Person(1, "太郎", 170.0, 65.0));
        
        // 設定モードから再生?モードへ!
        replay(mockDao);
        
        // bmi値のアサーション
        assertEquals(22.49, logic.calcBMI(new Integer(1)), 0.01);
        
        // mockが期待された通りに呼ばれたかのチェック
        verify(mockDao);
    }
    
    @Test
    public void notFound() throws Exception {
        // 人が見つからなかったです
        expect(mockDao.get(new Integer(2))).andReturn(null);
        
        // 設定モードから再生モードへ!
        replay(mockDao);

        // いないのでnullが返る
        assertNull(logic.calcBMI(new Integer(2)));
        verify(mockDao);
    }
}