我有一个类,它应该将数据从一种格式转换为另一种格式(Database to LibraryType)。它看起来像:
public LibraryType convertToLibrary(Database db, Parameters params) {
Preconditions.checkNotNull(db," missing database for conversion");
Preconditions.checkNotNull(params, "missing parameters for conversion");
LibraryType lib = basicFactory.createLibraryType();
lib.setName(db.getName());
ComponentType type = convertStructure(db.getStructure(),params);
if (type != ComponentType.EMPTY) {
lib.addComponent(type);
}
return lib;
}
ComponentType convertStructure(Structure s, Parameters params) {
if (!params.isStructureAllowed(s)) return ComponentType.EMPTY;
ComponentType comp = basicFactory.createComponentType();
comp.setName(s.getName());
return comp;
}
我对这个概念有两个问题。
convertStructure方法应该是私有的,因为从外部调用它不是必需的,但出于测试目的,我将它定义为程序包范围,看起来不太好
将参数(参数)传递给子方法。实际上我会使用一个类字段,可以在构造函数中插入,但由于使用guice作为DI框架,我无法将此数据传递给构造函数。参数将在运行时更改。所以我需要将它作为方法参数传递。我可以将它设置为convertToLibrary方法中的类字段,但是我无法测试convertStructure方法。
我遇到了设计问题还是有任何有用的解决方法?将它分成不同的类是否有意义,这对我来说听起来不是很好,因为我仍然认为它是类中的一个责任(SRP)(转换数据)?
感谢您的帮助
答案 0 :(得分:1)
回答问题1(也许是问题2):
如果您认为需要为convertStructure()
编写测试,我认为这表明它应该属于自己的类。测试不应该测试较小的单一责任(IMO)。
那就是说,我不确定你是否需要孤立地测试convertStructure()
。没有测试convertLibrary()
吗?或者可能是一个更大的单位?
意见:我倾向于在外面进行测试,在高水平测试开始并在需要时测试较小的部件。从系统用户开始测试行为,并仅在需要时测试实现细节。不是每个人都同意我的意见。