Groovy 捕捉参数并在测试的其他部分使用它们

Groovy 捕捉参数并在测试的其他部分使用它们,groovy,spock,Groovy,Spock,所以我想捕获传递到mock中的参数并设置它们,以便测试中的其他东西可以使用它们 class FileServiceSpec extends Specification { @Shared FileEntity originalFileUploadEntity def fileRepository = Mock(FileRepository) def fileStorageClient = Mock(FileStorageClient) def fileConverter

所以我想捕获传递到mock中的参数并设置它们,以便测试中的其他东西可以使用它们

class FileServiceSpec extends Specification {

  @Shared
  FileEntity originalFileUploadEntity

  def fileRepository = Mock(FileRepository)
  def fileStorageClient = Mock(FileStorageClient)
  def fileConverter = Mock(FileConverter)
  def fileMapper = new FileMapperImpl()
  def fileService = new FileService(fileRepository, fileStorageClient, fileConverter, fileMapper)

      def"upload offline canvas file requires conversion"(){
    given: " a file that requires conversions"
    def file = fileUploadRequest("test.pptx")
    def content = "dGVzdCBmaWxl"
    def taskId = "100"

    FileEntity convertedFileUploadEntity
    FileEntity originalFileUploadEntity

    when:
    def resp = fileService.uploadOfflineCanvasUploadAndConvertedUpload(file, content, taskId);

    then:
    1 * fileConverter.convertPptxToPdf(*_) >> Base64.getDecoder().decode("convertedpdfcontent");

    //the converted file is uploaded
    1 * fileStorageClient.uploadFile(_, Base64.getDecoder().decode("convertedpdfcontent" )) >> {args ->
      convertedFileUploadEntity = FileEntity.class.cast(args[0])
      assert FileEntity.class.cast(args[0]).fileName == "test.pdf"
      assert FileEntity.class.cast(args[0]).entityName == "offline-canvas-converted-upload"
    };
    //the original file is uploaded
    1 * fileStorageClient.uploadFile(_, Base64.getDecoder().decode(content )) >> {args ->
      originalFileUploadEntity = FileEntity.class.cast(args[0])
      assert FileEntity.class.cast(args[0]).fileName == "test.pptx"
      assert FileEntity.class.cast(args[0]).entityName == "offline-canvas-upload"
    };
  }

如您所见,我能够捕获参数并设置其值,如以下所示:originalFileUploadEntity=FileEntity.class.cast(args[0])。但是,一旦我退出lambda,该值将再次变为null,因此在第一个方法捕获中,我设置了它,并且在调试时可以看到它,但是在第二个方法参数捕获中,我在第一个方法捕获中设置的属性现在为null,这样它必须工作:

def "upload offline canvas file requires conversion"() {
    given: " a file that requires conversions"
    def file = fileUploadRequest("test.pptx")
    def content = "dGVzdCBmaWxl"
    def taskId = "100"

    def expectedDecodedContent = Base64.getDecoder().decode("convertedpdfcontent")
    FileEntity convertedFileUploadEntity = null
    FileEntity originalFileUploadEntity = null

    when:
    def resp = fileService.uploadOfflineCanvasUploadAndConvertedUpload(file, content, taskId);

    then:
    1 * fileConverter.convertPptxToPdf(*_) >> expectedDecodedContent;

    1 * fileStorageClient.uploadFile(_, expectedDecodedContent) >> { convertedFileUploadEntity = it[0] as FileEntity }
    convertedFileUploadEntity.fileName == "test.pdf"
    convertedFileUploadEntity.entityName == "offline-canvas-converted-upload"

    1 * fileStorageClient.uploadFile(_, Base64.getDecoder().decode(content)) >> { originalFileUploadEntity = it[0] as FileEntity }
    originalFileUploadEntity.fileName == "test.pptx"
    originalFileUploadEntity.entityName == "offline-canvas-upload"
}
如果
uploadFile
方法返回
FileEntity
实例,那么它在您的案例中不起作用,因为您不从闭包返回它,而是执行断言

在本例中,闭包返回值
convertedFileUploadEntity

1 * fileStorageClient.uploadFile(_, expectedDecodedContent) >> { 
    convertedFileUploadEntity = it[0] as FileEntity 
}
因为它与:

1 * fileStorageClient.uploadFile(_, expectedDecodedContent) >> {
    convertedFileUploadEntity = it[0] as FileEntity
    return convertedFileUploadEntity 
}
但在本例中,闭包不会返回它:

1 * fileStorageClient.uploadFile(_, expectedDecodedContent) >> { 
    convertedFileUploadEntity = it[0] as FileEntity
    assert convertedFileUploadEntity.fileName == "test.pdf" 
}