java - 对于同一接口(interface)的多个实现,应该如何编写junit测试用例?

标签 java unit-testing junit

在提问之前,让我解释一下当前的设置:

我有一个服务接口(interface)(例如 Service)和一个实现(例如 ServiceImpl)。这个ServiceImpl使用了一些其他的服务。所有服务均由 spring 作为 bean 加载。

现在,我想为 ServiceImpl 编写 junit 测试用例。同样,我使用 applicationContext 来获取 Service bean,然后对其调用不同的方法来测试它们。

对于公共(public)方法来说,一切看起来都很好,但是如何为私有(private)方法编写测试用例?因为我们对于不同的实现可能没有相同的私有(private)方法?

任何人都可以帮助我了解编写测试用例的首选方式吗?

最佳答案

最纯粹的答案是,调用私有(private)方法是有原因的! ;-)

扭转问题:仅给出(可公开访问的)接口(interface)的规范,在编写代码之前您将如何制定测试计划?该接口(interface)描述了实现它的对象的预期行为;如果在该级别上无法测试,则说明设计有问题。

例如,如果我们是一家运输公司,我们可能有这些(伪编码)接口(interface):

CapitalAsset {
    Money getPurchaseCost();
    Money getCurrentValue();
    Date  whenPurchased();
    ...
}

PeopleMover {
    Weight getVehicleWeight();
    int    getPersonCapacitly();
    int    getMilesOnFullTank();
    Money  getCostPerPersonMileFullyLoaded(Money fuelPerGallon);
    ...
}

并且可能有包括这些的类:

Bus implements CapitalAsset, PeopleMover {
    Account getCurrentAdvertiser() {...}
    boolean getArticulated() {...}
    ...
}

Computer implements CapitalAsset {
    boolean isRacked() {...}
    ...
}

Van implements CapitalAsset, PeopleMover {
    boolean getWheelchairEnabled() {...}
    ...
}

在设计 CapitalAsset 概念和界面时,我们应该与财务人员就 CapitalAsset任何实例应如何进行达成一致表现。我们将针对 CapitalAsset 编写测试,这些测试依赖于该协议(protocol);我们应该能够在 BusComputerVan 上运行这些测试,而不依赖于涉及哪个具体类。 PeopleMover 也是如此。

如果我们需要测试关于 Bus 的某些内容,且该内容独立于 CapitalAssetPeopleMover 的总合约,那么我们需要单独的总线测试.

如果特定的具体类具有非常复杂的公共(public)方法,以至于 TDD 和/或 BDD 无法清晰地表达其预期行为,那么,这又是出现问题的线索。如果具体类中有私有(private)“帮助程序”方法,那么它们的存在应该有特定的原因;应该可以提出这样的问题:“如果这个助手有缺陷,哪些公共(public)行为会受到影响(以及如何影响)?”

对于合法的、固有的复杂性(即来自问题域的复杂性),类拥有负责特定概念的帮助器类的私有(private)实例可能是合适的。在这种情况下,辅助类应该可以自行测试。

一个好的经验法则是:

If it's too complicated to test, it's too complicated!

关于java - 对于同一接口(interface)的多个实现,应该如何编写junit测试用例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/427755/

相关文章:

java - liquibase 中的 SQL 文件从未执行过

java - 单元测试环境中的 Log4j

java - 从本地内部类模拟访问外部对象

java - OpenCSV + RestTemplate : Array-Types

java - 从对象列表生成 CSV

java - Springboot 测试与 commandLineRunner 给出不同的结果

java - 如何更改 if 和 for 在测试中断言

java - 如何在另一个生成字节码类中使用匿名类实例

unit-testing - SailsJS : How to properly unit test controllers?

javascript - javascript unittests jest 库中是否有 assertCountEqual 等价物?