【发布时间】:2016-12-30 06:13:31
【问题描述】:
我正在研究一种方法,该方法可以被视为另一种已定义和测试方法的特化。下面是一个示例代码来说明:
public class ProductService {
public void addProduct(Product product) {
//do something
}
public void addSpecialProduct(Product product) {
addProduct(product);
//do something after
}
}
我不想复制我对addProduct 的测试,这些测试已经非常复杂。我想要的是当我为addSpecialProduct 定义测试时,我只是确保它在此过程中也调用addProduct。如果这是 2 个类协作的问题,那么很容易模拟协作者并验证目标方法是否被调用(并在必要时将其存根)。但是,这两个方法属于同一个类。
我现在的想法是监视我正在测试的对象,例如:
public void testAddSpecialProduct() {
//set up code
ProductService service = spy(new DefaultProductService());
service.addSpecialProduct(specialProduct);
verify(service).addProduct(specialProduct);
//more tests
}
但是,我想知道这种方法是否以某种方式违背了单元测试的目的。对此问题的普遍共识是什么?
【问题讨论】:
-
您能否将
addProduct方法的断言放在测试实用程序方法中并在多个测试用例之间重用? -
这个类对我来说听起来有点代码味道,最好将这 2 个功能(产品和特殊产品)组合成 2 个单独的类(然后你的测试变得明显和容易)。拥有通用的“添加”和“专门的添加”会破坏单一责任。
-
@chrylis 这实际上听起来很合理,是的。我忘记了我以前做过类似的事情。
-
@kuhajeyan 不是。想象一下:
addProduct基本上是添加产品的简单服务。addSpecialProduct是一项添加产品然后执行其他操作的服务,例如触发警报/通知等。 -
您在
addProduct中测试过的所有案例是否也适用于addSpecialProduct,或者只是其中的一部分?
标签: java unit-testing mockito