繁体   English   中英

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

[英]Inject mocks in mocked abstract 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);
}

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

  • 创建抽象类的虚拟实现(构造函数的好处是模拟抽象类并使用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;

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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