Java 如何模拟bean的某些方法调用,但在同一测试类中的其他方法调用中使用已定义的bean?

Java 如何模拟bean的某些方法调用,但在同一测试类中的其他方法调用中使用已定义的bean?,java,spring,unit-testing,junit,mockito,Java,Spring,Unit Testing,Junit,Mockito,我正在尝试在TestConfiguration中测试具有指定实现的服务接口。服务接口被注入DAO接口,该接口在TestConfiguration中也有一个指定的实现。服务的实现被定义为将在生产中的实际服务,而测试DAO是接口的新自定义实现 在95%的情况下,我希望使用测试DAO实现。然而,在一些测试中,我希望覆盖DAO的功能。由于要覆盖DAO的实例太少,我只想在条件基础上使用Mockito进行模拟,而不创建DAO接口的另一个实现(对于从DAO返回空列表这样的边缘情况)。理想情况下,它们将位于专用

我正在尝试在TestConfiguration中测试具有指定实现的服务接口。服务接口被注入DAO接口,该接口在TestConfiguration中也有一个指定的实现。服务的实现被定义为将在生产中的实际服务,而测试DAO是接口的新自定义实现

在95%的情况下,我希望使用测试DAO实现。然而,在一些测试中,我希望覆盖DAO的功能。由于要覆盖DAO的实例太少,我只想在条件基础上使用Mockito进行模拟,而不创建DAO接口的另一个实现(对于从DAO返回空列表这样的边缘情况)。理想情况下,它们将位于专用于测试服务的同一类中

我已经尝试在测试类的daobean上使用@Spy注释。我已经尝试在daobean上使用@MockBean。我已经尝试使用Mockito的doReturn和when功能覆盖DAO的默认实现,但是,我总是从TestConfiguration中定义的测试DAO实现返回结果

我确实改变了我正在做的文本,因为它是公司代码,但这正是我试图做的其他事情

我的TestConfiguration定义如下

@TestConfiguration
公共类测试配置{
@豆子
公共人员服务{
返回新的PersonServiceImpl(personDao());
}  
@豆子
公众人物{
返回新的TestPersonDaoImpl();
}
}
我的服务实现如下

公共类PersonService Impl实现PersonService{
私有记录器Logger=LoggerFactory.getLogger(PersonServiceImpl.class);
私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人;
公共人员服务MPL(PersonDao PersonDao){
this.personDao=personDao;
}
@凌驾
公共列表getAllPersons(){
return personDao.findAll().stream()
.map(person->PersonDtoFactory.getPersonDto(person))
.collect(Collectors.toList());
}
@凌驾
public PersonDto getPersonById(长id){
返回PersonDtoFactory.getPersonDto(personDao.findById(id));
}
}
我的测试DAO实现如下

公共类TestPersonDaoImpl实现PersonDao{
@凌驾
公共列表findAll(){
返回getPersons();
}
@凌驾
公共列表findById(id){
返回getPersons().stream()
.filter(person->person.getId()==id)
.collect(Collectors.toList());
}
私人名单{
List personList=新建ArrayList();
添加(新的PersonModel(1L,“Susan”);
添加(新的PersonModel(2L,“Jerry”);
添加(新的PersonModel(3L,“Tom”);
回归人格;
}
}
最后是我的服务测试课

@RunWith(SpringRunner.class)
@导入(TestAppConfiguration.class)
公共类人员服务测试{
//我们不会在此测试类中测试web套接字功能。
@自动连线
私人私人服务;
@MockBean//仅当在测试中指定时,才希望在测试中覆盖,否则,请使用默认的TestPersondaImpl bean。
私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人;
@以前
公共作废设置(){
initMocks(this);
}
@试验
公众人士{
断言(personService.getAllTests().size()>0);
}
@试验
public void getPersonById(){
断言(personService.getPersonById(1L.getName().equals(“Susan”));
}
@试验
public void getAllPersons\u NoPersons(){
//模拟DAO调用,因为默认情况下它将拥有所有测试数据
doReturn(newarraylist()).when(personDao.findAll();

//当(personDao.findAll()).thenReturn(newarraylist());使用
@MockBean
时,您将获得一个注入的模拟实例

使用
@Spy
您的dao将不会被注入服务中

您需要
@SpyBean
。在默认情况下,您将获得注入和调用的所有方法