• 如何创建自己的Spring Boot Starter并为其编写单元测试


    当我们想要封装一些自定义功能给别人使用的时候,创建Spring Boot Starter的形式是最好的实现方式。如果您还不会构建自己的Spring Boot Starter的话,本文将带你一起创建一个自己的Spring Boot Starter。

    快速入门

    1. 创建一个新的 Maven 项目。第三方封装的命名格式是 xxx-spring-boot-starter ,例如:didispace-spring-boot-starter

    2. 编辑pom.xml,添加spring-boot-autoconfigurespring-boot-starter依赖

    1. <dependencies>
    2. <dependency>
    3. <groupId>org.springframework.boot</groupId>
    4. <artifactId>spring-boot-starter</artifactId>
    5. </dependency>
    6. <dependency>
    7. <groupId>org.springframework.boot</groupId>
    8. <artifactId>spring-boot-autoconfigure</artifactId>
    9. </dependency>
    10. </dependencies>

    1. 创建一个用 @Configuration 注释的配置类,在这里您可以使用@Bean来创建使用@ConditionalOnClass@ConditionalOnMissingBean等条件注释来控制何时应用配置。

    1. @Configuration
    2. @ConditionalOnClass(MyFeature.class)
    3. @ConditionalOnProperty(prefix = "myfeature", name = "enabled", matchIfMissing = true)
    4. public class MyFeatureAutoConfiguration {
    5. @Bean
    6. @ConditionalOnMissingBean
    7. public MyFeature myFeature() {
    8. return new MyFeature();
    9. }
    10. }

    1. src/main/resources/META-INF目录下创建spring.factories文件,并在org.springframework.boot.autoconfigure.EnableAutoConfiguration关键字下列出您的自动配置类,比如:

    1. org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
    2. com.didispace.myfeature.MyFeatureAutoConfiguration

    该配置的作用是让Spring Boot应用在引入您自定义Starter的时候可以自动这里的配置类。

    注意:Spring Boot 2.7开始,不再推荐使用spring.factories,而是改用/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports,文件内容直接放需要自动加载配置类路径即可。这个变更具体可见之前的这篇文章:《Spring Boot 2.7开始spring.factories不推荐使用了》

    验证测试

    在制作Spring Boot Starter的时候,一定记得使用单元测试来验证和确保自动化配置类在任何条件逻辑在启动器下能够按照正确的预期运行。

    创建单元测试

    使用@SpringBootTest加载完整的应用程序上下文,并验证启动程序是否正确配置了 Bean 和属性。

    1. @SpringBootTest(classes = TestApplication.class)
    2. public class MyStarterAutoConfigurationTest {
    3. @Autowired(required = false)
    4. private MyService myService;
    5. @Test
    6. public void testMyServiceAutoConfigured() {
    7. assertNotNull(myService, "MyService should be auto-configured");
    8. }
    9. }

    覆盖不同的配置

    如果有不同的配置方案,那么还需要使用@TestPropertySource@DynamicPropertySource覆盖属性以测试不同配置下的情况。

    或者也可以直接简单的通过@SpringBootTest中的属性来配置,比如下面这样:

    1. @SpringBootTest(properties = "my.starter.custom-property=customValue")
    2. public class MyStarterPropertiesTest {
    3. @Value("${my.starter.custom-property}")
    4. private String customProperty;
    5. @Test
    6. public void testPropertyOverride() {
    7. assertEquals("customValue", customProperty, "Custom property should be overridden by @SpringBootTest");
    8. }
    9. }

    覆盖@Conditional的不同分支

    如果您的启动器包含条件配置,比如:@ConditionalOnProperty@ConditionalOnClass等注解,那么就必须编写测试来覆盖所有条件以验证是否已正确。

    比如下面这样:

    1. @SpringBootTest(classes = {TestApplication.class, MyConditionalConfiguration.class})
    2. @ConditionalOnProperty(name = "my.starter.enable", havingValue = "true")
    3. public class MyStarterConditionalTest {
    4. @Autowired
    5. private ApplicationContext context;
    6. @Test
    7. public void conditionalBeanNotLoadedWhenPropertyIsFalse() {
    8. assertFalse(
    9. context.containsBean("conditionalBean"),
    10. "Conditional bean should not be loaded when 'my.starter.enable' is false"
    11. );
    12. }
    13. }

    为了覆盖不同的条件分支,我们通常还需要使用@TestConfiguration注解来有选择地启用或禁用某些自动配置

    小结

    本文介绍了两个Spring Boot的进阶内容:

    1. 如何创建 Spring Boot Starter

    2. 如何为 Spring Boot Starter 提供单元测试

    文章转载自:程序猿DD

    原文链接:https://www.cnblogs.com/didispace/p/18037231

    体验地址:引迈 - JNPF快速开发平台_低代码开发平台_零代码开发平台_流程设计器_表单引擎_工作流引擎_软件架构

  • 相关阅读:
    【JAVA基础】【查漏补缺】01 - 运算符
    使用python编写脚本测试目标主机的TCP端口连通性
    机器学习-模型评估与选择
    新品发布!OPT 3D激光轮廓扫描仪产品阵容再升级
    IM即时通讯开发如何实现Android版智能心跳机制
    【GD32F427开发板试用】OpenWSN无线协议栈移植与CPS系统搭建
    ZYNQ之路--程序固化教程
    【论文】基于Hadoop的铁路货运大数据平台设计与应用
    Android混淆笔记
    低代码与AI:构建面向未来的智能化应用
  • 原文地址:https://blog.csdn.net/sdgfafg_25/article/details/136348673