Tout à coup, cela continue pendant un test JUnit. Tout fonctionnait bien, j'ai écrit de nouveaux tests et cette erreur est survenue. Si je le retourne, il ne partira pas. Pourquoi donc?
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.
Les nouveaux tests que vous avez écrits (directement ou indirectement) utilisent les classes qui se connectent à l'aide de Log4j .
Log4J doit être configuré pour que cette journalisation fonctionne correctement.
Placez un fichier log4j.properties (ou log4j.xml) dans la racine de votre chemin de classe de test .
Il devrait avoir une configuration de base telle que
# Set root logger level to DEBUG and its only appender to A1.
log4j.rootLogger=DEBUG, A1
# A1 is set to be a ConsoleAppender.
log4j.appender.A1=org.Apache.log4j.ConsoleAppender
# A1 uses PatternLayout.
log4j.appender.A1.layout=org.Apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n
# An alternative logging format:
# log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1} - %m%n
Un appender renvoie la console par défaut, mais vous pouvez également définir explicitement la cible de la manière suivante:
log4j.appender.A1.Target=System.out
Cela redirigera toutes les sorties au format Nice vers la console. Plus d'informations peuvent être trouvées ici dans le manuel Log4J ,
Log4J Logging sera alors correctement configuré et cet avertissement disparaîtra.
Si vous ne voulez pas vous embêter avec un fichier, vous pouvez faire quelque chose comme ceci dans votre code:
static
{
Logger rootLogger = Logger.getRootLogger();
rootLogger.setLevel(Level.INFO);
rootLogger.addAppender(new ConsoleAppender(
new PatternLayout("%-6r [%p] %c - %m%n")));
}
Ajoutez un fichier log4j.properties (log4j.xml) avec au moins un appender à la racine de votre chemin de classe.
Le contenu du fichier (log4j.properties) peut être aussi simple que
log4j.rootLogger=WARN,A1
# A1 is set to be a ConsoleAppender.
log4j.appender.A1=org.Apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.Apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%d{ISO8601} [%t] %-5p %c %x - %m%n
Cela activera la journalisation log4j avec le niveau de journalisation par défaut comme WARN
et utilisera la console Java pour consigner les messages.
J'ai le log4j.properties configuré correctement. Ce n'est pas le problème. Après un certain temps, j'ai découvert que le problème était lié à Eclipse IDE), qui comportait une ancienne version dans "cache" et n'en avait pas créé une nouvelle (problème de dépendance Maven). Je devais construire le projet manuellement et maintenant cela fonctionne.
J'utilisais Maven dans Eclipse et je ne voulais pas avoir une copie supplémentaire du fichier de propriétés dans le dossier racine. Vous pouvez effectuer les opérations suivantes dans Eclipse:
Parce que je n'aime pas avoir les fichiers en double (log4j.properties dans test et main) et que j'ai plusieurs classes de test, chacune s'exécute avec la classe SpringJUnit4ClassRunner, je dois donc la personnaliser. C'est ce que j'utilise :
import Java.io.FileNotFoundException;
import org.junit.runners.model.InitializationError;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.util.Log4jConfigurer;
public class MySpringJUnit4ClassRunner extends SpringJUnit4ClassRunner {
static {
String log4jLocation = "classpath:log4j-oops.properties";
try {
Log4jConfigurer.initLogging(log4jLocation);
} catch (FileNotFoundException ex) {
System.err.println("Cannot Initialize log4j at location: " + log4jLocation);
}
}
public MySpringJUnit4ClassRunner(Class<?> clazz) throws InitializationError {
super(clazz);
}
}
Lorsque vous l'utilisez, remplacez SpringJUnit4ClassRunner par MySpringJUnit4ClassRunner
@RunWith(MySpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:conf/applicationContext.xml")
public class TestOrderController {
private Logger LOG = LoggerFactory.getLogger(this.getClass());
private MockMvc mockMvc;
...
}
Je sais que c'est vieux, mais j'avais aussi des problèmes. Pour Spring 3 utilisant Maven et Eclipse, je devais mettre le fichier log4j.xml dans src/test/resources pour que le test unitaire se connecte correctement. Placer dans la racine du test n'a pas fonctionné pour moi. Espérons que cela aide les autres.