jUnit,Mockito。如何确保抽象类(模板方法)中的方法调用抽象钩子方法?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了jUnit,Mockito。如何确保抽象类(模板方法)中的方法调用抽象钩子方法?相关的知识,希望对你有一定的参考价值。

我来啦:

abstract class IdentifiedEntity<E extends IdentifiedEntity> implements Cloneable {
  ...
  public void updateWith(E that) {
    if (this != that) {
      if (that.isNew()) {
        throw new IllegalArgumentException("Cannot update with a new entity");
      }
      if (this.isNew()) {
        throw new IllegalStateException("Cannot update a new entity");
      }
      if (this.getId() != that.getId()) {
        throw new IllegalArgumentException("IDs do not match");
      }
      doUpdateWith(that);
    }
  }

  abstract void doUpdateWith(E that);
  ...
}

public final class User extends IdentifiedEntity<User> {
  ...
  @Override
  void doUpdateWith(User that) {
    assert that != null;
    this.name = that.name;
    this.email = that.email;
    System.arraycopy(that.password, 0, password, 0, password.length);
    this.enabled = that.enabled;
    this.caloriesPerDayLimit = that.caloriesPerDayLimit;
  }
  ...
}

问题是我怎样才能对qazxsw poi进行单元测试,以确保它确实调用了后代中所包含的抽象qazxsw poi(是的,当然,如果我支持检查)?

那你们!

答案

创建一个虚拟子类

updateWith(...)

然后像这样测试:

doUpdateWith(...)

然而,这样的测试非常特殊。它不允许您更改方法的实现。

另一答案

在@CoronA的帮助下,我找到了答案。这里是:

class ConcreteEntity extends IdentifiedEntity<ConcreteEntity> {
  @Override
  void doUpdateWith(ConcreteEntity that) {
  }
}

非常感谢你们!

以上是关于jUnit,Mockito。如何确保抽象类(模板方法)中的方法调用抽象钩子方法?的主要内容,如果未能解决你的问题,请参考以下文章

如何为 Rest 模板编写 Mockito Junit 测试用例?

测试类时,使用 Junit 和 Mockito 检查方法内部的工作

何时使用 Mockito.verify()?

使用 JUnit 和 Mockito 对 DAO 类进行单元测试

我们可以使用Mockito和PowerMock出售junit测试类

java抽象类怎么写单元测试