在模拟抽象 class 中注入模拟

Inject mocks in mocked abstract class

我有一个摘要class,其中包含具体方法中的逻辑:

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);
}

探索测试我的摘要的解决方案class:

我选择了 Mockito 解决方案,因为它又快又短(尤其是当抽象 class 包含大量抽象方法时)。

@ExtendWith(MockitoExtension.class)
class AbstractEventHandlerTests {

  @Mock
  private Dependency dependency;

  @InjectMocks
  @Mock(answer = Answers.CALLS_REAL_METHODS)
  private AbstractEventHandler abstractEventHandler;

由于 @InjectMocks 不允许在已经用 @Mock 注释的字段上使用,我如何在我的摘要 class 中注入模拟依赖项?

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