在模拟的抽象类中注入模拟

时间:2019-04-18 10:30:40

标签: java mockito junit5

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

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

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

  • 创建抽象类的虚拟实现(对构造函数Mocking an abstract class and injecting classes with Mockito annotations?来说很重要)
  • 在具体的类中测试handleEvent(event)逻辑,但是我必须在每个具体的类中重复测试(或一次,但是在哪个类中?)
  • 使用PowerMock ...
  • 使用Mockito实例化抽象类的实现并调用实际方法以测试具体方法中的逻辑

我选择了Mockito解决方案,因为它既快捷又简短(特别是如果抽象类包含很多抽象方法的话)。

@ExtendWith(MockitoExtension.class)
class AbstractEventHandlerTests {

  @Mock
  private Dependency dependency;

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

既然在已经用@InjectMocks注释的字段上不允许使用@Mock,那么如何在我的抽象类中注入模拟的依赖项?

1 个答案:

答案 0 :(得分:0)

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