我有一个具有两个公共方法的类,它们完成非常相似的工作,但参数类型不同。这些方法只提取所需的数据,并且都调用实际完成工作的相同私有方法。
我的问题是,测试这个类的最好方法是什么?我想只测试公共方法,所以为了确保两个方法都返回正确的数据,我最终为相同的断言/概念创建了两个测试方法。我也不知道将断言移动到私有方法中以避免重复断言的代码是否是最好的主意。有时测试是文档的重要组成部分,我希望其他开发人员通过阅读测试来充分理解我的代码。
我使用junit 4, mock,我不使用TDD。TDD会帮助我避免这个问题吗?
对
首先:TDD不是一颗能解决所有问题的灵丹妙药。它可以帮助你从一开始就写出更好的代码,但是即使使用TDD,你仍然可以写出糟糕的代码。
你要问自己的第一个问题是,如果你真的需要两个方法。这是一个没有密码就无法回答的问题。
如果你确实需要两个方法,那么它们都是你的公共api的一部分,应该进行测试。这样您就可以确保在参数映射中没有错误(如果您的私有方法工作得很好,但您无法给出正确的参数,这将是令人尴尬的)。
当然,你也可以直接测试私有方法,但老实说,我不认为这是一个好方法。另一种可能性是,您可以通过使用组合来解决问题,换句话说,不要使其成为私有方法,而是添加一个可以设置为执行私有方法工作的接口,例如,而不是…public class MyPublicClass {
public void method1(Data1 x) {
....call private method
}
public void method2(Data2 x) {
....call private method
}
private void methodX(String, int, int, double, String)
...do the work
}
}
…
public class MyPublicClass {
private MyNewInterface executor;
// probably good idea to make executor final and set it in the constructor
public void method1(Data1 x) {
executor.method( ... );
}
public void method2(Data2 x) {
executor.method( ... );
}
}
这样你可以独立地测试多个东西:
- 公共方法是否给出了正确的参数(通过使用你可以验证的接口的
MyNewInterface
)? 你的实现类做正确的工作(然后你只需要测试一次)?
只有你能回答这个问题,如果这样的重构对你来说是一个好主意。