我开始为不同的算法创建JUnit测试,但很快我意识到,大多数时候,我都会编写相同的代码,所以我决定集中处理这些部分。
与其对DB进行多次调用,我更喜欢创建一个模拟,并从CSV读取值。我嘲笑每个负责调用DB并返回值的提供程序。
假设我有以下提供者: A,B,C,D,E,F。
我为每个抽象类创建了一个抽象类,其中我有一些方法,一个用于读取csv的值,另一个用于筛选结果并在WhisthRe转折点语句中使用: 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,我就拥有它们了。
有更优雅的方法吗?
发布于 2022-09-07 21:12:37
我宁愿使用组合(依赖注入)来实现这种抽象(可重用性),而不是继承。
如下所示:
class MyTest1 {
private AMock aMock;
...
}当然,您可以使用继承来避免BMock、CMock中的重复。等等,但即使在这里,我也宁愿用构图来达到同样的目的。通常,如果要强制执行某些行为(通常通过构造函数和抽象方法),则应该使用继承。
在您的例子中(据我理解),您更感兴趣的是每个模拟独立提供的特性。
如果EMock内部使用来自BMock的方法.为完成其任务:
class EMock {
private AMock aMock;
private BMock aMock;
...
}如果在BMock中没有使用来自EMock的任何内容,那么:
class MyTest1 {
private AMock aMock;
private BMock bMock;
...
private EMock eMock;
// further methods where aMock.doSomeStuff() ... is called.
}https://stackoverflow.com/questions/73641034
复制相似问题