У меня есть простая функция «сохранения», которая использует akka-stream-alpakka
multipartUpload
, это выглядит так:
def save(fileName: String): Future[AWSLocation] = {
val uuid: String = s"${UUID.randomUUID()}"
val s3Sink: Sink[ByteString, Future[MultipartUploadResult]] = s3Client.multipartUpload(s"$bucketName", s"$uuid/$fileName")
val file = Paths.get(s"/tmp/$fileName")
FileIO.fromPath(file).runWith(s3Sink).map(res => {
AWSLocation(uuid, fileName, res.key)
}).recover {
case ex: S3Exception =>
logger.error("Upload to S3 failed with s3 exception", ex)
throw ex
case ex: Throwable =>
logger.error("Upload to S3 failed with an unknown exception", ex)
throw ex
}
}
Я хочу проверить эту функцию, 2 случая:
- , что multipartUpload успешно выполнено, и я получаю AWSLocation (мой класс case) обратно.
- , что multipartUpload завершается неудачно, и я получаю S3Exception
, поэтому я подумал, чтобы шпионить за multipartUpload и вернуть свойсобственная раковина, как это:
val mockAmazonS3ProxyService: S3ClientProxy = mock[S3ClientProxy]
val s3serviceMock: S3Service = mock[S3Service]
override val fakeApplication: Application = GuiceApplicationBuilder()
.overrides(bind[S3ClientProxy].toInstance(mockAmazonS3ProxyService))
.router(Router.empty).build()
"test" in {
when(mockAmazonS3ProxyService.multipartUpload(anyString(), anyString())) thenReturn Sink(ByteString.empty, Future.successful(MultipartUploadResult(Uri(""),"","myKey123","",Some(""))))
val res = s3serviceMock.save("someFileName").futureValue
res.key shouldBe "myKey123"
}
проблема в том, что я получаю Error:(47, 93) akka.stream.scaladsl.Sink.type does not take parameters
, я понимаю, что не могу создать раковину, как это, но как я могу?или что может быть лучше проверить это?