我正在开展一些项目,现在我正在努力进行测试。我有以下课程:
public interface Connector{ }
public class ConnectorFactory{
public Connector create(){
//Very complicated logic
}
}
测试这门课是绝对必要的。但是这种方法太大而不易测试。我找到的解决方案是拆分为 默认访问 方法,如下所示:
public class ConnectorFactory{
public Connector create(){
initState();
checkIncomingParameters();
applyTemplates();
prepareResult();
InputStream is = openInputStream();
return createFromInputStream(is);
}
void initState(){
//...
}
void checkIncomingParameters(){
//...
}
String applyTemplates(){
//...
}
void prepareResult(){
//...
}
InputStream openInputStream(){
//...
}
Connector createFromInputStream(InputStream is){
//...
}
}
每种默认访问方法都很容易测试。他们是默认访问的唯一原因是测试。
这样做是否常见?
答案 0 :(得分:1)
所以问题似乎是:我们拥有所有这些共同创造某些东西的方法,它们不应该是私有的吗?是否有足够的理由将它们暴露给世界?
嗯,不是世界,默认情况下它们是包私有的,但仍然......
但是让我们回答一下这个问题:为什么这些方法首先在同一个类中?显而易见的答案是:嗯,这就是以前的事情,但这不是一个好的。在编写可测试代码时,我们会努力为Loose Coupling和High Cohesion而努力。您的原始代码是紧密耦合的,而不是非常有凝聚力。它足够复杂,它有自己的init(),然后模板可能是硬编码的,并且在其内部某处可以自行打开输入流。
要改进该设计,您应该模块化逻辑。某处有一个输入流解析器,某处有一个模板引擎,某处将结果放在一起并返回。您应该使用适当的API将这些中的每一个都设为自己的类,然后您将看到您的担忧消失。
答案 1 :(得分:1)
特定于一个类的方法应该是私有的,以确保抽象。您不应仅仅为了测试而更改其访问修饰符。有一些方法可以测试私有方法,您可以查看以前的堆栈溢出帖子:
How do I test a class that has private methods, fields or inner classes?
这些是我在测试时记住的一些其他事项: