我正在做一些项目,现在我正在努力进行测试。我有以下类(class):
public interface Connector{ }
public class ConnectorFactory{
public Connector create(){
//Very complicated logic
}
}
测试这个类是绝对必要的。但是这个方法太大了,不容易测试。我找到的解决方案是分成 default-access 方法,如下所示:
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){
//...
}
}
这些默认访问方法中的每一个都很容易测试。它们是默认访问的唯一原因是测试。
这样做很常见吗?
最佳答案
所以问题似乎是:我们拥有所有这些一起创建某些东西的方法,它们不应该是私有(private)的吗?测试是否足以将它们暴露给世界?
好吧,不是世界,默认情况下它们是包私有(private)的,但仍然......
但是让我们反过来问:为什么这些方法首先在同一个类中?显而易见的答案是:好吧,以前就是这样,但这不是一件好事。在编写可测试代码时,我们力求,除其他外,Loose Coupling和 High Cohesion .您的原始代码是紧密耦合的,并且不是很有凝聚力。它足够复杂,它有自己的 init(),然后模板可能是硬编码的,并且在它内部深处的某个地方自己打开一个输入流。
要改进该设计,您应该模块化逻辑。某处有一个输入流解析器,某处有一个模板引擎,某处有一个结果被放在一起并返回。您应该使用适当的 API 使每一个都成为自己的类,然后您会发现您的担忧消失了。
关于java - 拆分大的测试方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43981797/