如何正确模块化应用程序配置,以使测试IT,datajpa,...不会获取用于生产的所有内容

问题描述

在我们的应用程序中,我发现集成测试收集了比我想要的更多的东西。我想知道结构化的应用程序配置的样子如何,您使用什么,这样我就可以@Import仅在生产中使用那些需要的配置。

我认为文档中的相关页面是: https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#boot-features-testing-spring-boot-applications-testing-user-configuration

...在那里强调,以合理的方式构造代码很重要,但是并没有显示太多,那是什么/意味着什么。我了解配置文件,并且可能会创建在测试中无法匹配的配置文件并手动导入,但这可能不是他们所说的那样明智。

考虑以下主要入口点:

@SpringBootApplication
public class DemoApplication {

    private final SomeService someService;

    public DemoApplication(SomeService someService) {
        this.someService = someService;
    }

    @EventListener(ApplicationReadyEvent.class)
    public void started() {
        System.out.println(someService.doIt());
    }

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class,args);
    }
}

某些服务的界面:

public interface SomeService {
    public String doIt();
}

和配置:

@Configuration
public class Config {
    @Bean
    public SomeService createSomeServiceBean() {
        return new SomeService() {
            @Override
            public String doIt() {
                return String.format("Hi! (At %s)",LocalDateTime.now());
            }
        };
    }
}

在调用时,由@SpringBootApplication注释的入口点将进行组件扫描,将发现配置并且它将起作用。进一步阅读文档,我们会发现以下句子:Test slices exclude @Configuration classes from scanning([[如果@ComponentScan确实具有basePackages和basePackagesClasses的默认值]),但是可以通过以下测试:

@SpringBootTest
class DemoApplicationTests {

    @Autowired
    private SomeService someService;

    @Test
    void contextLoads() {
        System.out.println(someService.doIt());
    }
}

很高兴发现定义的SomeService bean。还是那句话意味着仅仅由@DataJpaTest注释的测试将不会注册某些配置? Kinda对我不清楚,但似乎不可能,因为@DataJpaTest会知道如何省略哪些配置,哪些不知道。

同样,我知道如何使用配置文件/排除配置。我在问“构建应用程序的明智方法”。

如何合理构造应用程序以及如何对其进行配置,以便:

  • @SpringBootApplication带注释的入口点将为生产进行组件扫描,查找和使用配置,但是这些配置需要在测试中手动导入吗?
  • 将自动扫描某些软件包的配置,以用于开发和测试环境。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)