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]
[服务]
@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]