我正在阅读Clean Code: A Handbook of Agile Software Craftsmanship
,其中一个示例涉及一个Portfolio
类和一个TokyoStockExchange
类。但是,Portfolio
它的可测试性不是很好,因为它依赖于TokyoStockExchange
作为外部 API 来确定投资组合的价值,这是一个非常不稳定的查找,不利于测试。
因此,他们通过创建一个通用StockExchange
接口来解决这个问题,TokyoStockExchange
并且DummyStockExchange
都实现了基类。因此,获得了依赖倒置原则,并且在PortfolioTest
类中可以实例化 a DummyStockExchange
,将股票价格固定给公司,将DummyStockExchange
实例分配给投资组合,并将该公司的一些股票添加到投资组合中,然后断言期望值是否为确实是正确的值。这是代码:
public class PortfolioTest
{
private DummyStockExchange exchange;
private Portfolio portfolio;
protected void setUp()
{
exchange = new DummyStockExchange();
exchange.fix("MSFT", 100);
portfolio = new Portfolio(exchange);
}
public void GivenFiveMSFTTotalShouldBe500()
{
portfolio.add(5, "MSFT");
Assert.assertEquals(500, portfolio.value());
}
}
我的问题很简单,为什么?
我们正在尝试测试该课程是否TokyoStockExchange
与该课程协同工作Portfolio
。显然,如果我们用一个新方法创建另一个类来设置股票价格,然后给投资组合中的五只股票,那么一切都会奏效。似乎.. 测试没用。我知道由于股票价格的变化,TokyoStockExchange
基本上不可能进行测试,Portfolio
但我不明白在一个相当无用的测试中进行替换如何帮助这种情况。
这一切似乎都类似于不知道我们的加法器程序是否有效,但唯一可用的数字是随机生成的,因此我们创建了一个虚拟类,它给我们一个 2 并测试 if 2 + 2 = 4
。嗯,是的,显然这是真的。我们仍然可以中断TokyoStockExchange
并且测试仍然会成功,因为它正在测试另一个类。如果这一切看起来都是骗人的,那么它也导致不得不编写额外的代码来测试我们知道会起作用的东西。
我认为这是我目前理解单元测试时遇到的最大问题。我知道我错了,我只是没能看到我猜想的光明。希望有人可以帮助我。