Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.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 我如何像Mockito一样实现它?_Java_Spring_Architecture_Aop_Aspect - Fatal编程技术网

Java 我如何像Mockito一样实现它?

Java 我如何像Mockito一样实现它?,java,spring,architecture,aop,aspect,Java,Spring,Architecture,Aop,Aspect,我目前正在从事一个管理预订系统的项目。 有一个新的要求,即能够跟踪所有预订状态的更改。 我希望这不会影响现有的逻辑,并作为一个独立的模块存在 起初我想到了AOP,但也有一些问题。 此请求应记录哪些操作如何更改了哪些数据 我认为我可以通过将AOP应用于存储库的save方法来提取不同的数据。 但是,这是不可能的,因为有许多不同的操作更新数据 例如,对于保留,使用存储库中的save方法进行更新,但此方法用于各种操作,如签入、签出等。 因此,可以获得数据的差异,但无法判断数据更新的操作 @服务 公共类预

我目前正在从事一个管理预订系统的项目。
有一个新的要求,即能够跟踪所有预订状态的更改。
我希望这不会影响现有的逻辑,并作为一个独立的模块存在

起初我想到了AOP,但也有一些问题。
此请求应记录哪些操作如何更改了哪些数据

我认为我可以通过将AOP应用于存储库的save方法来提取不同的数据。
但是,这是不可能的,因为有许多不同的操作更新数据

例如,对于保留,使用存储库中的save方法进行更新,但此方法用于各种操作,如签入、签出等。
因此,可以获得数据的差异,但无法判断数据更新的操作

@服务
公共类预订服务{
@自动连线
私人预订存储库预订存储库;
公共预订创建(预订预订){
返回bookingRepository.save(预订);
}
公共作废更新(预订){
Booking oldBooking=bookingRepository.findById(Booking.getId()).orelsetrow(()->新运行时异常(“未找到实体”);
更新(预订);
bookingRepository.save(旧预订);
}
公共无效签入(长id){
Booking Booking=bookingRepository.findById(id).orelsetrow(()->新运行时异常(“未找到实体”);
booking.setStatus(booking.Status.CheckIn);
bookingRepository.保存(预订);
}
}
由于我使用AOP,我不希望现有逻辑的参数或结果值符合某种形式

在考虑如何解决这一问题时,不妨使用Mockito使用的方法。
在Mockito中,我们可以知道方法何时在方法中执行

例如,难道不可能创建这样一个方法吗

@方面
公共类图书历史{
@自动连线
私人预订存储库预订存储库;
@关于(“执行(**Service.update(..)”)
公共void更新(ProceedingJoinPoint ProceedingJoinPoint){
长id=getBookingId(proceedingJoinPoint);
预订来源=getBooking(id);
最终DiffData DiffData;
当(bookingRepository::save)。然后返回(结果->diffData=diff(来源,结果));
保存历史记录(“更新”、“预订”、数据);
}
}
但我不知道如何在Mockito中实现“when”、“thenReturn”等

我能得到一些实现Mockito的提示吗


如果不是这样,还有其他好方法吗?

Mockito是一个测试框架,应该只用于单元测试。如果您想跟踪使用Spring的AOP更改数据的方法,可以使用自定义注释。使用自定义批注,您只需传递标识操作的值,并对其执行任何操作,例如:记录它、将其发布到MQ进行分析等。请尝试以下创建自定义批注以及如何获取方法的调用方信息。

您使用的是什么持久性?JPA?普通JDBC?或者…Spring数据JPA。假设您正在使用Hibernate,只需使用Hibernate Envers。这是一种开箱即用的方式,或者如果你想要别的东西,你也可以使用JaVers。你不需要自己动手。如果所有其他操作都失败,您甚至可以通过数据库上的触发器将原始数据复制到审核表中。如果你想的话,不需要用java来做,这根本不是AOP的工作方式。如果您想影响
save
的返回值,只需编写一个带有切入点的通知,截取它的执行,在那里进行差异处理并保存到审核日志。如果你想发布一个完整的,我可以在本地运行它,并提出一个具体的建议如何做到这一点。您目前正在隐藏信息,例如
getBookingId(proceedingJoinPoint)
做什么,
Booking
类看起来是什么样子等等。但据我所见,如果您不喜欢Javers,您可以使用AOP轻松解决问题。