最近我已经开始对我的应用程序进行单元测试,并且在我的一个课程中发现自己处于一个很难设计的位置。
我有一个连接数据库的存储库类,看起来有点像这样。
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原则。
那么..解决这个设计问题的任何想法?我想这是一个常见的问题,因为系统中有独特的电子邮件是非常标准的。
谢谢!
答案 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方法。