2012-02-27 24 views
2

私はアジャイルプラクティスのコースに従っており、私には宿題があります。コースの中で、私は自動受入れテストにFITを使用する方法について教えてきました。私が見ることのできるところから、FITは死にそうであると思われ、私はそれが私の宿題に使用したい技術であることはもはや確信していません。とにかく...レガシーコードの受け入れを受け入れる

私はレガシーシステムをテストしており、すべてがひどく設計/コード化されています。もちろん、テストはありません。受け入れテストを書く前に、リファクタリングや機能の変更を許可されていません。

簡単にするために、システムは、製品リスト(価格付き)と総費用を標準出力ストリームに印刷する店舗受領システムです。このような何か:

public class ReceiptSystem 
{ 
    List<Product> boughtProducts = new ArrayList<Product>(); 

    public void buyProduct(Product p) 
    { 
     boughtProducts.add(p); 
    } 

    public void printReceipt() 
    { 
     List<ReceiptLine> receipt = new ArrayList<ReceiptLine>(); 
     int total = 0; 
     int price; 
     for(List<Product> boughtProducts : boughtProduct) 
     { 
      price = SomeThirdPartyClass.calculatePrice(boughtProduct.getBarcode()); 
      System.out.println(boughtProduct + ": " + price); 
      total += price; 
     } 

     System.out.println("TOTAL: " + total); 
    } 
} 

問題は価格が外部ライブラリを持つサードパーティのシステムによって計算されているということですので、私は彼らを知らないと、私はそれは難しい(不可能ではない)の受け入れを書くことを見つけますFITを使用してテストします。

ショッピングリスト(入力):

------------------- 
| product's barcode | 
------------------- 
| 111111111   | 
------------------- 
| 123456789   | 
------------------- 
| 987654321   | 
------------------- 
| 999999999   | 
------------------- 

領収書(期待出力):

------------------ 
| receipt   | 
------------------ 
| 111111111: 1.99 | 
------------------ 
| 123456789: 2.99 | 
------------------ 
| 987654321: 3.99 | 
------------------ 
| 999999999: 4.99 | 
------------------ 
| TOTAL: 13.96  | 
------------------ 

しかし、どのように、私は価格を知らなくても、これを達成することができ、通常の場合、私のような何かをするだろう?採用する最良の戦略は何ですか?これを達成するための他のフレームワークはありますか?

ありがとうございます。

更新:SomeThirdPartyClassがそれを模擬するか、次のエラーを与えるためにプロキシクラスを記述しようとしている、finalです:

Cannot subclass final class class SomeThirdPartyClass

はさらに、それは不変だとpublicコンストラクタは引数を持ちません。先生が目的に応じて作ってくれたようです...

答えて

0

サードパーティのライブラリにはProxyクラスを作成し、偽のバージョンをRecieptSystemに挿入することができます。これにはJUnitとMockitoをお勧めしますが、使用できる他のフレームワークもあります。

エンドツーエンドのテストのみが許可されている場合は、入力して出力を保存し、その結果に基づいて回帰テストを作成できます。あなたがプログラムのための要件を持っていない限り、出力がどんなものであるべきかを推測しないでください。それを捕捉して回帰テストに変えれば、安全にリファクタリングすることができます。

私はSeleniumや他の受け入れテストフレームワークで遊んだことがありますが、GUIをフックする必要がない限り、通常は過剰です。私はJUnitを使うだけです。 FITnesseはBobさんがチェックアウトしたFITの最新バージョンです。

+0

ありがとう、@ガレットホール。正確には、それは私が実際の状況でやることです。しかし、私はコードを書く前にコードを変更することは許されません(それは宿題の必要条件の一部です...) – satoshi

+0

その後、出力をキャプチャしてから回帰テストを作成してください。 FITnesseはあなたがチェックアウトしたいかもしれないFITの最新バージョンですが、JUnitはうまく動作するはずです。 –

+0

私は@GarrettHallに同意します。 [Mockito](http://code.google.com/p/mockito/)のような模擬フレームワークを使用して、サードパーティライブラリからの応答をシミュレートすることができます。例えば。 'Mockito.when(SomeThirdPartyLibrary.calculatePrice(" 11111111 "))thenReturn(" 1。9935); ' – radimpe

関連する問題