テンプレートモード(Template pattern)


詳細
テンプレートモードには、親と子の構成があります.親クラスは抽象クラスであり、テンプレートを構築してあることを完了する流れを規定している.子クラスは親クラスを継承し、具体的な各プロセス操作を実現します.
以下はjunit 3の親がテストを実行する際に前後して実行する3つの方法の順序を規定し、方法の内容は子に多態を除く

public abstract class TestCase extends Assert implements Test {

	public void runBare() throws Throwable {
		setUp();
		try {
			runTest();
		}
		finally {
			tearDown();
		}
	}

	protected void runTest() throws Throwable {
		assertNotNull(fName);
		Method runMethod= null;
		try {
			runMethod= getClass().getMethod(fName, null);
		} catch (NoSuchMethodException e) {
			fail("Method \""+fName+"\" not found");
		}
		if (!Modifier.isPublic(runMethod.getModifiers())) {
			fail("Method \""+fName+"\" should be public");
		}

		try {
			runMethod.invoke(this, new Class[0]);
		}
		catch (InvocationTargetException e) {
			e.fillInStackTrace();
			throw e.getTargetException();
		}
		catch (IllegalAccessException e) {
			e.fillInStackTrace();
			throw e;
		}
	}

	protected void setUp() throws Exception {
	}

	protected void tearDown() throws Exception {
	}
}

次に、子クラスが親クラスを継続し、多態で親定義を具体的に実現する方法を示します.

public class CalculatorTest extends TestCase
{
		
	@Override
	public void setUp() throws Exception
	{
		System.out.println(++count);
		
		cal = new Calculator();
	}
	
	@Override
	public void tearDown() throws Exception
	{
		
	}

	public void testAdd()
	{
		int result = cal.add(1, 2);
		
		Assert.assertEquals(3, result);
	}
	
	public void testSubtract()
	{
		int result = cal.subtract(1, 2);
		
		Assert.assertEquals(-1, result);
	}
	
	public void testMultiply()
	{
		int result = cal.multiply(2, 3);
		
		Assert.assertEquals(6, result);
	}
}
	public static void main(String[] args)
	{
		junit.swingui.TestRunner.run(CalculatorTest.class);
	}
}