Spring Boot Unit Test ignores logging.level

Spring BootLoggingLogback

Spring Boot Problem Overview


One of my maven module ignores my logging levels when running tests.

In src/test/resources I have application.properties:

app.name=bbsng-import-backend
app.description=Import Backend Module for Application
spring.profiles.active=test

# LOGGING
logging.level.root=error
logging.level.org.springframework.core =fatal
logging.level.org.springframework.beans=fatal
logging.level.org.springframework.context=fatal
logging.level.org.springframework.transaction=error
logging.level.org.springframework.test=error
logging.level.org.springframework.web=error
logging.level.org.hibernate=ERROR

I also tried application-test.properties.

My Application logs a lot, especially when loading context. I tried logback.xml, logback-test.xml and logback-spring.xml but nothing helps.

My pom:

<parent>
	<groupId>at.company.bbsng</groupId>
	<artifactId>bbsng-import</artifactId>
	<version>0.1.0-SNAPSHOT</version>
</parent>

<artifactId>bbsng-import-backend</artifactId>
<name>bbsng-import-backend</name>

<properties>
	<start-class>at.company.bbsng.dataimport.ApplicationImportBackend</start-class>
</properties>


<dependencies>

	<!-- APPLICATION ... -->
	<dependency>
		<groupId>at.company.bbsng</groupId>
		<artifactId>bbsng-app-domain</artifactId>
		<scope>test</scope>
	</dependency>

	<!-- SPRING ... -->
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-batch</artifactId>
	</dependency>
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-test</artifactId>
		<scope>test</scope>
	</dependency>
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-data-jpa</artifactId>
		<scope>test</scope>
	</dependency>

	<!-- JAVAX ... -->
	   ...

    <!-- COMMONS ... -->
       ...

	<!-- LOMBOK ... -->
       ...

	<!-- DB -->
       ...

</dependencies>

<build>
	<plugins>
		<plugin>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-maven-plugin</artifactId>
			<version>${org.springframework.boot-version}</version>
			<executions>
				<execution>
					<goals>
						<goal>repackage</goal>
					</goals>
				</execution>
			</executions>
		</plugin>
	</plugins>
</build>

One simple Test class:

@ContextConfiguration(classes = { ApplicationImportBackend.class })
@RunWith(SpringJUnit4ClassRunner.class)
@ActiveProfiles({ "test" })
public class BatchJobConfigurationTests {

    @Autowired
    private JobLauncher jobLauncher;

    @Test
    public void testSimpleProperties() throws Exception {
        assertNotNull(jobLauncher);
    }

}

Application logs is in DEBUG Mode.

And yes, the application.properties will be loaded. I already tried to break the application by wrong config.

Thank you for any hints.

Spring Boot Solutions


Solution 1 - Spring Boot

Okay what I did now, in all modules I configured as follows:

src/main/resources:
I use logging configuration in application.properies like logging.level.* as described in the question.

src/test/resources:
I use logback-test.xml like:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <include resource="org/springframework/boot/logging/logback/base.xml" />
    <logger name="*.myapp" level="error" />
    <logger name="org.springframework.core " level="error" />
    <logger name="org.springframework.beans" level="error" />
    <logger name="org.springframework.context" level="error" />
    <logger name="org.springframework.transaction" level="error" />
    <logger name="org.springframework.web" level="error" />
    <logger name="org.springframework.test" level="error" />
    <logger name="org.hibernate" level="error" />
</configuration>

But I still don't understand, why in few modules I could use application.properties, but in another module it ignores ... But for now it works for me as it is.

But maybe few hints with background knowledge are still welcome.

I dont mark my answer as solution, cos it still feels like a workaround.

Solution 2 - Spring Boot

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <include resource="org/springframework/boot/logging/logback/base.xml" />
    <logger name="org.springframework" level="INFO"/>
</configuration>

As a fast fix, I put logback.xml file with the above content in src/test/resources and it works.

Solution 3 - Spring Boot

To enable application.properties need to add an annotation @SpringBootTest to test class, read more here.

Solution 4 - Spring Boot

I'm also looking for a solution to that, meanwhile I'm using the following solution:

this isn't the best but it works

@BeforeClass
public static void setErrorLogging() {
   LoggingSystem.get(ClassLoader.getSystemClassLoader()).setLogLevel(Logger.ROOT_LOGGER_NAME, LogLevel.ERROR);
}

LoggingSystem: a common abstraction over logging systems.

->

get: Detect and return the logging system in use. Supports Logback and Java Logging

setLogLevel: Sets the logging level for a given logger.

Make sure to change back log level for all other test classes.

Hope it helps you, goodluck

Solution 5 - Spring Boot

If your tests are annotated with @DataJpaTest you can switch Hibernate SQL logging off with:

@DataJpaTest(showSql=false)
public class MyTest {
  ..
}

Solution 6 - Spring Boot

Try this:

@ContextConfiguration(classes = ApplicationImportBackend.class, 
    initializers = ConfigFileApplicationContextInitializer.class)
@RunWith(SpringJUnit4ClassRunner.class)
@ActiveProfiles({ "test" })
public class BatchJobConfigurationTests {
    //...
}

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionMichael HegnerView Question on Stackoverflow
Solution 1 - Spring BootMichael HegnerView Answer on Stackoverflow
Solution 2 - Spring BootdnocodeView Answer on Stackoverflow
Solution 3 - Spring BootksandrView Answer on Stackoverflow
Solution 4 - Spring BootIdanView Answer on Stackoverflow
Solution 5 - Spring Bootuı6ʎɹnɯ ꞁəıuɐpView Answer on Stackoverflow
Solution 6 - Spring BootluboskrnacView Answer on Stackoverflow