我试图在一个吐出属于第三方组件的对象的类上开始使用TDD。然而,我显然有点困惑:
a)使用单元测试对象应该单独测试
b)应将第三方组件包装到适配器中
在编写返回属于第三方组件的对象实例的代码的测试时,这些规则是否适用?举个例子,这是迄今为止的测试:
// Arrange
string foodXml = "<food><ingredient>Cabbages</ingredient>" +
"<ingredient>Bananas</ingredient></food>";
IFoodMixer mixer = new FoodMixer();
// Act
// Smoothie is the third-party component object
Smoothie urgh = mixer.Mix(foodXml);
// Assert
Assert.AreEquals("Cabbages", urgh.Ingredients[0].Name);
Assert.AreEquals("Bananas", urgh.Ingredients[1].Name);
道歉,如果这个问题看起来有点基本(或者如果上面的概念看起来有些愚蠢!) - 我只是在努力理解上述两条规则在这种情况下如何应用。
提前感谢任何建议!
答案 0 :(得分:4)
我会很实用。如果Smoothie只是一个数据对象,请不要打扰它。
FoodMixer里面有一些东西,它首先创造了Smoothie。如果那是第三方组件,我会将其包装起来(如果需要,可以从类委托给静态方法),然后依赖注入包装器并在单元测试中模拟它。
然后,您的单元测试将描述您的FoodMixer的行为和责任,独立于SmoothieMaker(无论是第三方还是其他方式)。 FoodMixer的部分责任是向SmoothieMaker询问冰沙,而不是实际制作冰沙。通过嘲笑我们可以表达责任和阶级范围。
如果您的Smoothie不仅仅是一个数据对象,而且具有丰富的行为,我也会将其包裹在您的包裹的SmoothieMaker中。
现在,您已完全脱离第三方库,并且您可以轻松地将其作为有用的副产品进行单元测试。
答案 1 :(得分:-1)
将mockito视为一种更简单的方法来自动创建模拟并验证断言而不是使用适配器。 还有许多关于mockito(和JMocks)的好教程,这些教程也是很好的TDD教程。