我正在关注敏捷实践课程,并且我有作业。在课程中,我已经教过如何使用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
而且,它是不可变和公共构造函数没有参数。好像老师讲的目的....
谢谢,@GarrettHall。确切地说,这就是我在真实情况下所要做的。但是我不允许在编写任何代码之前以任何方式更改代码(这是作业要求的一部分...) – satoshi 2012-02-27 18:34:12
然后只捕获输出,然后从中创建回归测试。 FITnesse是您可能想要查看的FIT的更新版本,但JUnit应该可以正常工作。 – 2012-02-27 18:44:03
我同意@GarrettHall。您可以使用模拟框架,如[Mockito](http://code.google.com/p/mockito/)模拟来自第三方库的响应。例如。 'Mockito.when(SomeThirdPartyLibrary.calculatePrice( “11111111”))。thenReturn(“1。99“);' – radimpe 2012-02-27 19:00:55