私はアジャイルプラクティスのコースに従っており、私には宿題があります。コースの中で、私は自動受入れテストに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コンストラクタは引数を持ちません。先生が目的に応じて作ってくれたようです...
ありがとう、@ガレットホール。正確には、それは私が実際の状況でやることです。しかし、私はコードを書く前にコードを変更することは許されません(それは宿題の必要条件の一部です...) – satoshi
その後、出力をキャプチャしてから回帰テストを作成してください。 FITnesseはあなたがチェックアウトしたいかもしれないFITの最新バージョンですが、JUnitはうまく動作するはずです。 –
私は@GarrettHallに同意します。 [Mockito](http://code.google.com/p/mockito/)のような模擬フレームワークを使用して、サードパーティライブラリからの応答をシミュレートすることができます。例えば。 'Mockito.when(SomeThirdPartyLibrary.calculatePrice(" 11111111 "))thenReturn(" 1。9935); ' – radimpe