『バグがないプログラムの作り方』のp.114
モックオブジェクトを切り替える方法の1、ファクトリーメソッドを使う方法にて
import junit.framework.TestCase; public class UserAuthenticationTest extends TestCase { private UserAuthentication auth; protected void setUp() { auth = new UserAuthentication() { //① protected UserDAO createDAO() { return new UserDAOMock(); } }; } public void testIsCertified() { assertTrue(auth.isCertified("YAMADA", "XXX")); assertTrue(!auth.isCertified("YAMADA", "YYY")); } public void testIsCertified2() { assertTrue(auth.isCertified("TANAKA", "AAA")); assertTrue(!auth.isCertified("TANAKA", "BBB")); } private class UserDAOMock implements UserDAO { public String getPassword(String userName) { if (userName.equals("YAMADA")) { return "XXX"; } else if (userName.equals("TANAKA")) { return "AAA"; } fail("想定外の引数が渡されています。"); return ""; } } }
①で、UserAuthenticationオブジェクトを作るとき、ついでにcreateDAO()をオーバーライドしているのだけど、こういう書き方ってできたのかー。
※↓もともとのUserAuthenticationクラス。createDAO()が存在する。
このcreateDAO()で作られるUserDAOは本番環境用のDAOなので、それをUserDAOMock()作るようにcreateDAO()を書き換えている。
public class UserAuthentication { UserDAO dao = this.createDAO(); protected UserDAO createDAO() { return new UserDAOImpl(); } public boolean isCertified(String name, String password) { // TODO:実装する return false; } }