#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? Можете ли вы, пожалуйста, предложить какой-либо упрощенный пример для достижения этого?