Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/rest/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 测试使用同一类中的另一个方法的方法_Java_Unit Testing_Mockito - Fatal编程技术网

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

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 {

最近,我开始对我的应用程序进行单元测试,在我的一门课程中,我发现自己在设计方面有点困难

我有一个连接到数据库的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的构造函数(请参阅)。你可以模拟这个界面。毕竟,您希望测试类的功能,而不是模拟技能。此外,太多的嘲笑会导致脆弱的测试。是的,我也注意到了这一点。对类的工作方式做了一些更改,包括注入一个新的接口,这导致了更小更简单的测试(我认为这在测试中非常重要)。