К log4j в теста JUnit в

у меня есть spring bean, у которого есть член logger, и я использую этот logger для регистрации некоторых действий.
Также я написал тестовый случай, который использует SpringJUnit4ClassRunner. Я настроил Log4j с файлом свойств, и в каждом тестовом случае я инициализирую регистратор с этими свойствами:

@BeforeClass
public static void init() {
   PropertyConfigurator.configure("src/com/config/log4j.properties");
}

когда я запускаю тест, он дает мне предупреждение

log4j:WARN No appenders could be found for logger (org.springframework.test.context.junit4.SpringJUnit4ClassRunner).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.

однако регистратор в моем компоненте записывает сообщения в указанное место в log4j.свойства, т. е. он работает нормально. Почему к log4j дает мне такие предупреждения?

3 ответов


Я думаю, причина в этом коде в SpringJUnit4ClassRunner

 public SpringJUnit4ClassRunner(Class<?> clazz) throws InitializationError {
    super(clazz);
    if (logger.isDebugEnabled()) {
        logger.debug("SpringJUnit4ClassRunner constructor called with [" + clazz + "].");
    }
    this.testContextManager = createTestContextManager(clazz);
}

Если вы не хотите видеть предупреждение о log4j, просто сделайте так, как @DN предложил просто добавить log4j.файл свойств в путь к классу приложения, если вы используете Maven directory structure add log4j.файл свойств (src/main / resources), который устранит предупреждение.


Я хотел сохранить мою конфигурацию log4j из пути к классам по умолчанию, чтобы использовать другое ведение журнала с модульными тестами и производством. Я работал вокруг этого путем создания подклассов SpringJUnit4ClassRunner и с помощью статического инициализатора класса.

// The new test runner
public class JUnit4ClassRunner extends SpringJUnit4ClassRunner {

  static {
    try {
      Log4jConfigurer.initLogging( "classpath:test/log4jconfig.xml" );
    }
    catch( FileNotFoundException ex ) {
      System.err.println( "Cannot Initialize log4j" );
    }
  }

  public JUnit4ClassRunner( Class<?> clazz ) throws InitializationError {
    super( clazz );
  }
}

изменение тест:

@RunWith(JUnit4ClassRunner.class)
@ContextConfiguration
@TransactionConfiguration
@Transactional
public class LmpDaoImplTest extends AbstractTransactionalJUnit4SpringContextTests {
...

теперь log4j настроен перед вызовом Spring test runner.


, потому что Runner выполняет запуски до инициализации Log4J.