Задайте системные свойства для теста JUnit, прежде чем ServletContextListener использует путь к файлу из web.xml

Я модифицирую и старый проект, который использует Spring 3.1.4.

Я пытаюсь использовать StartupListener для настройки Logback:

public class LoggingStartupListener implements ServletContextListener {

    private static final Logger LOGGER = LoggerFactory.getLogger(LoggingStartupListener.class.getName());


@Override
public void contextInitialized(final ServletContextEvent sce) {
    final LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory();
    context.reset();
    final JoranConfigurator configurator = new JoranConfigurator();
    final ServletContext servletContext = sce.getServletContext();
    final StringBuilder filePath = new StringBuilder(100);
    filePath.append(servletContext.getRealPath("/"));
    filePath.append(servletContext.getInitParameter("logFileName"));
    InputStream configStream = null;
    try {
        configStream = FileUtils.openInputStream(new File(filePath.toString()));

...

Это чтение пути к файлу из web.xml:

<context-param>
    <param-name>logFileName</param-name>
    <param-value>/WEB-INF/config/${spring.profiles.active}/logback.xml</param-value>
</context-param>

Теперь, когда я запускаю тест JUnit, я всегда сталкиваюсь с исключением:

java.io.FileNotFoundException: File '/var/folders/v7/1r3m8y8j487dqj7vmvb4n4kxcw70fj/T/tomcat-embedded-77438108580291256392.tmp/webapps/myproject/WEB-INF/config/${spring.profiles.active}/logback.xml' does not exist
at org.apache.commons.io.FileUtils.openInputStream(FileUtils.java:136)

Это означает, что свойство spring.profiles.active никогда не разрешается.

Я перепробовал все виды вещей:

1) Я пытался установить свойство перед тестом:

@BeforeClass
public static void setSystemProperty() {
    System.out.println("---------------------BeforeClass--------------------");
    AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
    ctx.getEnvironment().setActiveProfiles("local");
    ctx.refresh();

    System.setProperty("spring.profiles.active", "local");
}

Но это не сработало, потому что этот метод вызывается после того, как выдается ошибка. ("----------BeforeClass--------------" появляется много после ошибки в журнале.)

2) Я попробовал использовать аннотацию перед тестовым классом:

@ActiveProfiles(profiles = "local")

3) Я попытался установить свойство с помощью файла spring-test.properties:

spring.profile.active=local

и включите его в тестовый контекст:

<context:property-placeholder location="classpath:spring-test.properties"/>

-> никакого эффекта вообще

4) Я даже пытался установить свойство непосредственно в ServletContextListener:

@Override
public void contextInitialized(final ServletContextEvent sce) {
    System.setProperty("spring.profiles.active", "local");
    ...

И это действительно удивило меня, потому что это должно было сработать, не так ли?

Я сталкиваюсь с этими проблемами, потому что я использую старую версию Spring? У меня никогда не было этих проблем в других проектах с более высокими версиями Spring. Или чего мне не хватает?

Могу ли я настроить слушателя на запуск позже? Или я могу настроить модульные тесты для установки системного свойства до запуска ServletContextListener?

Или будет лучше инициализировать logback другим способом, чтобы избежать этих проблем - но почему тогда они не появляются в других проектах?

Я нашел это, но я не знаю, относится ли это к моему случаю: Spring-test и ServletContextListener в web.xml

В нем говорится, что нет способа настроить ServletContextListener с помощью Spring MVC Test. Он говорит, что я могу попытаться перезаписать контекстный параметр с

wac.getServletContext().setInitParameter(name, value);

Но я не знаю, когда и где это сделать, потому что web.xml явно читается до инициализации тестовых классов.

Большое спасибо заранее за любой намек

1 ответ

Я использовал расширение пружины logback вместо нашей собственной реализации, и с этим проблема исчезла!

Я использовал эту документацию: https://github.com/qos-ch/logback-extensions/wiki/Spring

Одна из функций: - "Укажите местоположение logback.xml, используя путь к ресурсам Spring и заполнители системных свойств".

Именно то, что мне было нужно. Я использовал logback-ext-spring с версией 0.1.4.

Другие вопросы по тегам