3

在 SpringBoot (2.2.1,2.2.2) 应用程序中,切片的 @DataJpaTest 不会运行,因为无法创建持有 @ConfigurationProperties 的 bean。

考试:

@DataJpaTest
public class FooCustomerServiceTest
{
    @Autowired
    FooCustomerRepository repo;

    @Test
    void findAll()
    {
       repo.findAll();
    }
}

当我尝试运行测试时,我得到一个

没有可用的“foo.appconfig.AppInfoConfig”类型的合格 bean

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类,它就不是很方便。

4

2 回答 2

6

为什么你有@ComponentScan你的SpringBootApplication?这样做会覆盖应用在其上的配置,包括在切片测试中自定义类路径扫描的过滤器。

有关更多详细信息,请参阅文档

于 2019-12-10T07:29:19.967 回答
0

我分享一下我的经历。

我的问题与 OP 解释的完全一样,而且问题的原因也与接受的答案相同。

但在我的情况下, The@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类中导入它。

@Import(MyDataJpaTestConfiguration.class)
@DataJpaTest
abstract class MyEntityDataJpaTest {
}
于 2021-05-25T11:45:17.143 回答