我正在为SystemLoggingService
编写单元测试并模拟对其存储库的所有调用。
我正在使用Spring
和JPA
存储库。
@Repository
public interface SystemLoggingRepository extends PagingAndSortingRepository<SystemLogEntity, Long>, JpaSpecificationExecutor<SystemLogEntity> {
}
对于服务方法findAll(Searchable searchable,Pageable pageable)
的单元测试,我需要模拟存储库方法findAll(Specification<T> spec, Pageable pageable)
正如人们所见,Searchable
对象被转换为服务逻辑中的JPA Specifications
对象。
问题是我的服务逻辑将传递给存储库方法的JPA Specifications
类没有实现equals()
。
换句话说,我不能非常精确地模拟存储库方法,因为我必须使用Matchers.any(Specifications.class)
BDDMockito.given(systemLoggingRepository.findAll(Matchers.any(Specifications.class), Matchers.eq(pageRequest))).willReturn(...)
这对于单元测试的质量有多糟糕,还是这种常见做法?对这个问题有什么不同的解决方法?
Specifications
对象是Spring框架类。不能只添加equals()
方法。
答案 0 :(得分:3)
您可以尝试使用以下方式捕获规格:
ArgumentCaptor<Specifications> specificationsCaptor = ArgumentCaptor.forClass(Specifications.class);
BDDMockito.given(systemLoggingRepository.findAll(specificationsCaptor.capture(), Matchers.eq(pageRequest))).willReturn(...)
然后验证捕获的值:
Specifications capturedSpecifications = specificationsCaptor.getValue();
assertThat(capturedSpecifications.getSomeProperty(), ... )
您可以在此处找到更多信息:accessor function
答案 1 :(得分:2)
除了@VolodymyrPasechnyk的答案之外,你可能会想到将创建Specifications
对象的责任提取到一个单独的类,这个类将是你的CUT的另一个依赖。