【问题标题】:Spock mock repository findAll always return nullSpock 模拟存储库 findAll 总是返回 null
【发布时间】:2021-05-04 06:12:08
【问题描述】:

[服务]

@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]
    }
}

你知道我嘲笑了返回 [record] 的 findAllById() 方法

但它总是返回 null。

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

我的代码有问题吗?

谢谢。

【问题讨论】:

    标签: spring-boot spock


    【解决方案1】:

    这是因为:

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

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

    recordRepository.findAllById(recordsMap.keySet());
    

    因为recordsMap.keySet() 返回Set 而不是List。改变它:

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

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

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

    【讨论】:

    • 你的意思是这是因为调用参数的类型不正确造成的问题吗? (recordRepository.findAllById(---HERE---); in RecordService
    • 是的,将测试中的 findAllById(_ as List) 更改为 findAllById(_ as Set) 应该可以解决这个问题。
    • 已解决。谢谢!!
    • 很高兴它对你有所帮助 ;-)
    猜你喜欢
    • 2021-12-08
    • 1970-01-01
    • 2021-05-08
    • 1970-01-01
    • 2019-08-22
    • 1970-01-01
    • 1970-01-01
    • 2019-08-30
    相关资源
    最近更新 更多