测试使用同一个类

时间:2018-01-09 16:32:35

标签: java unit-testing mockito

最近我已经开始对我的应用程序进行单元测试,并且在我的一个课程中发现自己处于一个很难设计的位置。

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

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方法。

所以我的第一个想法是在Repository方法中注入一个register而不是假的,但这似乎有点奇怪,因为我提供了一个类是一个类的方法本身。

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

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

谢谢!

1 个答案:

答案 0 :(得分:1)

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

// 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方法。