@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 {
}