Задайте системные свойства для теста 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.