Как мне запускать каждый из моих тестов Junit 5 как привилегированное действие?

#junit #junit5

#junit #junit5

Вопрос:

Я пишу интеграционные тесты, используя Junit 5. Я должен запускать каждый тест с привилегированным действием (как зарегистрированный пользователь).

Я мог бы достичь этого, вызывая using Subject.doAs из каждого теста следующим образом:

 Subject.doAs(systemSubject, (PrivilegedAction<Object>) () -> actualMethodToBeTested();
  

Но есть ли какой-либо способ добиться этого, используя расширение в Junit 5? Причина в том, чтобы избежать вызова Subject.DOA в каждом методе.

В Junit 4 я мог бы достичь этого с помощью декораторов тестов и бегунов.

Упрощенная версия моего раннера Junit 4:

 
@Override
public void run(RunNotifier notifier) {
        try {
            Object testObject = testClass.newInstance();
            for (Method method : testClass.getMethods()) {
                if (method.isAnnotationPresent(Test.class)) {
                    notifier.fireTestStarted(Description
                            .createTestDescription(testClass, method.getName()));
                    final Subject systemSubject = getSystemSubject();
                    Subject.doAs(systemSubject, (PrivilegedAction<Object>)
                                            () -> {
                                                try {
                                                    return method.invoke(testObject);
                                                } catch (IllegalAccessException e) {
                                                    return null;
                                                } catch (InvocationTargetException e) {
                                                    return null;
                                                }
                                            });

                    notifier.fireTestFinished(Description
                            .createTestDescription(testClass, method.getName()));
                }
            }
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

  

Комментарии:

1. Под actualMethodToBeTested вы имеете в виду метод тестирования или какой-то «производственный» метод, который вызывает тест?

2. Кроме того, можете ли вы поделиться имеющимся у вас раннером JUnit 4?

3. Возможно, вы можете что-то сделать с помощью шаблона теста JUnit — это то, что JUnit5 использовал для создания параметризованных и повторяющихся тестов, то есть выполнения тестов в том же или подобном контексте. Вот ссылка на модель расширения JUnit 5, там есть раздел об этом. junit.org/junit5/docs/current/user-guide/#extensions

4. @Mureinik да, ACTUALMETHOD, который был протестирован, — это производственный метод, для которого написан тест.

5. @Kotse, я использовал ParameterizedTests, когда я хочу запустить один и тот же тест с разными случаями. Но чего я хочу здесь, так это запускать все тесты во всех моих тестовых классах от имени пользователя, вошедшего в систему. т.е. Subject.doAs(mySubject, (PrevilegedAction<Object>) () -> myTestMethod(); Пользовательские прогоны помогли мне в junit 4. Но как я могу добиться того же, используя расширение Junit 5? Можете ли вы, пожалуйста, предложить какой-либо упрощенный пример для достижения этого?