在Chapter 1: 基本用法 - 使用Spring Boot Testing工具裏提到:
除了單元測試(不需要初始化ApplicationContext的測試)外,儘量將測試配置和生產配置保持一致。比如如果生產配置裏啓用了AutoConfiguration,那麼測試配置也應該啓用。因爲只有這樣才能夠在測試環境下發現生產環境的問題,也避免出現一些因爲配置不同導致的奇怪問題。
那麼當我們想在測試代碼裏關閉Auto Configuration如何處理?
- 方法1:提供另一套測試配置
- 方法2:使用
@OverrideAutoConfiguration
方法1雖然能夠很好的解決問題,但是比較麻煩。而方法2則能夠不改變原有配置、不提供新的配置的情況下,就能夠關閉Auto Configuration。
在本章節的例子裏,我們自己做了一個Auto Configuration類,AutoConfigurationEnableLogger:
@Configuration
public class AutoConfigurationEnableLogger {
private static final Logger LOGGER = LoggerFactory.getLogger(AutoConfigurationEnableLogger.class);
public AutoConfigurationEnableLogger() {
LOGGER.info("Auto Configuration Enabled");
}
}
並且在META-INF/spring.factories
裏註冊了它:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
me.chanjar.annotation.overrideac.AutoConfigurationEnableLogger
這樣一來,只要Spring Boot啓動了Auto Configuration就會打印出日誌:
2017-08-24 16:44:52.789 INFO 13212 --- [ main] m.c.a.o.AutoConfigurationEnableLogger : Auto Configuration Enabled
例子1:未關閉Auto Configuration
源代碼見BootTest:
@SpringBootTest
@SpringBootApplication
public class BootTest extends AbstractTestNGSpringContextTests {
@Test
public void testName() throws Exception {
}
}
查看輸出的日誌,會發現Auto Configuration已經啓用。
例子2:關閉Auto Configuration
然後我們用@OverrideAutoConfiguration關閉了Auto Configuration。
源代碼見BootTest:
@SpringBootTest
@OverrideAutoConfiguration(enabled = false)
@SpringBootApplication
public class BootTest extends AbstractTestNGSpringContextTests {
@Test
public void testName() throws Exception {
}
}
再查看輸出的日誌,就會發現Auto Configuration已經關閉。
參考文檔
- Spring Framework Testing
- Spring Boot Testing
- [Context configuration with test property sources][doc-test-property-source]