如何像mockito一样实现它?

o2g1uqev  于 2021-07-13  发布在  Java
关注(0)|答案(1)|浏览(269)

我目前正在做一个项目来管理预订系统。
有一个新的要求,那就是能够跟踪所有预订状态的变化。
我希望这不会影响现有的逻辑,并作为一个独立的模块存在。
一开始我想到aop,但是有一些问题。
这个请求应该记录哪些数据是如何被什么操作更改的。
我认为我可以通过将aop应用到存储库的save方法来提取不同的数据。
但是,这是不可能的,因为有许多不同的操作更新数据。
例如,对于保留,使用存储库中的save方法进行更新,但此方法用于各种操作,如签入、 checkout 等。。
因此,可以获得数据中的差异,但无法判断更新了数据的操作。

@Service
public class BookingService {
    @Autowired
    private BookingRepository bookingRepository;

    public Booking create(Booking booking) {
        return bookingRepository.save(booking);
    }

    public void update(Booking booking) {
        Booking oldBooking = bookingRepository.findById(booking.getId()).orElseThrow(() -> new RuntimeException("Entity not found"));
        oldBooking.update(booking);

        bookingRepository.save(oldBooking);
    }

    public void checkIn(long id) {
        Booking booking = bookingRepository.findById(id).orElseThrow(() -> new RuntimeException("Entity not found"));

        booking.setStatus(Booking.Status.CheckIn);

        bookingRepository.save(booking);
    }
}

由于我使用aop,我不希望现有逻辑的参数或结果值符合某种形式。
在考虑如何解决这个问题的同时,如何使用mockito使用的方法呢。
在mockito中,我们可以知道一个方法何时在一个方法中执行。
例如,难道不可能创建这样一个方法吗?

@Aspect
public class BookingHistory {
    @Autowired
    private BookingRepository bookingRepository;

    @Around("execution(* *Service.update(..))")
    public void update(ProceedingJoinPoint proceedingJoinPoint) {
        long id = getBookingId(proceedingJoinPoint);
        Booking origin = getBooking(id);

        final DiffData diffData;
        when(bookingRepository::save).thenReturn(result -> diffData = diff(origin, result));
        saveHistory("UPDATE", "Booking", diffData);
    }
}

但是我不知道如何在mockito中实现“when”、“thenreturn”等。
我能得到一些实现mockito的提示吗?
如果不是这样,还有别的好办法吗?

e4eetjau

e4eetjau1#

mockito是一个测试框架,应该只用于单元测试。如果要跟踪哪个方法使用spring的aop更改了数据,可以使用自定义注解。使用自定义注解,您只需传递标识该操作的值,并执行任何您想执行的操作,例如:记录该操作、将其发布到mq以进行分析等。请尝试以下有关创建自定义注解的文章以及有关如何获取方法调用方信息的文章。

相关问题