cafegale(LeafCage備忘録)

LeafCage備忘録(はてなダイアリー)と統一しました。

呼び出し時にオーバーライドする

『バグがないプログラムの作り方』の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;
	}
}