gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 11:12:13 31 4
gpt4 key购买 nike

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

我有一个服务接口(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/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com