Java 8 Function - функция-обертка, которая что-то делает перед выполнением данной лямбды? - PullRequest
0 голосов
/ 22 января 2019

У нас есть следующий сценарий:

Mid-test, некоторые контекстные переменные должны быть обновлены. Где именно в тесте и что именно должно произойти, является переменной. Я хотел бы предоставить функцию-обертку, которая устанавливает некоторые переменные контекста и затем выполняет все утверждения, которые были даны ей в вызове функции.

Итак, что-то вроде следующего:

public void withDefaultContextA(Function<???, Void> noArgsCall) {

    setupDefaultContextA();
    noArgsCall.invoke() // not sure how apply() would be invoked here
}

или

public void withContextA(BiFunction<???, Context, Void> providedContextCall) {

    setupContext(providedContext); // not sure how apply() would be invoked here
}

И в соответствующем тесте они должны вызываться следующим образом:

@Test
public void testSomething() {

    withDefaultContextA(() -> {
        ... // do some asserts
    }

    withContext((new Context(...)) -> {
        ... // do some asserts
    }
}

Как мне этого добиться? Можно ли использовать функции Java 8 таким образом? Если нет, то есть ли другой способ добиться этого?

1 Ответ

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

Кажется, вы хотите украсить любой Runnable (вы используете Function и BiFunction в своем вопросе, но поскольку они возвращают Void и, кажется, не получают аргументов, используя Runnable здесь кажется более уместным).

Вы можете сделать это следующим образом:

public static void withDefaultContext(Runnable original) {
    setupDefaultContextA();
    original.run();
}

Тогда вы можете использовать описанный выше метод следующим образом:

withDefaultContext(() -> {
    // do some asserts
});

Или с определенным контекстом:

public static void withContext(Context context, Runnable original) {
    setupContext(context);
    original.run();
}

Использование:

withContext(new Context(...), () -> {
    // do some asserts
});
...