在模拟抽象类中注入模拟



>我有一个抽象类,其中包含具体方法中的逻辑:

public abstract class AbstractEventHandler implements EventHandler {
  private final Dependency dependency;
  public AbstractEventHandler(Dependency dependency) {
    this.dependency = dependency;
  }
  @Override
  void handleEvent(Event event) {
    dependency.doSomeWork();
    [...]
    doHandleEvent(event);
    [...]
  }
  @Override
  void handleOtherEvent(OtherEvent otherEvent) {
    dependency.doOtherWork();
    [...]
    doHandleOtherEvent(event);
    [...]
  }
  protected abstract doHandleEvent(event);
  protected abstract doHandleOtherEvent(event);
}

探索了测试我的抽象类的解决方案:

    创建抽象类
  • 的虚拟实现(对构造函数来说很好 模拟抽象类并注入带有 Mockito 注释的类?
  • 在具体类中测试handleEvent(event)逻辑,但我必须在每个具体类中复制测试(或一次,但在哪个类中?
  • 使用PowerMock...
  • 使用 Mockito 实例化抽象类的实现,并调用实际方法来测试具体方法中的逻辑

我选择了Mockito解决方案,因为它既快速又简短(特别是如果抽象类包含大量抽象方法(。

@ExtendWith(MockitoExtension.class)
class AbstractEventHandlerTests {
  @Mock
  private Dependency dependency;
  @InjectMocks
  @Mock(answer = Answers.CALLS_REAL_METHODS)
  private AbstractEventHandler abstractEventHandler;
由于不允许在

已经用 @Mock 注释的字段上使用 @InjectMocks,如何在抽象类中注入模拟依赖项?

为了回复评论,我最初想在抽象类中测试具体方法的行为,因为此方法在调用实现之前必须做一些工作(使用提供的依赖项(。为了测试这种行为,我要么必须在每个实现中编写测试(可以有很多实现(,要么通过抽象类测试一次。我最终使用了第一个解决方案:创建一个匿名内部类作为抽象类的实现。谢谢。

最新更新