SPOCK: Как издеваться над поведением поставщиков - PullRequest
2 голосов
/ 10 апреля 2019

Я пытаюсь охватить позитивный негативный сценарий при выполнении supplier внутри CompletableFuture. По какой-то причине проверенные значения не передаются в пределах supplier. Мои модульные тесты написаны с использованием фреймворка спока, и, поскольку я не очень знаком с этим фреймворком, я не уверен, что я ошибаюсь во время дразнить или что-то с дразнителем поставщика, которого мне не хватает.

Проверяемый код:

CompletableFuture
    .supplyAsync(() -> s3Service.upload(bucket, key, file), executor)
    .handle(((putObjectResult, throwable) -> {
        if (throwable != null) {
            CustomRuntimeException exception = (CustomRuntimeException) throwable;
            log.error(exception);
        }
        return putObjectResult;
    }))
    .thenAccept(putObjectResult -> {
        if (putObjectResult != null) {
             FileUtils.deleteQuietly(file);
             log.debug("Deleted file {}", file.getName());
        }
    });

Код проверки Спока:

@SpringBean
private S3Service s3service = Mock()

def "failed to upload article into s3"() {
    given: "mock the s3 service to throw CustomRuntimeException"
    s3Service.upload(_, _, _) >> {

        CompletableFuture<PutObjectResult> exception = new CompletableFuture<>();
        exception.completeExceptionally(new CustomRuntimeException())
        exception.exceptionally(new Function<Throwable, PutObjectResult>() {
            @Override
            PutObjectResult apply(Throwable throwable) {
                throw new CompletionException(throwable)
            }
        })

    }

Теперь, когда я отлаживаю примеры модульных тестов, экземпляр throwable в .handle всегда равен null. То же самое происходит, когда я высмеиваю PutObjectResult

1 Ответ

0 голосов
/ 01 мая 2019

Так что, похоже, мое понимание данных и когда отличается от того, что у Mockito Framework.Я положил, что мой s3Service.upload(_, _, _) в разделе then и текстовые случаи работает, как ожидалось.Итоговый код:

@SpringBean
private S3Service s3service = Mock()

def "failed to upload article into s3"() {
    given: "mock the s3 service to throw CustomRuntimeException"
    // given conditions
    when: "check here the with the actual beans"
    // actual bean calls
    then: "mention your mocks and calls"
    1 * s3Service.upload(_, _, _) >> {

        CompletableFuture<PutObjectResult> exception = new CompletableFuture<>();
        exception.completeExceptionally(new CustomRuntimeException())
        exception.exceptionally(new Function<Throwable, PutObjectResult>() {
            @Override
            PutObjectResult apply(Throwable throwable) {
                throw new CompletionException(throwable)
            }
        })

    }
...