[英]How can I reuse test implementation?
我开始为不同的算法创建 JUnit 测试,但很快我意识到大部分时间,我编写相同的代码,所以我决定集中这些部分。
与其对数据库进行多次调用,我更喜欢创建一个模拟,并从 CSV 读取值。 我模拟每个负责调用 DB 并返回值的提供者。
假设我有以下提供者:A、B、C、D、E、F。
我为每一个创建了一个抽象的 class,我有一些方法,一个从 csv 读取值,另一个用于过滤结果并在 when-thenReturn 语句中使用它:AMock、BMock、CMock、DMock、EMock、FMock。
我知道我无法创建扩展所有这些类的测试,所以目前,我使用以下解决方法:
EMock 扩展了 FMock
DMock 扩展了 EMock
CMock 扩展了 DMock
BMock 扩展了 CMock
AMock 扩展了 BMock
MyTest1 扩展 AMock
MyTest2 扩展了 AMock
MyTest3 扩展了 CMock
等等
但我不是很喜欢它,因为我不是每次都需要它,
例如,如果 MyTest2 只需要 AMock 和 EMock,扩展 AMock 我拥有它们。
有没有更优雅的方法?
而不是 inheritance 我宁愿使用组合(依赖注入)来实现这种抽象(可重用性)
像这样:
class MyTest1 {
@Mock
private AMock aMock;
...
}
当然,您可以使用 inheritance 来避免 BMock、CMock 中的重复。 等等,但即使在这里,我宁愿使用组合来实现相同的目标。 如果想要强制执行某些行为(通常通过构造函数和抽象方法),通常应该使用 inheritance。
在您的情况下(据我了解),您对每个模拟独立提供的功能更感兴趣。
如果 EMock 在内部使用 BMock... 的方法来完成其任务:
class EMock {
@Mock
private AMock aMock;
@Mock
private BMock aMock;
...
}
如果 EMock 中没有使用任何来自 BMock 的内容:
class MyTest1 {
@Mock
private AMock aMock;
@Mock
private BMock bMock;
...
@Mock
private EMock eMock;
// futher methods where aMock.doSomeStuff() ... is called.
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.