テスト対象のロジッククラス
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);
}
}