如何使用不实现`equals`的参数模拟方法调用?

时间:2017-08-28 12:52:37

标签: java spring unit-testing mockito spring-data-jpa

我正在为SystemLoggingService编写单元测试并模拟对其存储库的所有调用。 我正在使用SpringJPA存储库。

@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()方法。

2 个答案:

答案 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的另一个依赖