1

我有一个类,它应该将数据从一种格式转换为另一种格式(Database 到 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;
}

我对这个概念有两个问题。

  1. 方法 convertStructure 应该是私有的,因为不需要从外部调用它,但是出于测试目的,我在包范围内定义了它,看起来不太好

  2. 参数(params)被传递给子方法。实际上我会使用一个可以在构造函数期间插入的类字段,但是由于使用 guice 作为 DI 框架,我无法将此数据传递给构造函数。参数将在运行时更改。所以我需要将它作为方法参数传递。我可以将它设置为 convertToLibrary 方法中的类字段,但是我无法测试方法 convertStructure。

我遇到了设计问题还是有任何有用的解决方法?将它分成不同的类是否有意义,这对我来说听起来不太好,因为我仍然觉得这是类中的一项责任(SRP)(转换数据)?

感谢帮助

4

1 回答 1

1

回答问题 1(也许还有问题 2):

如果你觉得你需要为 编写一个测试convertStructure(),我认为这表明它应该在自己的类中。测试不应该测试比单一职责 (IMO) 更小的事情。

也就是说,我不确定您是否需要单独测试convertStructure()。测试convertLibrary()还不够吗?或者可能是更大的单位?

意见:我倾向于从外部进行测试,从高水平开始测试,并在需要时测试较小的部分。从系统用户的角度开始测试行为,并仅在需要时测试实现细节。虽然不是每个人都同意我的观点。

于 2013-07-22T10:58:29.667 回答