-
- Page 3
テストとファサードの関係
テスト駆動型のアプローチでは、ファサードを作る場合が多いと思われます。テスト駆動開発(TDD)では、システム設計の際に、パブリックインターフェースを通じてクラスの動作を実証するテストを記述します。単体テストのコンセプトやポリシーを簡潔に表現したいと考える開発者であれば、ベースになるAPIとの対応付けを行うために、何らかの変換(つまりファサード)が必要だと気付くでしょう。
リスト2に、Commandクラスに対するテストを示します。このCommandTestクラスの興味深いところは、自分自身をテスト対象のコマンドラインアプリケーションとして使用する点です。この自己シャント(self-shunt)の仕組みにより、外部のアプリケーションやOSとの依存関係をなくしています。
import static org.junit.Assert.*;
import org.junit.*;
public class CommandTest {
enum TestName {
testSingleLine("a short line of text"),
testMultipleLines("line 1\\nline2\\n"),
testLotsOfLines("") {
String outputText() {
final int lots = 1024;
StringBuilder lotsBuffer = new StringBuilder();
for (int i = 0; i < lots; i++)
lotsBuffer.append("" + i);
return lotsBuffer.toString();
}
};
private String outputText;
TestName(String outputText) {
this.outputText = outputText;
}
String outputText() {
return outputText;
}
}
private Command command;
public static void main(String[] args) {
TestName testName = TestName.valueOf(args[0]);
System.out.println(output(testName));
System.err.println(syserrOutput(testName));
}
private static String syserrOutput(TestName testName) {
return testName.outputText.toUpperCase();
}
private static String output(TestName testName) {
return testName.outputText();
}
@Test
public void successfullyExecutesSingleLine()
throws Exception {
executeCommand(TestName.testSingleLine);
verifyOutput(TestName.testSingleLine);
}
@Test
public void successfullyExecutesMultipleLines()
throws Exception {
executeCommand(TestName.testMultipleLines);
verifyOutput(TestName.testMultipleLines);
}
@Test
public void successfullyExecutesLotsOfLines()
throws Exception {
executeCommand(TestName.testLotsOfLines);
verifyOutput(TestName.testLotsOfLines);
}
private void executeCommand(TestName testName)
throws Exception {
command = new Command(commandString(testName));
command.execute();
}
private void verifyOutput(TestName testName)
throws Exception {
assertEquals(output(testName), command.getOutput());
assertEquals(syserrOutput(testName),
command.getErrorOutput());
}
private String[] commandString(TestName testName) {
return new String[] { "java", "-classpath",
"\"" + System.getProperty("java.class.path")
+ "\"", "CommandTest",
testName.toString() };
}
}

この記事は参考になりましたか?
既に会員の方はを行ってください。
- デザインパターンの使い方連載記事一覧
- この記事の著者
-
japan.internet.com(ジャパンインターネットコム)
japan.internet.com は、1999年9月にオープンした、日本初のネットビジネス専門ニュースサイト。月間2億以上のページビューを誇る米国 Jupitermedia Corporation (Nasdaq: JUPM) のニュースサイト internet.com や EarthWeb.com からの最新記事を日本語に翻訳して掲載するとともに、日本独自のネットビジネス関連記事やレポートを配信。
※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です
-
Jeff Langr(Jeff Langr)
本格的なソフトウェアの開発に四半世紀以上携わってきたベテランのソフトウェア開発者。『Agile Java: Crafting Code With Test-Driven Development』(Prentice Hall、2005年)と、他の1冊の著書がある。『Clean Code』(Uncle Bob Martin著、Prentice Hall、2008年8月)にも寄稿している。また、ソフトウェア開発に関する記事を80件以上執筆しており、そのうちの...
※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です
この記事は参考になりましたか?
この記事をシェア
