@DataJpaTest:如何停止加载不需要的@ConfigurationProperties
@DataJpaTest: how to stop loading unneeded @ConfigurationProperties
在 SpringBoot (2.2.1,2.2.2) 应用程序中,切片的 @DataJpaTest 不会 运行 因为无法创建持有 @ConfigurationProperties 的 bean。
测试:
@DataJpaTest
public class FooCustomerServiceTest
{
@Autowired
FooCustomerRepository repo;
@Test
void findAll()
{
repo.findAll();
}
}
当我尝试 运行 测试时,我得到
No qualifying bean of type 'foo.appconfig.AppInfoConfig' available
foo.appconfig.AppInfoConfig
@ConfigurationProperties(prefix = "app.info")
public class AppInfoConfig
{
private String name;
...
}
被一个@Component
引用,与测试无关。
使用的foo.Application
没有特殊注解
@SpringBootApplication
@ComponentScan
@ConfigurationPropertiesScan
public class Application
{
public static void main( final String[] args )
{
SpringApplication.run( Application.class, args );
}
}
由于切片测试仅扫描某些组件(@DataJpaTest 中的@Entity 和@Repository)'AppInfoConfig' 未被扫描。没关系,但为什么它试图被注入到另一个既不是实体也不是存储库的控制器?
如何启用 AppInfoConfig 的正确创建或完全禁用创建?
注意:@TestConfiguration
有一个 @Bean
方法确实有效,但如果你有很多这样的方法就不是很方便了 @ConfigurationProperties
类.
为什么你的 SpringBootApplication
上有 @ComponentScan
?这样做会覆盖应用于它的配置,包括在切片测试中自定义类路径扫描的过滤器。
有关详细信息,请参阅 the documentation。
我正在分享我的经历。
我的问题和OP解释的一模一样,而且问题的原因也和接受的答案一样。
但在我的例子中,@ComponentScan
是必需的,因为应用程序需要扫描应用程序包外的组件。
@ComponentScan(
basePackageClasses = {
Application.class, // this application
some.other.NoOp.class // resides in a dependency
}
)
@SpringBootApplication
class MyApplication {
}
我花了好几个小时 @DataJpaTest
甚至偷看了这个帖子。
我的解决方案是使用自定义上下文替换主应用程序。
@EnableAutoConfiguration
@SpringBootConfiguration
@Slf4j
class MyDataJpaTestConfiguration {
}
并从 @DataJpaTest
class.
导入它
@Import(MyDataJpaTestConfiguration.class)
@DataJpaTest
abstract class MyEntityDataJpaTest {
}
在 SpringBoot (2.2.1,2.2.2) 应用程序中,切片的 @DataJpaTest 不会 运行 因为无法创建持有 @ConfigurationProperties 的 bean。
测试:
@DataJpaTest
public class FooCustomerServiceTest
{
@Autowired
FooCustomerRepository repo;
@Test
void findAll()
{
repo.findAll();
}
}
当我尝试 运行 测试时,我得到
No qualifying bean of type 'foo.appconfig.AppInfoConfig' available
foo.appconfig.AppInfoConfig
@ConfigurationProperties(prefix = "app.info")
public class AppInfoConfig
{
private String name;
...
}
被一个@Component
引用,与测试无关。
使用的foo.Application
没有特殊注解
@SpringBootApplication
@ComponentScan
@ConfigurationPropertiesScan
public class Application
{
public static void main( final String[] args )
{
SpringApplication.run( Application.class, args );
}
}
由于切片测试仅扫描某些组件(@DataJpaTest 中的@Entity 和@Repository)'AppInfoConfig' 未被扫描。没关系,但为什么它试图被注入到另一个既不是实体也不是存储库的控制器?
如何启用 AppInfoConfig 的正确创建或完全禁用创建?
注意:@TestConfiguration
有一个 @Bean
方法确实有效,但如果你有很多这样的方法就不是很方便了 @ConfigurationProperties
类.
为什么你的 SpringBootApplication
上有 @ComponentScan
?这样做会覆盖应用于它的配置,包括在切片测试中自定义类路径扫描的过滤器。
有关详细信息,请参阅 the documentation。
我正在分享我的经历。
我的问题和OP解释的一模一样,而且问题的原因也和接受的答案一样。
但在我的例子中,@ComponentScan
是必需的,因为应用程序需要扫描应用程序包外的组件。
@ComponentScan(
basePackageClasses = {
Application.class, // this application
some.other.NoOp.class // resides in a dependency
}
)
@SpringBootApplication
class MyApplication {
}
我花了好几个小时 @DataJpaTest
甚至偷看了这个帖子。
我的解决方案是使用自定义上下文替换主应用程序。
@EnableAutoConfiguration
@SpringBootConfiguration
@Slf4j
class MyDataJpaTestConfiguration {
}
并从 @DataJpaTest
class.
@Import(MyDataJpaTestConfiguration.class)
@DataJpaTest
abstract class MyEntityDataJpaTest {
}