Log4j в тестовом примере JUnit - PullRequest
       24

Log4j в тестовом примере JUnit

6 голосов
/ 25 ноября 2011

У меня есть bean-компонент Spring, в котором есть член 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.properties, то есть он работает нормально.Почему log4j дает мне такие предупреждения?

Ответы [ 3 ]

11 голосов
/ 25 июня 2012

Я хотел, чтобы в моей конфигурации 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 Runner.

5 голосов
/ 26 ноября 2011

Я думаю, причина в том, что этот код в 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.properties в путь к классу приложения,В случае, если вы используете структуру каталогов maven, добавьте файл log4j.properties в (src / main / resources), что исключит предупреждение.

2 голосов
/ 25 ноября 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...