Spock 模拟存储库 findAll 总是 return null

Spock mock repository findAll always return null

[服务]

@Service
@RequiredArgsConstructor
public class RecordService {
    private final RecordRepository recordRepository;


    @Transactional
    public void bulkUpdateRecord(BulkUpdateRecordRequest[] requestDto) {
        Map<Long, BulkUpdateRecordRequest> recordsMap = Arrays.stream(requestDto)
                .collect(Collectors.toMap(BulkUpdateRecordRequest::getId, record -> record));
        List<Record> records = recordRepository.findAllById(recordsMap.keySet());
        System.out.println("records = " + records);
    }
}

[存储库]

public interface RecordRepository extends JpaRepository<Record, Long>, RecordCustomRepository {
}

[测试代码]

class RecordServiceTest extends Specification {

    RecordRepository recordMockRepo = Mock()
    RecordService recordService = new RecordService(recordMockRepo)

    def "bulkUpdateRecord"() {
        given:
        def request = new BulkUpdateRecordRequest()
        request.setId(1)
        request.setCount(20)
        request.setWeight(100)
        request.setWeightType(WeightType.KG)
        def record = Record.builder()
                .id(1L)
                .weightType(request.getWeightType())
                .weight(request.getWeight())
                .count(request.getCount())
                .recordType(RecordType.PERSONAL)
                .exerciseName("deadlift")
                .exerciseType(ExerciseType.BACK)
                .build()

        when:
        recordService.bulkUpdateRecord(request)

        then:
        recordMockRepo.findAllById(_ as List) >> [record]
    }
}

你知道我嘲笑了 findAllById() 方法 return [记录]

但它总是return null。

但是,查找单个实体的方法(如 findBy~())不会出现此问题。

我的代码有问题吗?

谢谢。

是因为:

recordMockRepo.findAllById(_ as List) >> [record]

... 与 RecordService 中的调用不匹配 class:

recordRepository.findAllById(recordsMap.keySet());

因为 recordsMap.keySet() returns Set 而不是 List。更改为:

recordMockRepo.findAllById(_ as Set) >> [record]

当你有没有调用计数检查的模拟指令时,最好将它放在 given 部分,因为它不测试任何东西并且不属于 then 部分。或者您可以像这样添加调用计数测试:

1 * recordMockRepo.findAllById(_ as Set) >> [record]