2012-03-11 2 views
0

Integerを使用して英語の単語バージョンに変換するプログラムを作成する必要があります。例えばTDD + Mockingをデモするプログラム

Input: 21 
Output: twenty one 
Input: 110 
Output: one hundred and ten 

私はモックを使いたいので、TDDを実証するためのプログラムが必要です。

私は、変換を行う関数(英語の単語の2つの配列に基づく)を持つクラスを作成しました。今私がEasymockでデモンストレーションできるような方法でプログラムを設計する必要があります。

したがって、私は自分の模擬の対象となるインタフェースを作成する必要があります。誰も私のプログラムをどのように設計するかについての指針を私に与えることはできますか?

これは適切でしょうか?

  1. ConverterInterfaceというインターフェイスへの参照を持つConverterクラスを作成します。私はインターフェイスを模擬して、私のConverterクラスに設定することができました。

助けてください。

+0

一般に、他のものをシミュレートするために模擬が使用されます。あなたは何をシミュレートしようとしていますか?出力メカニズムは? –

+0

TDDをデモンストレーションする場合は、コードを破棄してテストを書き始める必要があります。 –

+0

@vaughan:それは私の問題です。私のプログラムは嘲笑せずに簡単に書くことができますが、私は嘲笑を示す方法で書く必要があります。したがって、私はそのように設計する必要があります。デザインは明らかに畳み込まれますが、練習は模擬を示すことです。 – TheCoder

答えて

1

TDDを模擬することはできません。実際、嘲笑は、TDDの新しい人を混乱させる可能性があります。私はあなたが開発しようとしている機能をテストして起動し、後で嘲笑することを心配しています。あなたがテストは英語コンバータに数値を運転したと仮定しましょう(それはあなたがあなたの説明に基づいて、まだ行っている表示されません)、あなたはこのようになりますクラスを持っている:

public class NumberConverterTest { ... } 

public class NumberConverter { 
    public String toEnglish(int number) { ... } 
} 

あなたがする可能性があります

public class NumberConverterMain { 
    public void main(String[] args) { 
    NumberConverter converter = new NumberConverter(); 
    System.out.println(converter.toEnglish(args[0]); 
    } 
} 

これで、モックなしでTDDを実演しました。 TDDを練習しようとすると、疑いの余地なく疑問が浮かび上がるでしょう。模倣を実証するために、 "1000以上の番号のすべての要求を大量の部門に記録する必要があります"など、toEnglishメソッドの周りに任意のビジネスルールを追加できます。多数の部署が別のサーバー上でホストされていることがわかっているので、依存関係がないようにするために、インターフェイスをテストして試してみることができます。

public class NumberConverterTest { 
    // .. 
    @Test public void theLargeNumberDepartmentIsNotifiedForLargeNumbers() { 
    LargeNumberDepartment department = new MockLargeNumberDepartment(1000); 
    NumberConverter converter = new NumberConverter(department); 
    converter.toEnglish(1000); 
    assertTrue(department.wasNotifiedWith(1000)); 
    } 

    public static MockLargeNumberDepartment implements LargeNumberDepartment { 

    private int valueRequested; 

    public void MockLargeNumberDepartment(int threshhold) { 
     this.threshold = threshold; 
    } 

    public int notificationThreshold() { 
     return this.threshold; 
    } 

    public void largeNumberReceived(int value) { 
     valueRequested = value; 
    } 

    public boolean wasNotifiedWith(int value) { 
     assertEquals(value, valueRequested); 
     return true; 
    } 
    } 
} 

// In NumberConverter.java 
public class NumberConverter { 
    public NumberConverter(LargeNumberDepartment department) { 
    this.department = department; 
    } 

    public String toEnglish(int value) { 
    if(value > department.notificationThreshold()) 
     department.largeNumberReceived(value); 
    return convertIt(value); 
    } 
} 
+0

お返事いただきありがとうございました。私は今あなたの助けを借りてプログラムを書いた。 – TheCoder

0

最初に、私は@Don Robyに、実際にテストを最初に書き、何かを模擬する機会として捨てるのが最善であることに同意します。

私はこのプログラムとは異なる要素を見ています。

  1. 「メイン」の実行可能部
  2. 単語
  3. 出力

最初を表示するための機構に番号を変換するためのコマンドライン引数

  • アルゴリズムを処理するためのロジック2つはやや単純です。 3番目のクラスは、それ自身のクラスを持つほど複雑なクラスです。 4つ目はコンソールに出力するのが簡単かもしれませんが、これが何らかの形で実際のプログラムであった場合、答えをどこに送信するかを抽象化することで、ファイルへの書き込みやデータベースなどがありますので、個別に実行される具体的な実装では、そこにインターフェイスを持つようには完全には考案されていません。

  • +0

    だから、 'display'という抽象メソッドを持つ 'ConverterView'というインターフェイスを記述する必要があると言っています。その後、このインターフェイスを模擬し、ユニットテストでそれをSystem.outに渡しますか?したがって、実際のプログラムでは、ディスプレイはウェブページに表示される可能性がありますか? – TheCoder

    +0

    私は以下のように私のプログラムを分割しました:mainメソッドを持つコンバータクラス。 UserInputクラス+は、ユーザーからの入力を取得するためのインターフェイスです。変換を行うためのアルゴリズムクラス+インタフェース。まだ何かを模擬する理由が見つかっていません... – TheCoder

    +0

    あなたのメインメソッドをテストしている場合は、AlgorithmクラスとUserInputクラスをテストしません。期待どおりに呼び出されていることを確認してくださいモックを使用して)、UserInputのアルゴリズムと個別の単体テストについて別々の単体テストを記述します。そうすれば、UserInput(不正なフォーマット、パイプの破損など)が間違ってしまうことがありますが、アルゴリズムのロジックとは別にすべてのパスをテストすることができます。 – jhericks

    0

    モッキングは、インタフェースを介して懸念の分離が「マテリアライズ」されている、コンポーネント間に責任の分担がある場合にのみ有効です。あなたの問題は、それを説明するにはあまりにも狭いと思われます。 1つのアイデアは、あなたの問題を拡大し、Number Translatorを複数の言語に設計することです。この場合、文字列Translate(int number)メソッドを公開するINumberTranslatorインターフェイスを使用して、ストラテジーパターンが出現すると思います。

    モックのないTDDから、モック付きTDDにかなりスムーズに移行することができます。最初に "英語に翻訳する"という要件のテストを作成し、 "スペイン語でこれをサポートする必要がある"という要件を変更します。