当前位置: 首页 > article >正文

如何创建自己的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-autoconfigure和spring-boot-starter依赖

<dependencies>
      <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter</artifactId>
      </dependency>
      <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-autoconfigure</artifactId>
      </dependency>
  </dependencies>

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

@Configuration
  @ConditionalOnClass(MyFeature.class)
  @ConditionalOnProperty(prefix = "myfeature", name = "enabled", matchIfMissing = true)
  public class MyFeatureAutoConfiguration {
      @Bean
      @ConditionalOnMissingBean
      public MyFeature myFeature() {
          return new MyFeature();
      }
  }

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

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

 

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

  注意:Spring Boot 2.7开始,不再推荐使用spring.factories,而是改用/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports,文件内容直接放需要自动加载配置类路径即可。

  验证测试

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

  创建单元测试

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

 @SpringBootTest(classes = TestApplication.class)
  public class MyStarterAutoConfigurationTest {
      @Autowired(required = false)
      private MyService myService;
      @Test
      public void testMyServiceAutoConfigured() {
          assertNotNull(myService, "MyService should be auto-configured");
      }
  }

 

 覆盖不同的配置

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

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

 @SpringBootTest(properties = "my.starter.custom-property=customValue")
  public class MyStarterPropertiesTest {
      @Value("${my.starter.custom-property}")
      private String customProperty;
      @Test
      public void testPropertyOverride() {
          assertEquals("customValue", customProperty, "Custom property should be overridden by @SpringBootTest");
      }
  }

覆盖@Conditional的不同分支

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

  比如下面这样:

@SpringBootTest(classes = {TestApplication.class, MyConditionalConfiguration.class})
  @ConditionalOnProperty(name = "my.starter.enable", havingValue = "true")
  public class MyStarterConditionalTest {
      @Autowired
      private ApplicationContext context;
      @Test
      public void conditionalBeanNotLoadedWhenPropertyIsFalse() {
          assertFalse(
              context.containsBean("conditionalBean"),
              "Conditional bean should not be loaded when 'my.starter.enable' is false"
          );
      }
  }

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

 

感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!有需要的小伙伴可以点击下方小卡片领取   


http://www.kler.cn/a/297220.html

相关文章:

  • 决策树 (Decision Trees)
  • rust 命令
  • 【高阶数据结构】二叉树的创建、存储方式(顺序与链式)、遍历方法(递归与非递归)(精美图解+完整代码)
  • 内存取证隐写
  • 运维学习————Jenkins(1)
  • 【Go - 函数 参数缺省/默认值】
  • Flink 配置文件的深度解读
  • C#从入门到精通(22)—Path类的使用
  • Socket编程 (连接,发送消息) (Tcp、Udp) - Part1
  • 电商平台如何合法地实现多商户分账功能
  • 微课录制技巧|高效录制微课的方法,如何高效录制微课?
  • 前端基础面试题·第三篇——JavaScript(其三)
  • sysbench下载与交叉编译
  • transforemr网络理解
  • 讲座笔记1
  • python_openCV_计算图片中的区域的黑色比例
  • 数据库课程 CMU15-445 2023 Fall Project-0 项目记录
  • Linux网络:应用层协议http/https
  • Flutter动画—涟漪效果
  • HTTP 协议的工作过程