Java/Groovy实现基础工厂方法时子类静态方法未触发问题(Katalon环境)
问题根源
- Java/Groovy的静态方法不支持重写:子类定义的同名静态方法属于「方法隐藏」,不会触发多态调用,父类静态方法内部调用的
ModelFromRow永远绑定父类自身的实现。 - 父类
ModelFromRow用private修饰,子类本身无法访问/覆盖该方法,进一步导致父类逻辑固定返回null。
修复方案(推荐:重构为实例工厂)
该方案符合面向对象多态设计,改动量小,适配Katalon运行环境:
1. 修改BaseModelFactory基类
改为抽象类,移除方法的static修饰,将ModelFromRow定义为抽象方法强制子类实现:
import java.util.stream.Collectors import com.kms.katalon.core.testdata.TestData public abstract class BaseModelFactory<T> { public List<T> ModelsFrom(TestData testData) { return testData.getAllData() .stream() .map { row -> this.ModelFromRow(row) } .collect(Collectors.toList()) } public T ModelFrom(TestData testData, int rowNum) { return ModelFromRow(testData.getAllData().get(rowNum)) } protected abstract T ModelFromRow(List<Object> row) }
2. 修改子类工厂实现
移除静态修饰,添加@Override注解标记实现的抽象方法:
import java.text.SimpleDateFormat import com.xxx.models.contract.ContractModel public class ContractModelFactory extends BaseModelFactory<ContractModel> { @Override protected ContractModel ModelFromRow(List<Object> row) { SimpleDateFormat dateFormat = new SimpleDateFormat("MM-dd-yyyy"); return new ContractModel( Integer.parseInt(row[0].toString()), row[1], dateFormat.parse(row[2].toString()), dateFormat.parse(row[3].toString()), // 其余参数 ) } }
3. 调整调用方式
先实例化工厂类再调用对应方法:
def contractFactory = new ContractModelFactory() WebUI.verifyNotEqual( contractFactory.ModelFrom(findTestData("whatever"), 1), null )
补充说明
如果一定要保留静态调用逻辑,可以在父类静态方法中新增Class<T> modelClass参数,通过反射匹配子类的静态ModelFromRow方法,但是实现复杂度更高,且不符合工厂模式的常规设计,因此不推荐。
内容的提问来源于stack exchange,提问作者Mike Warren
相关产品推荐
相关产品推荐

