かずきのBlog@hatena

すきな言語は C# + XAML の組み合わせ。Azure Functions も好き。最近は Go 言語勉強中。日本マイクロソフトで働いていますが、ここに書いていることは個人的なメモなので会社の公式見解ではありません。

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);
    }
}