测试使用同一类中的另一个方法的方法



>最近,我开始对我的应用程序进行单元测试,并发现自己在设计方面遇到了一些困难。

我有一个连接到数据库的存储库类,它看起来有点像这样。

public interface Repository {
  ...
  void register(Account account)
  Account find(String email)
  ...
}

在实现中这样做:

public class RepositoryImpl implements Repository {
  ...
  public void register(Account account) {
    if (find(account.getEmail() != null) return;
    // Account with same email already exists.
    ...
  }
}

这在实时设置中工作正常,但是当单元测试时,情况就不同了。

我使用 Mockito 来模拟我的依赖项,但我似乎无法模拟实现类中的 find 方法。

所以我的第一个想法是在register方法中注入一个Repository,我可以伪造,但这似乎有点奇怪,因为我提供了一个带有它本身成员的类的方法。

之后,我想只是将find逻辑复制到register方法,但这违反了 DRY 原则。

那么..关于解决这个设计问题有什么想法吗?我想这是一个常见问题,因为在系统中拥有独特的电子邮件是非常标准的。

谢谢!

如果你想模拟被测类的方法,你需要监视它,而不是使用具体的实现:

// arrange
Account acc = new Account();
RepositoryImpl repoSpy = Mockito.spy(new RepositoryImpl());
doReturn(acc).when(repoSpy).find(Mockito.any(String.class));
//act
repoSpy.register(acc);
// assert ..

多亏了这一点,将使用寄存器实现,并且 find 方法将被模拟到您喜欢的位置。

相关内容

  • 没有找到相关文章

最新更新