Шпионаж лямбда с мокито - PullRequest
0 голосов
/ 23 января 2019

Я столкнулся с интересной проблемой при написании модульного теста, включающего насмешку над лямбдой.

@Test
public void spyingLambda() {
    final Supplier<String> spy = Mockito.spy((Supplier) () -> "1");
    spy.get();
}

Запуск этого теста завершается ошибкой:

Мокито не может издеваться / шпионить, потому что: - итоговый класс

Одним из способов решения вышеуказанной проблемы является замена лямбды анонимной реализацией:

@Test
public void spyingAnonymousImplementation() {
    final Supplier<String> spy = Mockito.spy(new Supplier<String>() {
        @Override
        public String get() {
            return "1";
        }
    });
    spy.get();
}

Хотя оба теста абсолютно одинаковы (IDE предлагает даже заменить анонимную реализацию лямбда-выражением), второй тест не дает сбоя.

Мне было интересно, если это известная проблема, которая может быть исправлена ​​в mockito или есть какие-то другие обходные пути.

1 Ответ

0 голосов
/ 23 января 2019

Другой способ решения этой проблемы заключается в следующем:

/**
 * This method overcomes the issue with the original Mockito.spy when passing a lambda which fails with an error
 * saying that the passed class is final.
 */
public static <T> T spyLambda(final Class<T> lambdaType, final T lambda) {
    return mock(lambdaType, delegatesTo(lambda));
}

, который позволяет шпионить лямбду, изменяя первый метод следующим образом:

@Test
public void spyingLambda() {
    final Supplier<String> spy = spyLambda(Supplier.class, () -> "1");
    spy.get();
}

Надеемся, приведенные выше примеры могутпомогите другим, кто столкнулся с той же проблемой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...