我正在嘗試測驗一個具有@ConfigurationProperties注釋但不加載整個彈簧背景關系的類。我嘗試只使用 JUnit5 的功能來做到這一點,但直到現在還沒有成功。
我正在使用spring-boot-starter-parentv2.6.2 。
我正在測驗的課程:
@ConfigurationProperties("db.mongo")
@AllArgsConstructor
@NoArgsConstructor
@Getter
@Setter
public class MongoProperties {
private String host;
private String db;
private String user;
private String password;
}
應用程式.yaml :
db:
mongo:
host: localhost
db: test
user: test-user
password: secret
我的測驗課:
@ExtendWith(SpringExtension.class)
@EnableConfigurationProperties({MongoProperties.class})
public class MongoPropertiesTest {
@Autowired
private MongoProperties properties;
@Test
public void mongoPropertiesLoadedTest(){
assertNotNull(properties.getDb());
assertNotNull(properties.getHost());
assertNotNull(properties.getPassword());
assertNotNull(properties.getUser());
}
}
該MongoPropertiesbean被成功注入,但所有的值內是空,并且斷言失敗。
添加@SpringBootTest解決了 bean 實體中的空值問題,但它也啟動了我不想要的整個 spring 背景關系。
uj5u.com熱心網友回復:
但是 using@ExtendWith(SpringExtension.class)也會啟動 spring 背景關系。不同之處在于它以傳統方式啟動背景關系,但@SpringBootTest以 spring-boot 方式啟動它。所以無論你使用哪一個,它仍然需要啟動 spring 背景關系。
如果您關心的是在使用時最小化需要加載到 spring 背景關系中的 bean 的數量@SpringBootTest,您實際上可以配置@Configuration如下所示的指定,因為默認情況下@SpringBootTest將加載應用程式中定義的所有 bean,這可能對測驗來說太多(參見詳情請參閱):
@SpringBootTest
public class MongoPropertiesTest {
@Autowired
private MongoProperties properties;
@Configuration
@EnableConfigurationProperties({MongoProperties.class})
public static class Config {
}
}
如果您真的只想使用@ExtendWith(SpringExtension.class),您將失去 spring-boot 功能,例如外部化配置功能,這會導致您無法從檔案application.properties加載屬性,也無法支持從YAML檔案加載屬性等。您必須手動配置ConfigDataApplicationContextInitializer以啟用這些功能:
@ExtendWith(SpringExtension.class)
@ContextConfiguration(initializers = ConfigDataApplicationContextInitializer.class)
public class MongoPropertiesTest {
@Autowired
private MongoProperties properties;
@Configuration
@EnableConfigurationProperties({MongoProperties.class})
public static class Config {
}
}
您可以考慮進一步使用@SpringJUnitConfigcombine@ExtendWith(SpringExtension.class)和@ContextConfigurationtogether 這給您:
@SpringJUnitConfig(initializers = ConfigDataApplicationContextInitializer.class)
public class MongoPropertiesTest {
@Autowired
private MongoProperties properties;
@Configuration
@EnableConfigurationProperties({MongoProperties.class})
public static class Config {
}
}
實際上這兩種方法在速度方面沒有太大區別,所以我更喜歡只是@SpringBootTest為了簡單起見,因為它不需要你配置ConfigDataApplicationContextInitializer。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/419984.html
標籤:
