SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

デザインパターンの使い方

デザインパターンの使い方: Facade

テストとファサードの関係

 テスト駆動型のアプローチでは、ファサードを作る場合が多いと思われます。テスト駆動開発(TDD)では、システム設計の際に、パブリックインターフェースを通じてクラスの動作を実証するテストを記述します。単体テストのコンセプトやポリシーを簡潔に表現したいと考える開発者であれば、ベースになるAPIとの対応付けを行うために、何らかの変換(つまりファサード)が必要だと気付くでしょう。

 リスト2に、Commandクラスに対するテストを示します。このCommandTestクラスの興味深いところは、自分自身をテスト対象のコマンドラインアプリケーションとして使用する点です。この自己シャント(self-shunt)の仕組みにより、外部のアプリケーションやOSとの依存関係をなくしています。

リスト2 CommandTest
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() };
   }
}
図1 Facadeパターン
図1 Facadeパターン

この記事は参考になりましたか?

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
デザインパターンの使い方連載記事一覧

もっと読む

この記事の著者

japan.internet.com(ジャパンインターネットコム)

japan.internet.com は、1999年9月にオープンした、日本初のネットビジネス専門ニュースサイト。月間2億以上のページビューを誇る米国 Jupitermedia Corporation (Nasdaq: JUPM) のニュースサイト internet.comEarthWeb.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件以上執筆しており、そのうちの...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/3376 2009/01/07 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー