Java 测试使用同一类中的另一个方法的方法
最近,我开始对我的应用程序进行单元测试,在我的一门课程中,我发现自己在设计方面有点困难 我有一个连接到数据库的repository类,看起来有点像这样Java 测试使用同一类中的另一个方法的方法,java,unit-testing,mockito,Java,Unit Testing,Mockito,最近,我开始对我的应用程序进行单元测试,在我的一门课程中,我发现自己在设计方面有点困难 我有一个连接到数据库的repository类,看起来有点像这样 public interface Repository { ... void register(Account account) Account find(String email) ... } 在实施过程中,以下哪项: public class RepositoryImpl implements Repository {
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
方法中插入存储库
,我可以伪造它,但这似乎有点奇怪,因为我提供了一个方法,其中包含一个类,它本身就是这个类的一员
在那之后,我想把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 ..
多亏了这一点,我们将使用register实现,并且find方法将根据您的喜好进行模拟。谢谢,我不知道spies的情况。我来看看!一般说明:我不会模仿内部方法,而是设置RepositoryImpl类,以便find(account.getEmail())返回所需的值。如果这不可行,请创建一个负责查找帐户的接口,并将其实现传递给RepositoryImpl的构造函数(请参阅)。你可以模拟这个界面。毕竟,您希望测试类的功能,而不是模拟技能。此外,太多的嘲笑会导致脆弱的测试。是的,我也注意到了这一点。对类的工作方式做了一些更改,包括注入一个新的接口,这导致了更小更简单的测试(我认为这在测试中非常重要)。