繁体   English   中英

如何重用测试实现?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM